From 1782e54ff345b00753a31d5937a0731ccd23d94f Mon Sep 17 00:00:00 2001 From: Yusarina Date: Thu, 19 Sep 2024 23:43:25 +0100 Subject: [PATCH] Report to user what we done. --- functions/combine_materials.py | 40 ++++++++++++++++++++++--------- resources/translations/en_US.json | 1 + 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/functions/combine_materials.py b/functions/combine_materials.py index b0bf9df..48ec63f 100644 --- a/functions/combine_materials.py +++ b/functions/combine_materials.py @@ -81,23 +81,30 @@ class AvatarToolKit_OT_CombineMaterials(Operator): init_progress(context, 5) # 5 steps in total update_progress(self, context, t("Optimization.consolidating_materials")) - self.consolidate_materials(meshes) + num_combined = self.consolidate_materials(meshes) update_progress(self, context, t("Optimization.cleaning_material_slots")) - self.clean_material_slots(meshes) + cleaned_slots = self.clean_material_slots(meshes) update_progress(self, context, t("Optimization.cleaning_material_names")) - self.clean_material_names() + cleaned_names = self.clean_material_names() update_progress(self, context, t("Optimization.clearing_unused_data")) - self.clear_unused_data_blocks() + removed_data_blocks = self.clear_unused_data_blocks() update_progress(self, context, t("Optimization.finalizing")) finish_progress(context) + self.report({'INFO'}, t("Optimization.materials_optimization_report").format( + num_combined=num_combined, + num_cleaned_slots=cleaned_slots, + num_cleaned_names=cleaned_names, + num_removed_data_blocks=removed_data_blocks + )) + return {'FINISHED'} - def consolidate_materials(self, meshes: List[Object]) -> None: + def consolidate_materials(self, meshes: List[Object]) -> int: mat_mapping: Dict[str, Material] = {} num_combined: int = 0 for mesh in meshes: @@ -118,21 +125,32 @@ class AvatarToolKit_OT_CombineMaterials(Operator): continue else: mat_mapping[base_name] = mat - - self.report({'INFO'}, t("Optimization.materials_combined").format(num_combined=num_combined)) + return num_combined - def clean_material_slots(self, meshes: List[Object]) -> None: + def clean_material_slots(self, meshes: List[Object]) -> int: + cleaned_slots = 0 for obj in meshes: obj.select_set(True) bpy.context.view_layer.objects.active = obj + initial_slots = len(obj.material_slots) bpy.ops.object.material_slot_remove_unused() + cleaned_slots += initial_slots - len(obj.material_slots) obj.select_set(False) + return cleaned_slots - def clean_material_names(self) -> None: + def clean_material_names(self) -> int: + cleaned_names = 0 for obj in bpy.data.objects: if obj.type == 'MESH': - clean_material_names(obj) + result = clean_material_names(obj) + if result is not None: + cleaned_names += result + return cleaned_names - def clear_unused_data_blocks(self) -> None: + def clear_unused_data_blocks(self) -> int: + initial_count = sum(len(getattr(bpy.data, attr)) for attr in dir(bpy.data) if isinstance(getattr(bpy.data, attr), bpy.types.bpy_prop_collection)) bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) + final_count = sum(len(getattr(bpy.data, attr)) for attr in dir(bpy.data) if isinstance(getattr(bpy.data, attr), bpy.types.bpy_prop_collection)) + return initial_count - final_count + diff --git a/resources/translations/en_US.json b/resources/translations/en_US.json index 40e635e..4101169 100644 --- a/resources/translations/en_US.json +++ b/resources/translations/en_US.json @@ -27,6 +27,7 @@ "Optimization.cleaning_material_names": "Cleaning material names...", "Optimization.cleaning_material_slots": "Cleaning material slots...", "Optimization.clearing_unused_data": "Clearing unused data...", + "Optimization.materials_optimization_report": "Materials optimization completed: Combined {num_combined} materials, cleaned {num_cleaned_slots} material slots, cleaned {num_cleaned_names} material names, and removed {num_removed_data_blocks} unused data blocks", "Optimization.combine_materials.desc": "Combine similar materials to reduce draw calls and improve performance", "Optimization.combine_materials.label": "Combine Materials", "Optimization.consolidating_materials": "Consolidating materials...",