@@ -264,14 +264,13 @@ public FbxDouble3 GetMaterialColor (Material unityMaterial, string unityPropName
264
264
/// <summary>
265
265
/// Export (and map) a Unity PBS material to FBX classic material
266
266
/// </summary>
267
- public FbxSurfaceMaterial ExportMaterial ( Material unityMaterial , FbxScene fbxScene , FbxMesh fbxMesh )
267
+ public FbxSurfaceMaterial ExportMaterial ( Material unityMaterial , FbxScene fbxScene )
268
268
{
269
269
if ( Verbose )
270
270
Debug . Log ( string . Format ( "exporting material {0}" , unityMaterial . name ) ) ;
271
271
272
272
var materialName = unityMaterial ? unityMaterial . name : "DefaultMaterial" ;
273
273
if ( MaterialMap . ContainsKey ( materialName ) ) {
274
- AssignLayerElementMaterial ( fbxMesh ) ;
275
274
return MaterialMap [ materialName ] ;
276
275
}
277
276
@@ -303,13 +302,11 @@ public FbxSurfaceMaterial ExportMaterial (Material unityMaterial, FbxScene fbxSc
303
302
ExportTexture ( unityMaterial , "_SpecGlosMap" , fbxMaterial , FbxSurfaceMaterial . sSpecular ) ;
304
303
}
305
304
306
- AssignLayerElementMaterial ( fbxMesh ) ;
307
-
308
305
MaterialMap . Add ( materialName , fbxMaterial ) ;
309
306
return fbxMaterial ;
310
307
}
311
308
312
- private void AssignLayerElementMaterial ( FbxMesh fbxMesh )
309
+ private void AssignLayerElementMaterial ( FbxMesh fbxMesh , Mesh mesh , Material [ ] materials )
313
310
{
314
311
// Add FbxLayerElementMaterial to layer 0 of the node
315
312
FbxLayer fbxLayer = fbxMesh . GetLayer ( 0 /* default layer */ ) ;
@@ -320,13 +317,20 @@ private void AssignLayerElementMaterial(FbxMesh fbxMesh)
320
317
321
318
using ( var fbxLayerElement = FbxLayerElementMaterial . Create ( fbxMesh , "Material" ) ) {
322
319
// Using all same means that the entire mesh uses the same material
323
- fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eAllSame ) ;
320
+ fbxLayerElement . SetMappingMode ( FbxLayerElement . EMappingMode . eByPolygon ) ;
324
321
fbxLayerElement . SetReferenceMode ( FbxLayerElement . EReferenceMode . eIndexToDirect ) ;
325
322
326
323
FbxLayerElementArray fbxElementArray = fbxLayerElement . GetIndexArray ( ) ;
324
+ fbxElementArray . SetCount ( mesh . triangles . Length / 3 ) ;
327
325
328
326
// Map the entire geometry to the FbxNode material at index 0
329
- fbxElementArray . Add ( 0 ) ;
327
+ for ( int i = 0 ; i < mesh . subMeshCount ; i ++ ) {
328
+ int start = ( ( int ) mesh . GetIndexStart ( i ) ) / 3 ;
329
+ int count = ( ( int ) mesh . GetIndexCount ( i ) ) / 3 ;
330
+ for ( int j = start ; j < start + count ; j ++ ) {
331
+ fbxElementArray . SetAt ( j , i ) ;
332
+ }
333
+ }
330
334
fbxLayer . SetMaterials ( fbxLayerElement ) ;
331
335
}
332
336
}
@@ -387,8 +391,10 @@ meshInfo.Vertices [v].z*UnitScaleFactor
387
391
}
388
392
}
389
393
390
- var fbxMaterial = ExportMaterial ( meshInfo . Material , fbxScene , fbxMesh ) ;
391
- fbxNode . AddMaterial ( fbxMaterial ) ;
394
+ foreach ( var mat in meshInfo . Materials ) {
395
+ var fbxMaterial = ExportMaterial ( mat , fbxScene ) ;
396
+ fbxNode . AddMaterial ( fbxMaterial ) ;
397
+ }
392
398
393
399
/*
394
400
* Triangles have to be added in reverse order,
@@ -419,6 +425,8 @@ meshInfo.Vertices [v].z*UnitScaleFactor
419
425
fbxMesh . EndPolygon ( ) ;
420
426
}
421
427
428
+ AssignLayerElementMaterial ( fbxMesh , meshInfo . mesh , meshInfo . Materials ) ;
429
+
422
430
ExportComponentAttributes ( meshInfo , fbxMesh , unmergedTriangles ) ;
423
431
424
432
// set the fbxNode containing the mesh
@@ -855,7 +863,7 @@ public Vector3 [] Binormals {
855
863
/// The material used, if any; otherwise null.
856
864
/// We don't support multiple materials on one gameobject.
857
865
/// </summary>
858
- public Material Material {
866
+ public Material [ ] Materials {
859
867
get {
860
868
if ( ! unityObject ) {
861
869
return null ;
@@ -866,12 +874,14 @@ public Material Material {
866
874
}
867
875
868
876
if ( FbxExporters . EditorTools . ExportSettings . instance . mayaCompatibleNames ) {
869
- renderer . sharedMaterial . name = ConvertToMayaCompatibleName ( renderer . sharedMaterial . name ) ;
877
+ foreach ( var mat in renderer . sharedMaterials ) {
878
+ mat . name = ConvertToMayaCompatibleName ( mat . name ) ;
879
+ }
870
880
}
871
881
872
882
// .material instantiates a new material, which is bad
873
883
// most of the time.
874
- return renderer . sharedMaterial ;
884
+ return renderer . sharedMaterials ;
875
885
}
876
886
}
877
887
0 commit comments