Skip to content

Commit 99f8982

Browse files
committed
add multimaterial per mesh support
1 parent 8815d2c commit 99f8982

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -264,14 +264,13 @@ public FbxDouble3 GetMaterialColor (Material unityMaterial, string unityPropName
264264
/// <summary>
265265
/// Export (and map) a Unity PBS material to FBX classic material
266266
/// </summary>
267-
public FbxSurfaceMaterial ExportMaterial (Material unityMaterial, FbxScene fbxScene, FbxMesh fbxMesh)
267+
public FbxSurfaceMaterial ExportMaterial (Material unityMaterial, FbxScene fbxScene)
268268
{
269269
if (Verbose)
270270
Debug.Log (string.Format ("exporting material {0}", unityMaterial.name));
271271

272272
var materialName = unityMaterial ? unityMaterial.name : "DefaultMaterial";
273273
if (MaterialMap.ContainsKey (materialName)) {
274-
AssignLayerElementMaterial (fbxMesh);
275274
return MaterialMap [materialName];
276275
}
277276

@@ -303,13 +302,11 @@ public FbxSurfaceMaterial ExportMaterial (Material unityMaterial, FbxScene fbxSc
303302
ExportTexture (unityMaterial, "_SpecGlosMap", fbxMaterial, FbxSurfaceMaterial.sSpecular);
304303
}
305304

306-
AssignLayerElementMaterial (fbxMesh);
307-
308305
MaterialMap.Add (materialName, fbxMaterial);
309306
return fbxMaterial;
310307
}
311308

312-
private void AssignLayerElementMaterial(FbxMesh fbxMesh)
309+
private void AssignLayerElementMaterial(FbxMesh fbxMesh, Mesh mesh, Material[] materials)
313310
{
314311
// Add FbxLayerElementMaterial to layer 0 of the node
315312
FbxLayer fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
@@ -320,13 +317,20 @@ private void AssignLayerElementMaterial(FbxMesh fbxMesh)
320317

321318
using (var fbxLayerElement = FbxLayerElementMaterial.Create (fbxMesh, "Material")) {
322319
// Using all same means that the entire mesh uses the same material
323-
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eAllSame);
320+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygon);
324321
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eIndexToDirect);
325322

326323
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetIndexArray ();
324+
fbxElementArray.SetCount (mesh.triangles.Length / 3);
327325

328326
// 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+
}
330334
fbxLayer.SetMaterials (fbxLayerElement);
331335
}
332336
}
@@ -387,8 +391,10 @@ meshInfo.Vertices [v].z*UnitScaleFactor
387391
}
388392
}
389393

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+
}
392398

393399
/*
394400
* Triangles have to be added in reverse order,
@@ -419,6 +425,8 @@ meshInfo.Vertices [v].z*UnitScaleFactor
419425
fbxMesh.EndPolygon ();
420426
}
421427

428+
AssignLayerElementMaterial (fbxMesh, meshInfo.mesh, meshInfo.Materials);
429+
422430
ExportComponentAttributes (meshInfo, fbxMesh, unmergedTriangles);
423431

424432
// set the fbxNode containing the mesh
@@ -855,7 +863,7 @@ public Vector3 [] Binormals {
855863
/// The material used, if any; otherwise null.
856864
/// We don't support multiple materials on one gameobject.
857865
/// </summary>
858-
public Material Material {
866+
public Material[] Materials {
859867
get {
860868
if (!unityObject) {
861869
return null;
@@ -866,12 +874,14 @@ public Material Material {
866874
}
867875

868876
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+
}
870880
}
871881

872882
// .material instantiates a new material, which is bad
873883
// most of the time.
874-
return renderer.sharedMaterial;
884+
return renderer.sharedMaterials;
875885
}
876886
}
877887

0 commit comments

Comments
 (0)