Ver código fonte

[RENDERER][PASS] Adding drawOrder as first comparison sorting passes. Using props.json, material.drawOrder is project specific. Avoid layer series such as 0,1,2 as no new layers fit between.

clandrin 3 anos atrás
pai
commit
8d410589ed
4 arquivos alterados com 28 adições e 2 exclusões
  1. 1 0
      h3d/mat/Pass.hx
  2. 22 0
      h3d/mat/PbrMaterial.hx
  3. 2 0
      h3d/pass/SortByMaterial.hx
  4. 3 2
      h3d/scene/Renderer.hx

+ 1 - 0
h3d/mat/Pass.hx

@@ -42,6 +42,7 @@ class Pass {
 	@:bits(bits) public var blendAlphaOp : Operation;
 	@:bits(bits) public var blendAlphaOp : Operation;
 	@:bits(bits) public var wireframe : Bool;
 	@:bits(bits) public var wireframe : Bool;
 	public var colorMask : Int;
 	public var colorMask : Int;
+	public var layer : Int = 0;
 
 
 	public var stencil : Stencil;
 	public var stencil : Stencil;
 
 

+ 22 - 0
h3d/mat/PbrMaterial.hx

@@ -81,6 +81,8 @@ typedef PbrProps = {
 	@:optional var stencilValue : Int;
 	@:optional var stencilValue : Int;
 	@:optional var stencilWriteMask : Int;
 	@:optional var stencilWriteMask : Int;
 	@:optional var stencilReadMask : Int;
 	@:optional var stencilReadMask : Int;
+
+	@:optional var drawOrder : String;
 }
 }
 
 
 class PbrMaterial extends Material {
 class PbrMaterial extends Material {
@@ -217,6 +219,8 @@ class PbrMaterial extends Material {
 			Reflect.deleteField(props, "stencilPassOp");
 			Reflect.deleteField(props, "stencilPassOp");
 			Reflect.deleteField(props, "stencilCompare");
 			Reflect.deleteField(props, "stencilCompare");
 		}
 		}
+		if( props.drawOrder == "0" )
+			Reflect.deleteField(props,"drawOrder");
 		#end
 		#end
 	}
 	}
 
 
@@ -353,6 +357,16 @@ class PbrMaterial extends Material {
 		setColorMask();
 		setColorMask();
 
 
 		setStencil();
 		setStencil();
+
+		var p = passes;
+		var layer = 0;
+		while ( p != null ) {
+			if ( props.drawOrder == null )
+				mainPass.layer = 0;
+			else
+				mainPass.layer = Std.parseInt(props.drawOrder);
+			p = p.nextPass;
+		}
 	}
 	}
 
 
 	function setColorMask() {
 	function setColorMask() {
@@ -464,6 +478,7 @@ class PbrMaterial extends Material {
 	#if editor
 	#if editor
 	override function editProps() {
 	override function editProps() {
 		var props : PbrProps = props;
 		var props : PbrProps = props;
+		var layers : Array< { name : String, value : Int }> = hide.Ide.inst.currentConfig.get("material.drawOrder", []);
 		return new js.jquery.JQuery('
 		return new js.jquery.JQuery('
 			<dl>
 			<dl>
 				<dt>Mode</dt>
 				<dt>Mode</dt>
@@ -518,6 +533,13 @@ class PbrMaterial extends Material {
 				</dd>
 				</dd>
 				<dt>AlphaKill</dt><dd><input type="checkbox" field="alphaKill"/></dd>
 				<dt>AlphaKill</dt><dd><input type="checkbox" field="alphaKill"/></dd>
 				<dt>Wrap</dt><dd><input type="checkbox" field="textureWrap"/></dd>
 				<dt>Wrap</dt><dd><input type="checkbox" field="textureWrap"/></dd>
+				<dt>Draw Order</dt>
+				<dd>
+					<select field="drawOrder">
+						<option value="" selected disabled hidden>Default</option>
+						${[for( i in 0...layers.length ) '<option value="${layers[i].value}">${layers[i].name}</option>'].join("")}
+					</select>
+				</dd>
 			</dl>
 			</dl>
 		');
 		');
 	}
 	}

+ 2 - 0
h3d/pass/SortByMaterial.hx

@@ -21,6 +21,8 @@ class SortByMaterial {
 				textureIdMap[p.texture] = textureCount++;
 				textureIdMap[p.texture] = textureCount++;
 		}
 		}
 		passes.sort(function(o1, o2) {
 		passes.sort(function(o1, o2) {
+			if ( o1.pass.layer != o2.pass.layer )
+				return o1.pass.layer - o2.pass.layer;
 			var d = shaderIdMap[o1.shader.id] - shaderIdMap[o2.shader.id];
 			var d = shaderIdMap[o1.shader.id] - shaderIdMap[o2.shader.id];
 			if( d != 0 ) return d;
 			if( d != 0 ) return d;
 			return textureIdMap[o1.texture] - textureIdMap[o2.texture];
 			return textureIdMap[o1.texture] - textureIdMap[o2.texture];

+ 3 - 2
h3d/scene/Renderer.hx

@@ -108,9 +108,10 @@ class Renderer extends hxd.impl.AnyProps {
 			p.depth = z / w;
 			p.depth = z / w;
 		}
 		}
 		if( frontToBack )
 		if( frontToBack )
-			passes.sort(function(p1, p2) return p1.depth > p2.depth ? 1 : -1);
+			passes.sort(function(p1, p2) return p1.pass.layer == p2.pass.layer ? (p1.depth > p2.depth ? 1 : -1) : p1.pass.layer - p2.pass.layer);
+
 		else
 		else
-			passes.sort(function(p1, p2) return p1.depth > p2.depth ? -1 : 1);
+			passes.sort(function(p1, p2) return p1.pass.layer == p2.pass.layer ? (p1.depth > p2.depth ? -1 : 1) : p1.pass.layer - p2.pass.layer);
 	}
 	}
 
 
 	inline function clear( ?color, ?depth, ?stencil ) {
 	inline function clear( ?color, ?depth, ?stencil ) {