Files
animation/UAL-Lib/Universal Animation Library 2[Source]/root_motion_toggle.py
T
jeremy 3ba86b2ea8 feat: clothing lane, character sources, and DCC bridges
Bulk import of the working lanes that were living untracked on the PC.

Content:
- characters/  Lena/male body lanes, bakes, texture work, run logs
- clothing/    garment pipeline, configs, gates, contract docs
- garments/    MD-authored garment sources (.zprj/.zpac)
- UAL-Lib/     Universal Animation Library 2 source (.blend/.fbx/.glb)
- tools/       blender_bridge, iclone_bridge, md_bridge, tailor, glm_agent
- docs/, plans/, dev/, .agents/plans/

Repo hygiene:
- .gitattributes: LFS now covers .blend, .zprj, .zpac, .obj, .npy and the
  Reallusion .iAvatar/.ccAvatar/.ccRestore containers. Without this the
  ~3.8 GB in this commit would land as raw blobs. .png/.jpg are left out
  on purpose — ~250 are already tracked raw and converting them would
  rewrite every one without shrinking history.
- .gitignore: exclude /accurig/ (~1 GB AccuRig program files, redistributable
  from Reallusion, nothing authored here) and /dev/null/ (git-lfs hook copies
  dropped by a `>/dev/null` redirect on Windows).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 15:55:43 -07:00

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()