فهرست منبع

Unrolled rayIntersection for performance

Clement Espeute 1 سال پیش
والد
کامیت
0fbb821af5
1فایلهای تغییر یافته به همراه52 افزوده شده و 51 حذف شده
  1. 52 51
      h3d/col/OrientedBounds.hx

+ 52 - 51
h3d/col/OrientedBounds.hx

@@ -165,74 +165,75 @@ class OrientedBounds extends Collider {
 		var dy = r.py - centerY;
 		var dz = r.pz - centerZ;
 
-		var rox = dx * xx + dy * xy + dz * xz;
-		var roy = dx * yx + dy * yy + dz * yz;
-		var roz = dx * zx + dy * zy + dz * zz;
+		var rpx = dx * xx + dy * xy + dz * xz;
+		var rpy = dx * yx + dy * yy + dz * yz;
+		var rpz = dx * zx + dy * zy + dz * zz;
 
 		var rlx = r.lx * xx + r.ly * xy + r.lz * xz;
 		var rly = r.lx * yx + r.ly * yy + r.lz * yz;
 		var rlz = r.lx * zx + r.ly * zy + r.lz * zz;
 
-		inline function half(i:Int) {
-			return switch(i) {
-				case 0:
-					hx;
-				case 1:
-					hy;
-				case 2:
-					hz;
-				default: throw "unreachable";
-			}
-		}
+		var tmin = 0.0;
+		var tmax = 100000000.0;
 
-		inline function o(i:Int) {
-			return switch(i) {
-				case 0:
-					rox;
-				case 1:
-					roy;
-				case 2:
-					roz;
-				default: throw "unreachable";
+		if (hxd.Math.abs(rlx) < hxd.Math.EPSILON) {
+			if (rpx < -hx || rpx > hx) return -1.0;
+		} else {
+			var ood = 1.0 / rlx;
+			var t1 = (-hx - rpx) * ood;
+			var t2 = (hx - rpx) * ood;
+
+			if (t1 > t2) {
+				var tmp = t2;
+				t2 = t1;
+				t1 = tmp;
 			}
+
+			if (t1 > tmin) tmin = t1;
+			if (t2 < tmax) tmax = t2;
+
+			if (tmin > tmax) return -1.0;
 		}
 
-		inline function l(i:Int) {
-			return switch(i) {
-				case 0:
-					rlx;
-				case 1:
-					rly;
-				case 2:
-					rlz;
-				default: throw "unreachable";
+		if (hxd.Math.abs(rly) < hxd.Math.EPSILON) {
+			if (rpy < -hy || rpy > hy) return -1.0;
+		} else {
+			var ood = 1.0 / rly;
+			var t1 = (-hy - rpy) * ood;
+			var t2 = (hy - rpy) * ood;
+
+			if (t1 > t2) {
+				var tmp = t2;
+				t2 = t1;
+				t1 = tmp;
 			}
-		}
 
-		var tmin = 0.0;
-		var tmax = 100000000.0;
+			if (t1 > tmin) tmin = t1;
+			if (t2 < tmax) tmax = t2;
 
-		for (i in 0...3) {
-			if (hxd.Math.abs(l(i)) < hxd.Math.EPSILON) {
-				if (o(i) < -half(i) || o(i) > half(i)) return -1.0;
-			} else {
-				var ood = 1.0 / l(i);
-				var t1 = (-half(i) - o(i)) * ood;
-				var t2 = (half(i) - o(i)) * ood;
+			if (tmin > tmax) return -1.0;
+		}
 
-				if (t1 > t2) {
-					var tmp = t2;
-					t2 = t1;
-					t1 = tmp;
-				}
+		if (hxd.Math.abs(rlz) < hxd.Math.EPSILON) {
+			if (rpz < -hz || rpz > hz) return -1.0;
+		} else {
+			var ood = 1.0 / rlz;
+			var t1 = (-hz - rpz) * ood;
+			var t2 = (hz - rpz) * ood;
+
+			if (t1 > t2) {
+				var tmp = t2;
+				t2 = t1;
+				t1 = tmp;
+			}
 
-				if (t1 > tmin) tmin = t1;
-				if (t2 < tmax) tmax = t2;
+			if (t1 > tmin) tmin = t1;
+			if (t2 < tmax) tmax = t2;
 
-				if (tmin > tmax) return -1.0;
-			}
+			if (tmin > tmax) return -1.0;
 		}
 
+
 		return tmin;
 	}