소스 검색

added camera distanceToDepth/depthToDistance

Nicolas Cannasse 4 년 전
부모
커밋
5d57ac5aec
2개의 변경된 파일10개의 추가작업 그리고 8개의 파일을 삭제
  1. 8 0
      h3d/Camera.hx
  2. 2 8
      h3d/pass/DirShadowMap.hx

+ 8 - 0
h3d/Camera.hx

@@ -367,6 +367,14 @@ class Camera {
 		return p;
 	}
 
+	public function distanceToDepth( dist : Float ) {
+		return ((zFar + zNear - 2.0 * zNear * zFar / hxd.Math.clamp(dist, zNear, zFar)) / (zFar - zNear) + 1.0) / 2.0;
+	}
+
+	public function depthToDistance( depth : Float ) {
+		return (hxd.Math.clamp(depth, 0, 1) * zFar - zNear * zFar) / (zFar - zNear);
+	}
+
 	public function load( cam : Camera ) {
 		pos.load(cam.pos);
 		target.load(cam.target);

+ 2 - 8
h3d/pass/DirShadowMap.hx

@@ -108,14 +108,8 @@ class DirShadowMap extends Shadows {
 
 			// Intersect with frustum bounds
 			var cameraBounds = new h3d.col.Bounds();
-			var zMax = 1.0;
-			var zMin = 0.0;
-			var n = ctx.camera.zNear;
-			var f = ctx.camera.zFar;
-			if( maxDist > 0 )
-				zMax = ((f + n - 2.0 * n * f / hxd.Math.clamp(maxDist, n, f)) / (f - n) + 1.0) / 2.0;
-			if( minDist > 0 )
-				zMin = ((f + n - 2.0 * n * f /  hxd.Math.clamp(minDist, n, f)) / (f - n) + 1.0) / 2.0;
+			var zMin = minDist < 0 ? 1.0 : ctx.camera.distanceToDepth(minDist);
+			var zMax = maxDist < 0 ? 1.0 : ctx.camera.distanceToDepth(maxDist);
 			for( pt in ctx.camera.getFrustumCorners(zMax, zMin) ) {
 				pt.transform(camera.mcam);
 				cameraBounds.addPos(pt.x, pt.y, pt.z);