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>
This commit is contained in:
2026-08-06 15:55:43 -07:00
parent 3363209cac
commit 3ba86b2ea8
558 changed files with 68622 additions and 8 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

@@ -0,0 +1,2 @@
The female mannequin doesnt include the animations, as duplicating them wouldnt make sense.
You can easily retarget them from the library files in Blender, or even better, directly in your engine, since both mannequins share the same rig and very similar proportions.
Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

@@ -0,0 +1,12 @@
-------------------------------------------------------
License:
CC0 1.0 Universal (CC0 1.0)
Public Domain Dedication
https://creativecommons.org/publicdomain/zero/1.0/
------------------------------------------------------
Models by @Quaternius
Consider supporting me on Patreon!
https://www.patreon.com/quaternius
@@ -0,0 +1,21 @@
The Universal Animation Library comes in two files: the one ending in _RM has root motion baked into every animation, while the other has root motion disabled.
If you ever need to re-export from Blender, just install the included Blender addon (root_motion_toggle.py), which lets you turn root motion on or off.
Explore all the animations in the Animation Viewer!
https://quaternius.com/animviewer.html
-------------------------------------------------------
License:
CC0 1.0 Universal (CC0 1.0)
Public Domain Dedication
https://creativecommons.org/publicdomain/zero/1.0/
------------------------------------------------------
Models by @Quaternius
Consider supporting me on Patreon!
https://www.patreon.com/quaternius
-------------------------------------------------------
Join the Discord Server:
https://discord.gg/vJqnRUYRfT
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

@@ -0,0 +1,87 @@
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()