Forráskód Böngészése

minor improvement on collider and camera ready for directionnal shadows optimizations (coming soon) (#676)

chuck 6 éve
szülő
commit
6c7cc1b0a9
2 módosított fájl, 13 hozzáadás és 6 törlés
  1. 2 2
      h3d/Camera.hx
  2. 11 4
      h3d/col/ObjectCollider.hx

+ 2 - 2
h3d/Camera.hx

@@ -186,10 +186,10 @@ class Camera {
 		frustum.loadMatrix(m);
 	}
 
-	public function getFrustumCorners() : Array<h3d.Vector> {
+	public function getFrustumCorners(zMax=1.) : Array<h3d.Vector> {
 		return [
 			unproject(-1, 1, 0), unproject(1, 1, 0), unproject(1, -1, 0), unproject(-1, -1, 0),
-			unproject(-1, 1, 1), unproject(1, 1, 1), unproject(1, -1, 1), unproject(-1, -1, 1)
+			unproject(-1, 1, zMax), unproject(1, 1, zMax), unproject(1, -1, zMax), unproject(-1, -1, zMax)
 		];
 	}
 

+ 11 - 4
h3d/col/ObjectCollider.hx

@@ -4,7 +4,8 @@ class ObjectCollider implements Collider implements hxd.impl.Serializable {
 
 	@:s public var obj : h3d.scene.Object;
 	@:s public var collider : Collider;
-	var tmpRay = new Ray();
+	static var TMP_RAY = new Ray();
+	static var TMP_MAT = new Matrix();
 
 	public function new(obj, collider) {
 		this.obj = obj;
@@ -12,16 +13,20 @@ class ObjectCollider implements Collider implements hxd.impl.Serializable {
 	}
 
 	public function rayIntersection( r : Ray, bestMatch : Bool ) : Float {
+		var tmpRay = TMP_RAY;
+		TMP_RAY = null;
 		tmpRay.load(r);
 		r.transform(obj.getInvPos());
 		var hit = collider.rayIntersection(r, bestMatch);
 		if( hit < 0 ) {
 			r.load(tmpRay);
+			TMP_RAY = tmpRay;
 			return hit;
 		}
 		var pt = r.getPoint(hit);
 		pt.transform(@:privateAccess obj.absPos);
 		r.load(tmpRay);
+		TMP_RAY = tmpRay;
 		return hxd.Math.distance(pt.x - r.px, pt.y - r.py, pt.z - r.pz);
 	}
 
@@ -34,9 +39,11 @@ class ObjectCollider implements Collider implements hxd.impl.Serializable {
 	}
 
 	public function inFrustum( f : Frustum, ?m : h3d.Matrix ) {
-		if( m != null )
-			throw "Not implemented";
-		return collider.inFrustum(f, obj.getAbsPos());
+		if( m == null )
+			return collider.inFrustum(f, obj.getAbsPos());
+		var mat = TMP_MAT;
+		mat.multiply3x4inline(m, obj.getAbsPos());
+		return collider.inFrustum(f, mat);
 	}
 
 	public function inSphere( s : Sphere ) {