Răsfoiți Sursa

Adding cascade shadow mapping.

clandrin 2 ani în urmă
părinte
comite
6c572e59c8
1 a modificat fișierele cu 35 adăugiri și 8 ștergeri
  1. 35 8
      hrt/prefab/Light.hx

+ 35 - 8
hrt/prefab/Light.hx

@@ -61,6 +61,10 @@ class Light extends Object3D {
 	@:s public var minDist : Float = -1;
 	@:s public var autoShrink : Bool = true;
 	@:s public var autoZPlanes : Bool = false;
+	@:s public var cascade : Bool = false;
+	@:s public var cascadeNbr : Int = 1;
+	@:s public var cascadePow : Float = 2;
+	@:s public var firstCascadeSize : Float = 10;
 
 	// Debug
 	@:s public var debugDisplay : Bool = true;
@@ -139,7 +143,7 @@ class Light extends Object3D {
 		} else {
 			switch( kind ) {
 			case Point: ctx.local3d = new h3d.scene.pbr.PointLight(ctx.local3d);
-			case Directional: ctx.local3d = new h3d.scene.pbr.DirLight(ctx.local3d);
+			case Directional: ctx.local3d = new h3d.scene.pbr.DirLight(ctx.local3d, cascade);
 			case Spot: ctx.local3d = new h3d.scene.pbr.SpotLight(ctx.local3d);
 			}
 		}
@@ -169,6 +173,13 @@ class Light extends Object3D {
 					s.minDist = minDist;
 					s.autoShrink = autoShrink;
 					s.autoZPlanes = autoZPlanes;
+					var cs = Std.downcast(s, h3d.pass.CascadeShadowMap);
+					if ( cs != null ) {
+						cs.cascade = cascadeNbr;
+						cs.pow = cascadePow;
+						cs.firstCascadeSize = firstCascadeSize;
+						cs.debug = debugDisplay;
+					}
 				}
 			case Spot:
 				var sl = Std.downcast(light, h3d.scene.pbr.SpotLight);
@@ -384,12 +395,22 @@ class Light extends Object3D {
 
 		switch( kind ) {
 		case Directional:
-			group.append(hide.comp.PropsEditor.makePropsList([
-				{ name: "maxDist", t: PFloat(0, 1000), def: -1 },
-				{ name: "minDist", t: PFloat(0, 50), def: -1 },
-				{ name: "autoShrink", t: PBool, def: true },
-				{ name: "autoZPlanes", t: PBool, def: false },
-			]));
+			if ( !cascade ) {
+				group.append(hide.comp.PropsEditor.makePropsList([
+					{ name: "maxDist", t: PFloat(0, 1000), def: -1 },
+					{ name: "minDist", t: PFloat(0, 50), def: -1 },
+					{ name: "autoShrink", t: PBool, def: true },
+					{ name: "autoZPlanes", t: PBool, def: false },
+					{ name: "cascade", t: PBool, def: false },
+				]));
+			} else {
+				group.append(hide.comp.PropsEditor.makePropsList([
+					{ name: "maxDist", t: PFloat(0, 1000), def: -1 },
+					{ name: "minDist", t: PFloat(0, 50), def: -1 },
+					{ name: "autoZPlanes", t: PBool, def: false },
+					{ name: "cascade", t: PBool, def: false },
+				]));
+			}
 		case Spot:
 			group.append(hide.comp.PropsEditor.makePropsList([
 				{ name: "range", t: PFloat(1, 20), def: 10 },
@@ -405,9 +426,15 @@ class Light extends Object3D {
 			]));
 		default:
 		}
+		if ( cascade )
+			group.append(hide.comp.PropsEditor.makePropsList([
+				{ name: "cascadeNbr", t: PInt(1, 5), def: 1},
+				{ name: "cascadePow", t: PFloat(1, 10), def: 2},
+				{ name: "firstCascadeSize", t: PFloat(10, 100), def: 50},
+			]));
 
 		var props = ctx.properties.add(group, this, function(pname) {
-			if( pname == "kind"){
+			if( pname == "kind" || pname == "cascade" ){
 				ctx.rebuildPrefab(this);
 				ctx.rebuildProperties();
 			}