2
0
Эх сурвалжийг харах

fixed tangent hmd with normal maps: binormal flip fix and correct left-handness

ncannasse 7 жил өмнө
parent
commit
72ee608ebb

+ 8 - 8
h3d/shader/NormalMap.hx

@@ -24,21 +24,21 @@ class NormalMap extends hxsl.Shader {
 		var transformedPosition : Vec3;
         var transformedNormal : Vec3;
 
-		@var var transformedTangent : Vec3;
+		@var var transformedTangent : Vec4;
 
 		function vertex() {
-			transformedTangent = input.tangent * global.modelView.mat3();
+			transformedTangent = vec4(input.tangent * global.modelView.mat3(),input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.);
 		}
 
 		function fragment() {
 			var n = transformedNormal;
 			var nf = unpackNormal(texture.get(calculatedUV));
-			var tanX = transformedTangent.normalize();
-			tanX.x *= -1;
-			var tanY = n.cross(tanX);
-			transformedNormal = (nf.x * tanX - nf.y * tanY + nf.z * n).normalize();
-        }
-    };
+			var tanX = transformedTangent.xyz.normalize();
+			var tanY = n.cross(tanX) * transformedTangent.w;
+			transformedNormal = (nf.x * tanX + nf.y * tanY + nf.z * n).normalize();
+		}
+
+     };
 
     public function new(?texture) {
         super();

+ 3 - 1
hxd/fmt/fbx/BaseLibrary.hx

@@ -299,7 +299,9 @@ class BaseLibrary {
 				convertPoints(v.getFloats());
 			for( v in g.getAll("LayerElementNormal.Normals") )
 				convertPoints(v.getFloats());
-			for( v in g.getAll("LayerElementNormal.Tangents") )
+			for( v in g.getAll("LayerElementTangent.Tangents") )
+				convertPoints(v.getFloats());
+			for( v in g.getAll("LayerElementBinormal.Binormals") )
 				convertPoints(v.getFloats());
 		}
 	}

+ 4 - 0
hxd/fmt/fbx/Geometry.hx

@@ -177,6 +177,10 @@ class Geometry {
 		return processVectors("LayerElementTangent", "Tangents", opt);
 	}
 
+	public function getBinormals( opt = false ) {
+		return processVectors("LayerElementBinormal", "Binormals", opt);
+	}
+
 	function processVectors( layer, name, opt = false ) {
 		var vect = root.get(layer + "." + name, opt);
 		if( vect == null ) return null;

+ 16 - 0
hxd/fmt/fbx/HMDOut.hx

@@ -43,6 +43,7 @@ class HMDOut extends BaseLibrary {
 		var colors = geom.getColors();
 		var mats = geom.getMaterials();
 		var tangents = geom.getTangents(true);
+		var biNorm = geom.getBinormals(true);
 
 		// remove empty color data
 		if( colors != null ) {
@@ -135,6 +136,21 @@ class HMDOut extends BaseLibrary {
 					tmpBuf[p++] = tangents[k * 3];
 					tmpBuf[p++] = tangents[k * 3 + 1];
 					tmpBuf[p++] = tangents[k * 3 + 2];
+
+					if( biNorm != null ) {
+
+						// RH
+						var n = new h3d.Vector(normals[k*3], normals[k*3+1], normals[k*3+2]);
+						var t = new h3d.Vector(tangents[k*3], tangents[k*3+1], tangents[k*3+2]);
+						var b = new h3d.Vector(biNorm[k*3], biNorm[k*3+1], biNorm[k*3+2]);
+
+						if( n.cross(t).dot3(b) < 0 ) {
+							// store binormal flip sign in tangent length
+							tmpBuf[p-3] *= 0.5;
+							tmpBuf[p-2] *= 0.5;
+							tmpBuf[p-1] *= 0.5;
+						}
+					}
 				}
 
 				for( tuvs in uvs ) {