|
@@ -45,6 +45,31 @@ class Ray {
|
|
return new Point(px + lx * k, py + ly * k, pz + lz * k);
|
|
return new Point(px + lx * k, py + ly * k, pz + lz * k);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ public inline function collideFrustum( mvp : Matrix ) {
|
|
|
|
+ // transform the two ray points into the normalized frustum box
|
|
|
|
+ var a = new h3d.Vector(px, py, pz);
|
|
|
|
+ a.project(mvp);
|
|
|
|
+ var b = new h3d.Vector(px + lx, py + ly, pz + lz);
|
|
|
|
+ b.project(mvp);
|
|
|
|
+ // use collide on the frustum [-1,1] bounds
|
|
|
|
+ var lx = b.x - a.x;
|
|
|
|
+ var ly = b.y - a.y;
|
|
|
|
+ var lz = b.z - a.z;
|
|
|
|
+
|
|
|
|
+ var dx = 1 / lx;
|
|
|
|
+ var dy = 1 / ly;
|
|
|
|
+ var dz = 1 / lz;
|
|
|
|
+ var t1 = (-1 - a.x) * dx;
|
|
|
|
+ var t2 = (1 - a.x) * dx;
|
|
|
|
+ var t3 = (-1 - a.y) * dy;
|
|
|
|
+ var t4 = (1 - a.y) * dy;
|
|
|
|
+ var t5 = (0 - a.z) * dz;
|
|
|
|
+ var t6 = (1 - a.z) * dz;
|
|
|
|
+ var tmin = Math.max(Math.max(Math.min(t1, t2), Math.min(t3, t4)), Math.min(t5, t6));
|
|
|
|
+ var tmax = Math.min(Math.min(Math.max(t1, t2), Math.max(t3, t4)), Math.max(t5, t6));
|
|
|
|
+ return !(tmax < 0 || tmin > tmax);
|
|
|
|
+ }
|
|
|
|
|
|
public inline function collide( b : Bounds ) : Bool {
|
|
public inline function collide( b : Bounds ) : Bool {
|
|
var dx = 1 / lx;
|
|
var dx = 1 / lx;
|
|
@@ -70,7 +95,7 @@ class Ray {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public static function fromPoints( p1 : Point, p2 : Point ) {
|
|
|
|
|
|
+ public static inline function fromPoints( p1 : Point, p2 : Point ) {
|
|
var r = new Ray();
|
|
var r = new Ray();
|
|
r.px = p1.x;
|
|
r.px = p1.x;
|
|
r.py = p1.y;
|
|
r.py = p1.y;
|
|
@@ -80,6 +105,16 @@ class Ray {
|
|
r.lz = p2.z - p1.z;
|
|
r.lz = p2.z - p1.z;
|
|
return r;
|
|
return r;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ public static inline function fromValues( x, y, z, dx, dy, dz ) {
|
|
|
|
+ var r = new Ray();
|
|
|
|
+ r.px = x;
|
|
|
|
+ r.py = y;
|
|
|
|
+ r.pz = z;
|
|
|
|
+ r.lx = dx;
|
|
|
|
+ r.ly = dy;
|
|
|
|
+ r.lz = dz;
|
|
|
|
+ return r;
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|