Skip to content

Commit 2a49d4b

Browse files
authored
Merge pull request #8 from Unity-Technologies/UNI-20477-add-tangents-binormals
Uni 20477 add tangents binormals
2 parents 3490254 + fa3d037 commit 2a49d4b

File tree

1 file changed

+57
-8
lines changed

1 file changed

+57
-8
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ public static ModelExporter Create ()
5555
Dictionary<string, FbxTexture> TextureMap = new Dictionary<string, FbxTexture> ();
5656

5757
/// <summary>
58-
/// Export the mesh's UVs using layer 0.
58+
/// Export the mesh's attributes using layer 0.
5959
/// </summary>
60-
public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
60+
public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
6161
{
6262
// Set the normals on Layer 0.
6363
FbxLayer fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
@@ -68,17 +68,14 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
6868

6969
using (var fbxLayerElement = FbxLayerElementNormal.Create (fbxMesh, "Normals")) {
7070
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
71-
7271
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
7372

7473
// Add one normal per each vertex face index (3 per triangle)
7574
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
7675

7776
for (int n = 0; n < unmergedTriangles.Length; n++) {
7877
int unityTriangle = unmergedTriangles [n];
79-
fbxElementArray.Add (new FbxVector4 (-mesh.Normals [unityTriangle] [0],
80-
mesh.Normals [unityTriangle] [1],
81-
mesh.Normals [unityTriangle] [2]));
78+
fbxElementArray.Add (CreateRightHandedFbxVector4 (mesh.Normals [unityTriangle]));
8279
}
8380

8481
fbxLayer.SetNormals (fbxLayerElement);
@@ -106,6 +103,57 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
106103
}
107104
fbxLayer.SetUVs (fbxLayerElement, FbxLayerElement.EType.eTextureDiffuse);
108105
}
106+
107+
/// Set the binormals on Layer 0.
108+
using (var fbxLayerElement = FbxLayerElementBinormal.Create (fbxMesh, "Binormals"))
109+
{
110+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
111+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
112+
113+
// Add one normal per each vertex face index (3 per triangle)
114+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
115+
116+
for (int n = 0; n < unmergedTriangles.Length; n++) {
117+
int unityTriangle = unmergedTriangles [n];
118+
fbxElementArray.Add (CreateRightHandedFbxVector4 (mesh.Binormals [unityTriangle]));
119+
}
120+
fbxLayer.SetBinormals (fbxLayerElement);
121+
}
122+
123+
/// Set the tangents on Layer 0.
124+
using (var fbxLayerElement = FbxLayerElementTangent.Create (fbxMesh, "Tangents"))
125+
{
126+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
127+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
128+
129+
// Add one normal per each vertex face index (3 per triangle)
130+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
131+
132+
for (int n = 0; n < unmergedTriangles.Length; n++) {
133+
int unityTriangle = unmergedTriangles [n];
134+
fbxElementArray.Add (CreateRightHandedFbxVector4(
135+
new Vector3(
136+
mesh.Tangents[unityTriangle][0],
137+
mesh.Tangents[unityTriangle][1],
138+
mesh.Tangents[unityTriangle][2]
139+
)));
140+
}
141+
fbxLayer.SetTangents (fbxLayerElement);
142+
}
143+
}
144+
145+
/// <summary>
146+
/// Takes in a left-handed Vector3, and returns a right-handed FbxVector4.
147+
/// Helper for ExportComponentAttributes()
148+
/// </summary>
149+
/// <returns>The right-handed FbxVector4.</returns>
150+
private FbxVector4 CreateRightHandedFbxVector4(Vector3 leftHandedVector)
151+
{
152+
// negating the x component of the vector converts it from left to right handed coordinates
153+
return new FbxVector4 (
154+
-leftHandedVector[0],
155+
leftHandedVector[1],
156+
leftHandedVector[2]);
109157
}
110158

111159
/// <summary>
@@ -303,7 +351,7 @@ meshInfo.Vertices [v].z
303351
fbxMesh.EndPolygon ();
304352
}
305353

306-
ExportUVsAndNormals (meshInfo, fbxMesh, unmergedTriangles);
354+
ExportComponentAttributes (meshInfo, fbxMesh, unmergedTriangles);
307355

308356
// set the fbxNode containing the mesh
309357
fbxNode.SetNodeAttribute (fbxMesh);
@@ -604,7 +652,8 @@ public Vector3 [] Binormals {
604652
/// NOTE: LINQ
605653
/// return mesh.normals.Zip (mesh.tangents, (first, second)
606654
/// => Math.cross (normal, tangent.xyz) * tangent.w
607-
if (m_Binormals.Length == 0) {
655+
if (m_Binormals == null || m_Binormals.Length == 0)
656+
{
608657
m_Binormals = new Vector3 [mesh.normals.Length];
609658

610659
for (int i = 0; i < mesh.normals.Length; i++)

0 commit comments

Comments
 (0)