Skip to content
Snippets Groups Projects
Commit 13bf2bfc authored by Alexander Gavrilov's avatar Alexander Gavrilov
Browse files

Rigify: when using a widget from the metarig, create a linked duplicate.

This preserves the standard widget naming even with custom widgets.
parent ff83176c
No related branches found
No related tags found
No related merge requests found
...@@ -60,15 +60,11 @@ def create_widget(rig, bone_name, bone_transform_name=None, *, widget_name=None, ...@@ -60,15 +60,11 @@ def create_widget(rig, bone_name, bone_transform_name=None, *, widget_name=None,
""" Creates an empty widget object for a bone, and returns the object. """ Creates an empty widget object for a bone, and returns the object.
""" """
assert rig.mode != 'EDIT' assert rig.mode != 'EDIT'
bone = rig.pose.bones[bone_name]
# The bone already has a widget
if bone.custom_shape:
return None
obj_name = widget_name or WGT_PREFIX + rig.name + '_' + bone_name obj_name = widget_name or WGT_PREFIX + rig.name + '_' + bone_name
scene = bpy.context.scene scene = bpy.context.scene
collection = ensure_widget_collection(bpy.context, 'WGTS_' + rig.name) collection = ensure_widget_collection(bpy.context, 'WGTS_' + rig.name)
reuse_mesh = None
# Check if it already exists in the scene # Check if it already exists in the scene
if not widget_force_new: if not widget_force_new:
...@@ -85,14 +81,22 @@ def create_widget(rig, bone_name, bone_transform_name=None, *, widget_name=None, ...@@ -85,14 +81,22 @@ def create_widget(rig, bone_name, bone_transform_name=None, *, widget_name=None,
if obj_name in bpy.data.objects: if obj_name in bpy.data.objects:
bpy.data.objects.remove(bpy.data.objects[obj_name]) bpy.data.objects.remove(bpy.data.objects[obj_name])
# Create a linked duplicate of the widget assigned in the metarig
reuse_widget = rig.pose.bones[bone_name].custom_shape
if reuse_widget:
reuse_mesh = reuse_widget.data
# Create mesh object # Create mesh object
mesh = bpy.data.meshes.new(obj_name) mesh = reuse_mesh or bpy.data.meshes.new(obj_name)
obj = bpy.data.objects.new(obj_name, mesh) obj = bpy.data.objects.new(obj_name, mesh)
collection.objects.link(obj) collection.objects.link(obj)
# Move object to bone position and set layers # Move object to bone position and set layers
obj_to_bone(obj, rig, bone_name, bone_transform_name) obj_to_bone(obj, rig, bone_name, bone_transform_name)
if reuse_mesh:
return None
return obj return obj
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment