68 lines
No EOL
1.9 KiB
Scala
68 lines
No EOL
1.9 KiB
Scala
package codechicken.multipart
|
|
|
|
import codechicken.lib.vec.Cuboid6
|
|
import scala.collection.JavaConversions._
|
|
import java.lang.Iterable
|
|
|
|
/**
|
|
* This suite of 3 classes provides simple functions for standard bounding box based occlusion testing.
|
|
* If any two parts have overlapping bounding boxes, the test fails
|
|
*
|
|
* See TIconHitEffects for notes on the Scala|Java composition setup.
|
|
*/
|
|
object NormalOcclusionTest
|
|
{
|
|
/**
|
|
* Performs the test, returns true if the test fails
|
|
*/
|
|
def apply(boxes1:Traversable[Cuboid6], boxes2:Traversable[Cuboid6]):Boolean =
|
|
boxes1.forall(v1 => boxes2.forall(v2 => !v1.intersects(v2)))
|
|
|
|
/**
|
|
* Performs the test, returns true if the test fails
|
|
*/
|
|
def apply(part1:JNormalOcclusion, part2:TMultiPart):Boolean =
|
|
{
|
|
var boxes = Seq[Cuboid6]()
|
|
if(part2.isInstanceOf[JNormalOcclusion])
|
|
boxes = boxes++part2.asInstanceOf[JNormalOcclusion].getOcclusionBoxes
|
|
|
|
if(part2.isInstanceOf[JPartialOcclusion])
|
|
boxes = boxes++part2.asInstanceOf[JPartialOcclusion].getPartialOcclusionBoxes
|
|
|
|
return NormalOcclusionTest(boxes, part1.getOcclusionBoxes)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Java interface containing callbacks for normal occlusion testing.
|
|
* Make sure to override occlusionTest as in TNormalOcclusion
|
|
*/
|
|
trait JNormalOcclusion
|
|
{
|
|
/**
|
|
* Return a list of normal occlusion boxes
|
|
*/
|
|
def getOcclusionBoxes:Iterable[Cuboid6]
|
|
}
|
|
|
|
/**
|
|
* Trait for scala programmers
|
|
*/
|
|
trait TNormalOcclusion extends TMultiPart with JNormalOcclusion
|
|
{
|
|
override def occlusionTest(npart:TMultiPart):Boolean =
|
|
NormalOcclusionTest(this, npart) && super.occlusionTest(npart)
|
|
}
|
|
|
|
/**
|
|
* Utility part class for performing 3rd party occlusion tests
|
|
*/
|
|
class NormallyOccludedPart(bounds:Iterable[Cuboid6]) extends TMultiPart with TNormalOcclusion
|
|
{
|
|
def this(bound:Cuboid6) = this(Seq(bound))
|
|
|
|
def getType = null
|
|
|
|
def getOcclusionBoxes = bounds
|
|
} |