diff options
| author | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
| commit | c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch) | |
| tree | df9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/scape/PlaneBumpCalc.java | |
| download | worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip | |
Initial commit
Diffstat (limited to 'NET/worlds/scape/PlaneBumpCalc.java')
| -rw-r--r-- | NET/worlds/scape/PlaneBumpCalc.java | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/NET/worlds/scape/PlaneBumpCalc.java b/NET/worlds/scape/PlaneBumpCalc.java new file mode 100644 index 0000000..83fed14 --- /dev/null +++ b/NET/worlds/scape/PlaneBumpCalc.java @@ -0,0 +1,65 @@ +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(); + } + } +} |