package NET.worlds.scape; import java.io.IOException; public class PlaneBumpCalc extends BumpCalc { private static Object classCookie = new Object(); @Override public void detectBump(BumpEventTemp b, WObject owner) { WObject source = (WObject)b.source; Point3Temp sourceStart = source.getWorldPosition(); Transform xfrm = owner.getObjectToWorldMatrix(); Point3Temp start = xfrm.getPosition(); Point3Temp right = owner.getPlaneExtent().times(xfrm); Point3Temp d = Point3Temp.make(right).minus(start); xfrm.recycle(); BoundBoxTemp sourceBox = source.getBoundBox(); Point2 corner; if (d.x > 0.0F) { if (d.y > 0.0F) { corner = new Point2(sourceBox.lo.x, sourceBox.hi.y); } else { corner = new Point2(sourceBox.hi.x, sourceBox.hi.y); } } else if (d.y > 0.0F) { corner = new Point2(sourceBox.lo.x, sourceBox.lo.y); } else { corner = new Point2(sourceBox.hi.x, sourceBox.lo.y); } Point2 dn = new Point2(-d.y, d.x).normalize(); corner.x = corner.x - sourceStart.x; corner.y = corner.y - sourceStart.y; float dist = corner.dot(dn); Point3Temp extent = Point3Temp.make(dn.x * dist, dn.y * dist, 0.0F); if (!b.hitRegion(owner, Point3Temp.make(start).minus(extent), d, extent)) { Point3Temp ccwNormal = Point3Temp.make(extent.y, -extent.x, 0.0F); d = Point3Temp.make(ccwNormal).minus(extent); Point3Temp extentL = Point3Temp.make(-d.y, d.x, 0.0F).normalize().times(dist / 1.5F); Point3Temp startL = Point3Temp.make(start).minus(ccwNormal); if (!b.hitRegion(owner, startL, d, extentL)) { if (!b.hitRegion(owner, Point3Temp.make(right).minus(extent), Point3Temp.make(-d.y, d.x, 0.0F), Point3Temp.make(-extentL.y, extentL.x, 0.0F))) { ; } } } } @Override public void saveState(Saver s) throws IOException { s.saveVersion(0, classCookie); super.saveState(s); } @Override public void restoreState(Restorer r) throws IOException, TooNewException { switch (r.restoreVersion(classCookie)) { case 0: super.restoreState(r); return; default: throw new TooNewException(); } } }