Prechádzať zdrojové kódy

Can fully override cascade shadow mapping culling.

clementlandrin 7 mesiacov pred
rodič
commit
68ecf41714
1 zmenil súbory, kde vykonal 13 pridanie a 16 odobranie
  1. 13 16
      h3d/pass/CascadeShadowMap.hx

+ 13 - 16
h3d/pass/CascadeShadowMap.hx

@@ -252,15 +252,18 @@ class CascadeShadowMap extends DirShadowMap {
 		return getCascadeProj(currentCascadeIndex);
 	}
 
-	inline function cullPassesSize( passes : h3d.pass.PassList, frustum : h3d.col.Frustum, minSize : Float ) {
-		passes.filter(function(p) {
-			var mb = Std.downcast(p.obj, h3d.scene.MeshBatch);
-			var col = p.obj.cullingCollider;
-			return if( mb != null && @:privateAccess mb.instanced.primitive.getBounds().dimension() < minSize ) false;
-				else if( col == null ) true;
-				else if ( col.dimension() < minSize ) false;
-				else col.inFrustum(frustum);
-		});
+	public dynamic function customCullPasses(passes : h3d.pass.PassList, frustum : h3d.col.Frustum, i : Int, minSize : Float) {
+		if ( minSize > 0.0 && i > 0 ) {
+			passes.filter(function(p) {
+				var mb = Std.downcast(p.obj, h3d.scene.MeshBatch);
+				var col = p.obj.cullingCollider;
+				return if( mb != null && @:privateAccess mb.instanced.primitive.getBounds().dimension() < minSize ) false;
+					else if( col == null ) true;
+					else if ( col.dimension() < minSize ) false;
+					else col.inFrustum(frustum);
+			});
+		} else
+			cullPasses(passes, function(col) return col.inFrustum(lightCamera.frustum));
 	}
 
 	override function draw( passes, ?sort ) {
@@ -312,15 +315,9 @@ class CascadeShadowMap extends DirShadowMap {
 			var lc = lightCameras[i];
 			var dimension = Math.max(lc.orthoBounds.xMax - lc.orthoBounds.xMin,	lc.orthoBounds.yMax - lc.orthoBounds.yMin);
 			dimension = ( dimension * hxd.Math.clamp(minPixelSize, 0, size) ) / size;
-			// first cascade draw all objects
-			if ( i == 0 )
-				dimension = 0.0;
 			lightCamera.orthoBounds = lc.orthoBounds;
 			lightCamera.update();
-			if ( dimension > 0.0 )
-				cullPassesSize(passes, lightCamera.frustum, dimension);
-			else
-				cullPasses(passes, function(col) return col.inFrustum(lightCamera.frustum));
+			customCullPasses(passes, lightCamera.frustum, i, dimension);
 			textures[i] = processShadowMap( passes, texture, sort);
 			passes.load(p);
 		}