import bpy from bpy.types import Operator, Panel class VIEW3D_PT_ClothSoftBodyCacheBakeStatusPanel(Panel): bl_label = "Cloth & Soft Body Cache Bake Status" bl_idname = "VIEW3D_PT_cloth_softbody_cache_bake_status" bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'Tools' def draw(self, context): layout = self.layout # Bake 버튼 추가 layout.operator("script.bake_all_cloth_softbody") # Cache 삭제 버튼 추가 layout.operator("script.clear_all_cloth_softbody_cache") # Bake 결과 보기 버튼 추가 layout.operator("script.view_bake_results") # 결과를 출력 cloth_softbody_objects_info = self.get_cloth_softbody_objects_info() if cloth_softbody_objects_info: for obj_info in cloth_softbody_objects_info: obj_name = obj_info['object'].name row = layout.row(align=True) row.label(text=f"Object: {obj_name}") if obj_info['cloth_modifier']: cloth_bake_status = "Baked" if obj_info['cloth_modifier'].point_cache.is_baked else "Not Baked" row.label(text=f"Cloth: {cloth_bake_status}") if obj_info['softbody_modifier']: softbody_bake_status = "Baked" if obj_info['softbody_modifier'].point_cache.is_baked else "Not Baked" row.label(text=f"Soft Body: {softbody_bake_status}") else: layout.label(text="No Cloth or Soft Body objects found in the scene.") def get_cloth_softbody_objects_info(self): # 모든 객체에 대한 정보를 담을 리스트 cloth_softbody_objects_info = [] # 현재 씬의 모든 객체를 가져옴 all_objects = bpy.data.objects # 모든 객체를 순회하면서 cloth soft body인지 확인 for obj in all_objects: if obj.type == 'MESH' and obj.data: cloth_modifier = None softbody_modifier = None for modifier in obj.modifiers: if modifier.type == 'CLOTH': cloth_modifier = modifier elif modifier.type == 'SOFT_BODY': softbody_modifier = modifier if cloth_modifier or softbody_modifier: # 객체와 해당 Cloth Modifier, Soft Body Modifier의 정보를 저장 cloth_softbody_objects_info.append({ 'object': obj, 'cloth_modifier': cloth_modifier, 'softbody_modifier': softbody_modifier, }) return cloth_softbody_objects_info class SCRIPT_OT_BakeAllClothSoftbody(Operator): bl_idname = "script.bake_all_cloth_softbody" bl_label = "Bake All Cloth & Soft Body" def execute(self, context): # 모든 객체에 대한 정보를 가져옴 all_objects = bpy.data.objects # 모든 객체를 순회하면서 cloth soft body인지 확인하고 bake 수행 for obj in all_objects: for modifier in obj.modifiers: if modifier.type in {'CLOTH', 'SOFT_BODY'}: modifier.point_cache.frame_start = context.scene.frame_start modifier.point_cache.frame_end = context.scene.frame_end bpy.ops.ptcache.bake_all(bake=True) self.report({'INFO'}, "All Cloth & Soft Body cache baked successfully.") return {'FINISHED'} class SCRIPT_OT_ClearAllClothSoftbodyCache(Operator): bl_idname = "script.clear_all_cloth_softbody_cache" bl_label = "Clear All Cloth & Soft Body Cache" def execute(self, context): # 모든 객체에 대한 정보를 가져옴 all_objects = bpy.data.objects # 모든 객체를 순회하면서 cloth soft body인지 확인하고 cache 삭제 수행 for obj in all_objects: for modifier in obj.modifiers: if modifier.type in {'CLOTH', 'SOFT_BODY'}: if modifier.point_cache: ctx = bpy.context.copy() ctx['active_object'] = obj bpy.ops.ptcache.free_bake_all() self.report({'INFO'}, "All Cloth & Soft Body cache cleared successfully.") return {'FINISHED'} class SCRIPT_OT_ViewBakeResults(Operator): bl_idname = "script.view_bake_results" bl_label = "Check Cache Bake Status" def execute(self, context): return {'FINISHED'} def register(): bpy.utils.register_class(VIEW3D_PT_ClothSoftBodyCacheBakeStatusPanel) bpy.utils.register_class(SCRIPT_OT_BakeAllClothSoftbody) bpy.utils.register_class(SCRIPT_OT_ClearAllClothSoftbodyCache) bpy.utils.register_class(SCRIPT_OT_ViewBakeResults) def unregister(): bpy.utils.unregister_class(VIEW3D_PT_ClothSoftBodyCacheBakeStatusPanel) bpy.utils.unregister_class(SCRIPT_OT_BakeAllClothSoftbody) bpy.utils.unregister_class(SCRIPT_OT_ClearAllClothSoftbodyCache) bpy.utils.unregister_class(SCRIPT_OT_ViewBakeResults) if __name__ == "__main__": register()