@@ -52,9 +52,9 @@ public class ModelExporter : System.IDisposable
52
52
Dictionary < string , FbxTexture > TextureMap = new Dictionary < string , FbxTexture > ( ) ;
53
53
54
54
/// <summary>
55
- /// Export the mesh's UVs using layer 0.
55
+ /// Export the mesh's attributes using layer 0.
56
56
/// </summary>
57
- public void ExportUVsAndNormals ( MeshInfo mesh , FbxMesh fbxMesh , int [ ] unmergedTriangles )
57
+ public void ExportComponentAttributes ( MeshInfo mesh , FbxMesh fbxMesh , int [ ] unmergedTriangles )
58
58
{
59
59
// Set the normals on Layer 0.
60
60
FbxLayer fbxLayer = fbxMesh . GetLayer ( 0 /* default layer */ ) ;
@@ -66,7 +66,6 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
66
66
using ( var fbxLayerElement = FbxLayerElementNormal . Create ( fbxMesh , "Normals" ) )
67
67
{
68
68
fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
69
-
70
69
fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eDirect ) ;
71
70
72
71
// Add one normal per each vertex face index (3 per triangle)
@@ -105,6 +104,42 @@ public void ExportUVsAndNormals (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedT
105
104
}
106
105
fbxLayer . SetUVs ( fbxLayerElement , FbxLayerElement . EType . eTextureDiffuse ) ;
107
106
}
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
+ }
108
143
}
109
144
110
145
/// <summary>
@@ -285,7 +320,7 @@ meshInfo.Vertices [v].z
285
320
fbxMesh . EndPolygon ( ) ;
286
321
}
287
322
288
- ExportUVsAndNormals ( meshInfo , fbxMesh , unmergedTriangles ) ;
323
+ ExportComponentAttributes ( meshInfo , fbxMesh , unmergedTriangles ) ;
289
324
290
325
var fbxMaterial = ExportMaterial ( meshInfo . Material , fbxScene ) ;
291
326
fbxNode . AddMaterial ( fbxMaterial ) ;
@@ -593,7 +628,7 @@ public Vector3 [] Binormals
593
628
/// NOTE: LINQ
594
629
/// return mesh.normals.Zip (mesh.tangents, (first, second)
595
630
/// => Math.cross (normal, tangent.xyz) * tangent.w
596
- if ( m_Binormals . Length == 0 )
631
+ if ( m_Binormals == null || m_Binormals . Length == 0 )
597
632
{
598
633
m_Binormals = new Vector3 [ mesh . normals . Length ] ;
599
634
0 commit comments