summaryrefslogtreecommitdiff
path: root/NET/worlds/scape/PlaneBumpCalc.java
blob: 83fed14fe5e8f5e45cbecb74658eff9347e0ce7c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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();
      }
   }
}