Skip to content

Commit 9793a15

Browse files
committed
glue_bones: create a DEF bone conditionally
generate fix: moved gluing to rig generate loop
1 parent baece0b commit 9793a15

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

generate.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,16 @@ def generate_rig(context, metarig):
351351
if scripts is not None:
352352
ui_scripts += [scripts[0]]
353353
t.tick("Generate rigs: ")
354+
355+
# # Do final gluing
356+
for rig in rigs:
357+
if hasattr(rig, "glue"):
358+
# update glue_bone rigs
359+
bpy.ops.object.mode_set(mode='EDIT')
360+
rig = rig.__class__(rig.obj, rig.base_bone, rig.params)
361+
362+
rig.glue()
363+
t.tick("Glue pass")
354364
except Exception as e:
355365
# Cleanup if something goes wrong
356366
print("Rigify: failed to generate rig.")
@@ -524,14 +534,6 @@ def generate_rig(context, metarig):
524534
ctrl = obj.game.controllers[-1]
525535
ctrl.text = bpy.data.texts[script.name]
526536

527-
# # Do final gluing
528-
for rig in rigs:
529-
if hasattr(rig, "make_glue_constraints"):
530-
# update glue_bone rigs
531-
bpy.ops.object.mode_set(mode='EDIT')
532-
rig = rig.__class__(rig.obj, rig.base_bone, rig.params)
533-
rig.make_glue_constraints()
534-
535537
t.tick("The rest: ")
536538
#----------------------------------
537539
# Deconfigure

rigs/experimental/glue_bone.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import bpy
22

3-
from ...utils import make_constraints_from_string
3+
from ...utils import make_constraints_from_string, make_deformer_name
4+
from ...utils import strip_org, copy_bone
45

56
from .base_rig import BaseRig
67

@@ -64,6 +65,22 @@ def get_ctrls_by_position(self, position, groups=None, relative_error=0):
6465

6566
return bones_in_range
6667

68+
def create_def(self):
69+
"""
70+
If add_glue_def is True adds a DEF
71+
:return:
72+
"""
73+
74+
if not self.params.add_glue_def:
75+
return
76+
77+
bpy.ops.object.mode_set(mode='EDIT')
78+
edit_bones = self.obj.data.edit_bones
79+
80+
def_bone = make_deformer_name(strip_org(self.base_bone))
81+
def_bone = copy_bone(self.obj, self.base_bone, def_bone)
82+
self.bones['glue_def'] = def_bone
83+
6784
def make_glue_constraints(self):
6885

6986
bpy.ops.object.mode_set(mode='OBJECT')
@@ -83,6 +100,29 @@ def make_glue_constraints(self):
83100
make_constraints_from_string(owner_pb, target=self.obj, subtarget=head_ctrls[0],
84101
fstring=self.params.glue_string)
85102

103+
if 'glue_def' in self.bones:
104+
owner_pb = pose_bones[self.bones['glue_def']]
105+
make_constraints_from_string(owner_pb, target=self.obj, subtarget=head_ctrls[0],
106+
fstring="CL1.0WW0.0")
107+
make_constraints_from_string(owner_pb, target=self.obj, subtarget=tail_ctrls[0],
108+
fstring="DT1.0#ST1.0")
109+
110+
def glue(self):
111+
"""
112+
Glue pass
113+
:return:
114+
"""
115+
116+
self.create_def()
117+
self.make_glue_constraints()
118+
119+
def generate(self):
120+
"""
121+
Glue bones generate must do nothing. Glue bones pass is meant to happen after all other rigs generated
122+
:return:
123+
"""
124+
return [""]
125+
86126

87127
def create_sample(obj):
88128
# generated by rigify.utils.write_metarig

0 commit comments

Comments
 (0)