瀏覽代碼

added fromValues, collideFrustum

ncannasse 11 年之前
父節點
當前提交
7dcdb8a90a
共有 1 個文件被更改,包括 37 次插入2 次删除
  1. 37 2
      h3d/col/Ray.hx

+ 37 - 2
h3d/col/Ray.hx

@@ -45,6 +45,31 @@ class Ray {
 			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 {
 		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();
 		r.px = p1.x;
 		r.py = p1.y;
@@ -80,6 +105,16 @@ class Ray {
 		r.lz = p2.z - p1.z;
 		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;
+	}
 	
 }