@@ -851,6 +851,34 @@ def addMaterial(self):
851851 self .materials .append (materialCopy )
852852 self .materialDict [self .getMaterialKey (materialCopy )] = materialCopy
853853
854+ def deduplicateMaterials (self ):
855+ if len (self .materials ) == 0 :
856+ return
857+
858+ dedupedMaterials : list [bpy .types .Material ] = []
859+ materialIndexRemap : dict [int , int ] = {}
860+ materialByKey : dict [F3DMaterialHash , tuple [int , bpy .types .Material ]] = {}
861+ duplicateMaterials : list [bpy .types .Material ] = []
862+
863+ for index , material in enumerate (self .materials ):
864+ key = self .getMaterialKey (material )
865+ existing = materialByKey .get (key )
866+ if existing is None :
867+ materialByKey [key ] = (len (dedupedMaterials ), material )
868+ materialIndexRemap [index ] = len (dedupedMaterials )
869+ dedupedMaterials .append (material )
870+ else :
871+ materialIndexRemap [index ] = existing [0 ]
872+ if material != existing [1 ]:
873+ duplicateMaterials .append (material )
874+
875+ self .materials = dedupedMaterials
876+ self .triMatIndices = [materialIndexRemap .get (index , 0 ) for index in self .triMatIndices ]
877+
878+ for material in duplicateMaterials :
879+ if material .users == 0 :
880+ bpy .data .materials .remove (material )
881+
854882 def getSizeMacro (self , size : str , suffix : str ):
855883 if hasattr (self .f3d , size ):
856884 return getattr (self .f3d , size + suffix )
@@ -1890,6 +1918,8 @@ def createMesh(self, obj: bpy.types.Object, removeDoubles, importNormals, callDe
18901918 group = obj .vertex_groups .new (name = self .limbToBoneName [groupName ])
18911919 group .add (indices , 1 , "REPLACE" )
18921920
1921+ self .deduplicateMaterials ()
1922+
18931923 for i in range (len (mesh .polygons )):
18941924 mesh .polygons [i ].material_index = self .triMatIndices [i ]
18951925
0 commit comments