Browse Source

skin animate tangents + fixed normal maps priority wrt skin transform

ncannasse 7 years ago
parent
commit
4296279390
3 changed files with 12 additions and 11 deletions
  1. 4 6
      h3d/scene/Skin.hx
  2. 1 1
      h3d/shader/NormalMap.hx
  3. 7 4
      h3d/shader/Skin.hx

+ 4 - 6
h3d/scene/Skin.hx

@@ -167,12 +167,10 @@ class Skin extends MultiMaterial {
 				skinShader.MaxBones = maxBones;
 			for( m in materials )
 				if( m != null ) {
-					m.mainPass.addShader(skinShader);
-					var old = m.normalMap;
-					if( old != null ) {
-						m.normalMap = null;
-						m.normalMap = old; // re-up normalmap priority (skinShader changes normal)
-					}
+					if( m.normalMap != null )
+						@:privateAccess m.mainPass.addShaderAtIndex(skinShader, m.mainPass.getShaderIndex(m.normalShader) + 1);
+					else
+						m.mainPass.addShader(skinShader);
 					if( skinData.splitJoints != null ) m.mainPass.dynamicParameters = true;
 				}
 		}

+ 1 - 1
h3d/shader/NormalMap.hx

@@ -26,7 +26,7 @@ class NormalMap extends hxsl.Shader {
 
 		@var var transformedTangent : Vec4;
 
-		function vertex() {
+		function __init__vertex() {
 			transformedTangent = vec4(input.tangent * global.modelView.mat3(),input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.);
 		}
 

+ 7 - 4
h3d/shader/Skin.hx

@@ -7,6 +7,7 @@ class Skin extends hxsl.Shader {
 		@input var input : {
 			var position : Vec3;
 			var normal : Vec3;
+			var tangent : Vec3;
 			var weights : Vec3;
 			var indexes : Bytes4;
 		};
@@ -14,14 +15,12 @@ class Skin extends hxsl.Shader {
 		var relativePosition : Vec3;
 		var transformedPosition : Vec3;
 		var transformedNormal : Vec3;
+		var transformedTangent : Vec4;
 
 		@const var MaxBones : Int;
 		@ignore @param var bonesMatrixes : Array<Mat3x4,MaxBones>;
 
 		function vertex() {
-			#if floatSkinIndexes
-			error("TODO : access bonesMatrixes as vertex array");
-			#else
 			transformedPosition =
 				(relativePosition * bonesMatrixes[input.indexes.x]) * input.weights.x +
 				(relativePosition * bonesMatrixes[input.indexes.y]) * input.weights.y +
@@ -30,7 +29,11 @@ class Skin extends hxsl.Shader {
 				(input.normal * mat3(bonesMatrixes[input.indexes.x])) * input.weights.x +
 				(input.normal * mat3(bonesMatrixes[input.indexes.y])) * input.weights.y +
 				(input.normal * mat3(bonesMatrixes[input.indexes.z])) * input.weights.z);
-			#end
+			transformedTangent = vec4(normalize(
+				(input.tangent.xyz * mat3(bonesMatrixes[input.indexes.x])) * input.weights.x +
+				(input.tangent.xyz * mat3(bonesMatrixes[input.indexes.y])) * input.weights.y +
+				(input.tangent.xyz * mat3(bonesMatrixes[input.indexes.z])) * input.weights.z
+			), transformedTangent.w);
 		}
 
 	}