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 }