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();
}
}
}
|