Skip to content

Commit 89ed221

Browse files
committed
add binormals and tangents
1 parent ce77b18 commit 89ed221

File tree

1 file changed

+40
-5
lines changed

1 file changed

+40
-5
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public class ModelExporter : System.IDisposable
5252
Dictionary<string, FbxTexture> TextureMap = new Dictionary<string, FbxTexture>();
5353

5454
/// <summary>
55-
/// Export the mesh's UVs using layer 0.
55+
/// Export the mesh's attributes using layer 0.
5656
/// </summary>
57-
public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
57+
public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
5858
{
5959
// Set the normals on Layer 0.
6060
FbxLayer fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
@@ -66,7 +66,6 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
6666
using (var fbxLayerElement = FbxLayerElementNormal.Create (fbxMesh, "Normals"))
6767
{
6868
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
69-
7069
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
7170

7271
// Add one normal per each vertex face index (3 per triangle)
@@ -105,6 +104,42 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
105104
}
106105
fbxLayer.SetUVs (fbxLayerElement, FbxLayerElement.EType.eTextureDiffuse);
107106
}
107+
108+
/// Set the binormals on Layer 0.
109+
using (var fbxLayerElement = FbxLayerElementBinormal.Create (fbxMesh, "Binormals"))
110+
{
111+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
112+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
113+
114+
// Add one normal per each vertex face index (3 per triangle)
115+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
116+
117+
for (int n = 0; n < unmergedTriangles.Length; n++) {
118+
int unityTriangle = unmergedTriangles [n];
119+
fbxElementArray.Add (new FbxVector4 (-mesh.Binormals [unityTriangle] [0],
120+
mesh.Binormals [unityTriangle] [1],
121+
mesh.Binormals [unityTriangle] [2]));
122+
}
123+
fbxLayer.SetBinormals (fbxLayerElement);
124+
}
125+
126+
/// Set the tangents on Layer 0.
127+
using (var fbxLayerElement = FbxLayerElementTangent.Create (fbxMesh, "Tangents"))
128+
{
129+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
130+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
131+
132+
// Add one normal per each vertex face index (3 per triangle)
133+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
134+
135+
for (int n = 0; n < unmergedTriangles.Length; n++) {
136+
int unityTriangle = unmergedTriangles [n];
137+
fbxElementArray.Add (new FbxVector4 (-mesh.Tangents [unityTriangle] [0],
138+
mesh.Tangents [unityTriangle] [1],
139+
mesh.Tangents [unityTriangle] [2]));
140+
}
141+
fbxLayer.SetTangents (fbxLayerElement);
142+
}
108143
}
109144

110145
/// <summary>
@@ -285,7 +320,7 @@ meshInfo.Vertices [v].z
285320
fbxMesh.EndPolygon ();
286321
}
287322

288-
ExportUVsAndNormals (meshInfo, fbxMesh, unmergedTriangles);
323+
ExportComponentAttributes (meshInfo, fbxMesh, unmergedTriangles);
289324

290325
var fbxMaterial = ExportMaterial (meshInfo.Material, fbxScene);
291326
fbxNode.AddMaterial (fbxMaterial);
@@ -593,7 +628,7 @@ public Vector3 [] Binormals
593628
/// NOTE: LINQ
594629
/// return mesh.normals.Zip (mesh.tangents, (first, second)
595630
/// => Math.cross (normal, tangent.xyz) * tangent.w
596-
if (m_Binormals.Length == 0)
631+
if (m_Binormals == null || m_Binormals.Length == 0)
597632
{
598633
m_Binormals = new Vector3 [mesh.normals.Length];
599634

0 commit comments

Comments
 (0)