Ver Fonte

Adding FlipBackFaceNormal to PbrMaterial.

clementlandrin há 1 ano atrás
pai
commit
c8c4443ae6
2 ficheiros alterados com 24 adições e 0 exclusões
  1. 10 0
      h3d/mat/PbrMaterial.hx
  2. 14 0
      h3d/shader/FlipBackFaceNormal.hx

+ 10 - 0
h3d/mat/PbrMaterial.hx

@@ -92,6 +92,7 @@ typedef PbrProps = {
 
 	@:optional var drawOrder : String;
 	@:optional var depthPrepass : Bool;
+	@:optional var flipBackFaceNormal : Bool;
 }
 
 class PbrMaterial extends Material {
@@ -238,6 +239,8 @@ class PbrMaterial extends Material {
 		 	Reflect.deleteField(props, "depthWrite");
 		if ( !props.depthPrepass )
 			Reflect.deleteField(props, "depthPrepass");
+		if ( !props.flipBackFaceNormal )
+			Reflect.deleteField(props, "flipBackFaceNormal");
 		if ( props.parallaxSteps == h3d.shader.Parallax.MAX_LAYERS || props.parallaxSteps == 0 )
 			Reflect.deleteField(props, "parallaxSteps");
 		#end
@@ -422,6 +425,12 @@ class PbrMaterial extends Material {
 				p.setBlendMode(None);
 			}
 		}
+
+		var sh = mainPass.getShader(h3d.shader.FlipBackFaceNormal);
+		if ( props.flipBackFaceNormal && sh == null )
+			mainPass.addShader(new h3d.shader.FlipBackFaceNormal());
+		else if ( !props.flipBackFaceNormal && sh != null )
+			mainPass.removeShader(sh); 
 	}
 
 	function setColorMask() {
@@ -606,6 +615,7 @@ class PbrMaterial extends Material {
 					</select>
 				</dd>
 				<dt>Depth prepass</dt><dd><input type="checkbox" field="depthPrepass"/></dd>
+				<dt>Flip back face normal</dt><dd><input type="checkbox" field="flipBackFaceNormal"/></dd>
 			</dl>
 		');
 	}

+ 14 - 0
h3d/shader/FlipBackFaceNormal.hx

@@ -0,0 +1,14 @@
+package h3d.shader;
+
+class FlipBackFaceNormal extends hxsl.Shader {
+
+    static var SRC = {
+
+        var transformedNormal : Vec3;
+
+		function __init__fragment() {
+			if ( !frontFacing )
+				transformedNormal *= -1.0;
+		}
+     };
+}