@@ -70,16 +70,26 @@ public static ModelExporter Create ()
70
70
Dictionary < string , FbxMesh > SharedMeshes = new Dictionary < string , FbxMesh > ( ) ;
71
71
72
72
/// <summary>
73
- /// Export the mesh's attributes using layer 0.
73
+ /// return layer for mesh
74
74
/// </summary>
75
- public void ExportComponentAttributes ( MeshInfo mesh , FbxMesh fbxMesh , int [ ] unmergedTriangles )
75
+ ///
76
+ private FbxLayer GetLayer ( FbxMesh fbxMesh , int layer = 0 /* default layer */ )
76
77
{
77
- // Set the normals on Layer 0.
78
- FbxLayer fbxLayer = fbxMesh . GetLayer ( 0 /* default layer */ ) ;
78
+ FbxLayer fbxLayer = fbxMesh . GetLayer ( layer ) ;
79
79
if ( fbxLayer == null ) {
80
80
fbxMesh . CreateLayer ( ) ;
81
- fbxLayer = fbxMesh . GetLayer ( 0 /* default layer */ ) ;
81
+ fbxLayer = fbxMesh . GetLayer ( layer ) ;
82
82
}
83
+ return fbxLayer ;
84
+ }
85
+
86
+ /// <summary>
87
+ /// Export the mesh's attributes using layer 0.
88
+ /// </summary>
89
+ public void ExportComponentAttributes ( MeshInfo mesh , FbxMesh fbxMesh , int [ ] unmergedTriangles )
90
+ {
91
+ // Set the normals on Layer 0.
92
+ FbxLayer fbxLayer = GetLayer ( fbxMesh ) ;
83
93
84
94
using ( var fbxLayerElement = FbxLayerElementNormal . Create ( fbxMesh , "Normals" ) ) {
85
95
fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
@@ -133,29 +143,7 @@ public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unm
133
143
fbxLayer . SetTangents ( fbxLayerElement ) ;
134
144
}
135
145
136
- using ( var fbxLayerElement = FbxLayerElementUV . Create ( fbxMesh , "UVSet" ) )
137
- {
138
- fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
139
- fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eIndexToDirect ) ;
140
-
141
- // set texture coordinates per vertex
142
- FbxLayerElementArray fbxElementArray = fbxLayerElement . GetDirectArray ( ) ;
143
-
144
- // TODO: only copy unique UVs into this array, and index appropriately
145
- for ( int n = 0 ; n < mesh . UV . Length ; n ++ ) {
146
- fbxElementArray . Add ( new FbxVector2 ( mesh . UV [ n ] [ 0 ] ,
147
- mesh . UV [ n ] [ 1 ] ) ) ;
148
- }
149
-
150
- // For each face index, point to a texture uv
151
- FbxLayerElementArray fbxIndexArray = fbxLayerElement . GetIndexArray ( ) ;
152
- fbxIndexArray . SetCount ( unmergedTriangles . Length ) ;
153
-
154
- for ( int i = 0 ; i < unmergedTriangles . Length ; i ++ ) {
155
- fbxIndexArray . SetAt ( i , unmergedTriangles [ i ] ) ;
156
- }
157
- fbxLayer . SetUVs ( fbxLayerElement , FbxLayerElement . EType . eTextureDiffuse ) ;
158
- }
146
+ ExportUVs ( fbxMesh , mesh , unmergedTriangles ) ;
159
147
160
148
using ( var fbxLayerElement = FbxLayerElementVertexColor . Create ( fbxMesh , "VertexColors" ) )
161
149
{
@@ -188,6 +176,55 @@ public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unm
188
176
}
189
177
}
190
178
179
+ /// <summary>
180
+ /// Unity has up to 4 uv sets per mesh. Export all the ones that exist.
181
+ /// </summary>
182
+ /// <param name="fbxMesh">Fbx mesh.</param>
183
+ /// <param name="mesh">Mesh.</param>
184
+ /// <param name="unmergedTriangles">Unmerged triangles.</param>
185
+ protected void ExportUVs ( FbxMesh fbxMesh , MeshInfo mesh , int [ ] unmergedTriangles )
186
+ {
187
+ Vector2 [ ] [ ] uvs = new Vector2 [ ] [ ] {
188
+ mesh . UV ,
189
+ mesh . mesh . uv2 ,
190
+ mesh . mesh . uv3 ,
191
+ mesh . mesh . uv4
192
+ } ;
193
+
194
+ int k = 0 ;
195
+ for ( int i = 0 ; i < uvs . Length ; i ++ ) {
196
+ if ( uvs [ i ] == null || uvs [ i ] . Length == 0 ) {
197
+ continue ; // don't have these UV's, so skip
198
+ }
199
+
200
+ FbxLayer fbxLayer = GetLayer ( fbxMesh , k ) ;
201
+ using ( var fbxLayerElement = FbxLayerElementUV . Create ( fbxMesh , "UVSet" + i ) )
202
+ {
203
+ fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygonVertex ) ;
204
+ fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eIndexToDirect ) ;
205
+
206
+ // set texture coordinates per vertex
207
+ FbxLayerElementArray fbxElementArray = fbxLayerElement . GetDirectArray ( ) ;
208
+
209
+ // TODO: only copy unique UVs into this array, and index appropriately
210
+ for ( int n = 0 ; n < uvs [ i ] . Length ; n ++ ) {
211
+ fbxElementArray . Add ( new FbxVector2 ( uvs [ i ] [ n ] [ 0 ] ,
212
+ uvs [ i ] [ n ] [ 1 ] ) ) ;
213
+ }
214
+
215
+ // For each face index, point to a texture uv
216
+ FbxLayerElementArray fbxIndexArray = fbxLayerElement . GetIndexArray ( ) ;
217
+ fbxIndexArray . SetCount ( unmergedTriangles . Length ) ;
218
+
219
+ for ( int j = 0 ; j < unmergedTriangles . Length ; j ++ ) {
220
+ fbxIndexArray . SetAt ( j , unmergedTriangles [ j ] ) ;
221
+ }
222
+ fbxLayer . SetUVs ( fbxLayerElement , FbxLayerElement . EType . eTextureDiffuse ) ;
223
+ }
224
+ k ++ ;
225
+ }
226
+ }
227
+
191
228
/// <summary>
192
229
/// Takes in a left-handed Vector3, and returns a right-handed FbxVector4.
193
230
/// Helper for ExportComponentAttributes()
0 commit comments