From 13bf2bfc39128cc2f7c5906a53d89de1a0f18f29 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov <angavrilov@gmail.com> Date: Wed, 9 Dec 2020 17:46:49 +0300 Subject: [PATCH] Rigify: when using a widget from the metarig, create a linked duplicate. This preserves the standard widget naming even with custom widgets. --- rigify/utils/widgets.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/rigify/utils/widgets.py b/rigify/utils/widgets.py index f39fa206c..964d62570 100644 --- a/rigify/utils/widgets.py +++ b/rigify/utils/widgets.py @@ -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. """ 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 scene = bpy.context.scene collection = ensure_widget_collection(bpy.context, 'WGTS_' + rig.name) + reuse_mesh = None # Check if it already exists in the scene if not widget_force_new: @@ -85,14 +81,22 @@ def create_widget(rig, bone_name, bone_transform_name=None, *, widget_name=None, if obj_name in bpy.data.objects: 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 - 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) collection.objects.link(obj) # Move object to bone position and set layers obj_to_bone(obj, rig, bone_name, bone_transform_name) + if reuse_mesh: + return None + return obj -- GitLab