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