Prechádzať zdrojové kódy

added computeStatic() and static pass mark

ncannasse 7 rokov pred
rodič
commit
b90ca87719

+ 8 - 1
h3d/mat/Material.hx

@@ -25,6 +25,7 @@ class Material extends BaseMaterial {
 	public var shadows(get, set) : Bool;
 	public var castShadows(default, set) : Bool;
 	public var receiveShadows(default, set) : Bool;
+	public var staticShadows(default, set) : Bool;
 
 	public var textureShader(default, null) : h3d.shader.Texture;
 	public var specularShader(default, null) : h3d.shader.SpecularTexture;
@@ -83,7 +84,7 @@ class Material extends BaseMaterial {
 			return v;
 		if( mainPass != null ) {
 			if( v )
-				addPass(new Pass("shadow", null, mainPass));
+				addPass(new Pass("shadow", null, mainPass)).isStatic = staticShadows;
 			else
 				removePass(getPass("shadow"));
 		}
@@ -103,6 +104,12 @@ class Material extends BaseMaterial {
 		return receiveShadows = v;
 	}
 
+	function set_staticShadows(v) {
+		var p = getPass("shadow");
+		if( p != null ) p.isStatic = v;
+		return staticShadows = v;
+	}
+
 	override function clone( ?m : BaseMaterial ) : BaseMaterial {
 		var m = m == null ? new Material() : cast m;
 		super.clone(m);

+ 6 - 0
h3d/mat/Pass.hx

@@ -20,6 +20,12 @@ class Pass implements hxd.impl.Serializable {
 	**/
 	@:s public var dynamicParameters : Bool;
 
+	/**
+		Mark the pass as static, this will allow some renderers or shadows to filter it
+		when rendering static/dynamic parts.
+	**/
+	@:s public var isStatic : Bool;
+
 	@:bits(bits) public var culling : Face;
 	@:bits(bits) public var depthWrite : Bool;
 	@:bits(bits) public var depthTest : Compare;

+ 1 - 0
h3d/scene/RenderContext.hx

@@ -16,6 +16,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	public var scene : Scene;
 	public var drawPass : ObjectPass;
 	public var pbrLightPass : h3d.mat.Pass;
+	public var computingStatic : Bool;
 
 	var sharedGlobals : Array<SharedGlobal>;
 	public var lightSystem : h3d.scene.LightSystem;

+ 9 - 1
h3d/scene/Renderer.hx

@@ -18,6 +18,7 @@ enum RenderMode{
 }
 
 @:allow(hxd.prefab.rfx.RendererFX)
+@:allow(h3d.pass.Shadows)
 class Renderer extends hxd.impl.AnyProps {
 
 	var defaultPass : h3d.pass.Base;
@@ -154,6 +155,10 @@ class Renderer extends hxd.impl.AnyProps {
 		throw "Not implemented";
 	}
 
+	function computeStatic() {
+		throw "Not implemented";
+	}
+
 	public function start() {
 	}
 
@@ -164,7 +169,10 @@ class Renderer extends hxd.impl.AnyProps {
 		for( p in passes )
 			passObjects.set(p.name, p);
 		ctx.textures.begin();
-		render();
+		if( ctx.computingStatic )
+			computeStatic();
+		else
+			render();
 		resetTarget();
 		for( p in passes )
 			passObjects.set(p.name, null);

+ 9 - 0
h3d/scene/Scene.hx

@@ -310,6 +310,15 @@ class Scene extends Object implements h3d.IDrawable implements hxd.SceneEvents.I
 		ctx.scene = null;
 	}
 
+	public function computeStatic() {
+		var old = ctx.elapsedTime;
+		ctx.elapsedTime = 0;
+		ctx.computingStatic = true;
+		render(h3d.Engine.getCurrent());
+		ctx.computingStatic = false;
+		ctx.elapsedTime = old;
+	}
+
 	@:access(h3d.mat.Pass)
 	@:access(h3d.scene.RenderContext)
 	public function render( engine : h3d.Engine ) {