summaryrefslogtreecommitdiff
path: root/NET/worlds/scape/PlaneBumpCalc.java
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-12 22:33:32 -0800
committerFuwn <[email protected]>2026-02-12 22:33:32 -0800
commitc7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch)
treedf9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/scape/PlaneBumpCalc.java
downloadworldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz
worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip
Initial commit
Diffstat (limited to 'NET/worlds/scape/PlaneBumpCalc.java')
-rw-r--r--NET/worlds/scape/PlaneBumpCalc.java65
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();
+ }
+ }
+}