88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
|
|
bl_info = {
|
||
|
|
"name": "Root Motion Toggle",
|
||
|
|
"author": "Quaternius",
|
||
|
|
"version": (1, 0, 0),
|
||
|
|
"blender": (4, 5, 0),
|
||
|
|
"location": "View3D > Sidebar > Root Motion",
|
||
|
|
"description": "Enable or disable root motion muting across all animations",
|
||
|
|
"category": "Animation",
|
||
|
|
}
|
||
|
|
|
||
|
|
import bpy
|
||
|
|
|
||
|
|
|
||
|
|
def set_root_motion_mute(mute: bool):
|
||
|
|
actions_affected = 0
|
||
|
|
|
||
|
|
for action in bpy.data.actions:
|
||
|
|
group = action.groups.get("root")
|
||
|
|
if group is not None:
|
||
|
|
group.mute = mute
|
||
|
|
for fcurve in action.fcurves:
|
||
|
|
if fcurve.group == group:
|
||
|
|
fcurve.mute = mute
|
||
|
|
actions_affected += 1
|
||
|
|
|
||
|
|
return actions_affected
|
||
|
|
|
||
|
|
|
||
|
|
class ROOTMOTION_OT_enable_all(bpy.types.Operator):
|
||
|
|
bl_idname = "rootmotion.enable_all"
|
||
|
|
bl_label = "Enable All Root Motion"
|
||
|
|
bl_description = "Unmute the root bone channel group in all animations"
|
||
|
|
bl_options = {'REGISTER', 'UNDO'}
|
||
|
|
|
||
|
|
def execute(self, context):
|
||
|
|
actions = set_root_motion_mute(False)
|
||
|
|
self.report({'INFO'}, f"Root motion enabled across {actions} action(s)")
|
||
|
|
return {'FINISHED'}
|
||
|
|
|
||
|
|
|
||
|
|
class ROOTMOTION_OT_disable_all(bpy.types.Operator):
|
||
|
|
bl_idname = "rootmotion.disable_all"
|
||
|
|
bl_label = "Disable All Root Motion"
|
||
|
|
bl_description = "Mute the root bone channel group in all animations"
|
||
|
|
bl_options = {'REGISTER', 'UNDO'}
|
||
|
|
|
||
|
|
def execute(self, context):
|
||
|
|
actions = set_root_motion_mute(True)
|
||
|
|
self.report({'INFO'}, f"Root motion disabled across {actions} action(s)")
|
||
|
|
return {'FINISHED'}
|
||
|
|
|
||
|
|
|
||
|
|
class ROOTMOTION_PT_panel(bpy.types.Panel):
|
||
|
|
bl_label = "Root Motion"
|
||
|
|
bl_idname = "ROOTMOTION_PT_panel"
|
||
|
|
bl_space_type = 'VIEW_3D'
|
||
|
|
bl_region_type = 'UI'
|
||
|
|
bl_category = "Root Motion"
|
||
|
|
|
||
|
|
def draw(self, context):
|
||
|
|
layout = self.layout
|
||
|
|
col = layout.column(align=True)
|
||
|
|
col.scale_y = 1.4
|
||
|
|
col.operator("rootmotion.enable_all", text="Enable All Root Motion", icon='PLAY')
|
||
|
|
col.separator(factor=0.5)
|
||
|
|
col.operator("rootmotion.disable_all", text="Disable All Root Motion", icon='PAUSE')
|
||
|
|
|
||
|
|
|
||
|
|
classes = (
|
||
|
|
ROOTMOTION_OT_enable_all,
|
||
|
|
ROOTMOTION_OT_disable_all,
|
||
|
|
ROOTMOTION_PT_panel,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def register():
|
||
|
|
for cls in classes:
|
||
|
|
bpy.utils.register_class(cls)
|
||
|
|
|
||
|
|
|
||
|
|
def unregister():
|
||
|
|
for cls in reversed(classes):
|
||
|
|
bpy.utils.unregister_class(cls)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
register()
|