Skip to content

Commit 3bb6f9e

Browse files
committed
glue_bone: DEF-mediator mode
1 parent 540b1f1 commit 3bb6f9e

File tree

1 file changed

+71
-9
lines changed

1 file changed

+71
-9
lines changed

rigs/experimental/glue_bone.py

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import bpy
22

3-
from ...utils import make_constraints_from_string, make_deformer_name
3+
from ...utils import make_constraints_from_string, make_deformer_name, make_mechanism_name
44
from ...utils import strip_org, copy_bone
55

66
from .base_rig import BaseRig
@@ -13,6 +13,7 @@ class Rig(BaseRig):
1313
def __init__(self, obj, bone_name, params):
1414
super().__init__(obj, bone_name, params)
1515

16+
self.glue_mode = params.glue_mode
1617
self.bones['ctrl']['all_ctrls'] = self.get_all_armature_ctrls()
1718

1819
def get_all_armature_ctrls(self):
@@ -65,6 +66,10 @@ def get_ctrls_by_position(self, position, groups=None, relative_error=0):
6566

6667
return bones_in_range
6768

69+
def get_def_by_org(self, org_name):
70+
base_name = strip_org(org_name)
71+
return make_deformer_name(base_name)
72+
6873
def create_def(self):
6974
"""
7075
If add_glue_def is True adds a DEF
@@ -85,8 +90,18 @@ def create_def(self):
8590
edit_bones[def_bone].layers = DEF_LAYER
8691
edit_bones[def_bone].use_deform = True
8792

88-
def make_glue_constraints(self):
93+
def create_mch(self):
94+
bpy.ops.object.mode_set(mode='EDIT')
95+
edit_bones = self.obj.data.edit_bones
96+
97+
mch_bone = make_mechanism_name(strip_org(self.base_bone))
98+
mch_bone = copy_bone(self.obj, self.base_bone, mch_bone)
99+
self.bones['glue_mch'] = mch_bone
100+
101+
DEF_LAYER = [n == 30 for n in range(0, 32)]
102+
edit_bones[mch_bone].layers = DEF_LAYER
89103

104+
def make_glue_constraints(self):
90105
bpy.ops.object.mode_set(mode='OBJECT')
91106
pose_bones = self.obj.pose.bones
92107

@@ -111,18 +126,50 @@ def make_glue_constraints(self):
111126
make_constraints_from_string(owner_pb, target=self.obj, subtarget=tail_ctrls[0],
112127
fstring="DT1.0#ST1.0")
113128

129+
def make_def_mediation(self):
130+
bpy.ops.object.mode_set(mode='EDIT')
131+
edit_bones = self.obj.data.edit_bones
132+
133+
def_parent = self.get_def_by_org(edit_bones[self.base_bone].parent.name)
134+
def_child = ""
135+
for bone in edit_bones[def_parent].children:
136+
if bone.use_connect:
137+
def_child = self.get_def_by_org(bone.name)
138+
139+
if def_child == "":
140+
return
141+
142+
edit_bones[self.bones['glue_mch']].parent = edit_bones[def_parent]
143+
144+
bpy.ops.object.mode_set(mode='OBJECT')
145+
pose_bones = self.obj.pose.bones
146+
147+
owner_pb = pose_bones[self.bones['glue_mch']]
148+
subtarget = def_child
149+
make_constraints_from_string(owner_pb, target=self.obj, subtarget=subtarget,
150+
fstring="CR0.5LLO")
151+
152+
owner_pb = pose_bones[self.base_bone]
153+
subtarget = self.bones['glue_mch']
154+
make_constraints_from_string(owner_pb, target=self.obj, subtarget=subtarget,
155+
fstring="CT1.0WW")
156+
114157
def glue(self):
115158
"""
116159
Glue pass
117160
:return:
118161
"""
119162

120-
self.create_def()
121-
self.make_glue_constraints()
163+
if self.glue_mode == "glue":
164+
self.create_def()
165+
self.make_glue_constraints()
166+
elif self.glue_mode == "def_mediator":
167+
self.create_mch()
168+
self.make_def_mediation()
122169

123170
def generate(self):
124171
"""
125-
Glue bones generate must do nothing. Glue bones pass is meant to happen after all other rigs generated
172+
Glue bones generate must do nothing. Glue bones pass is meant to happen after all other rigs are generated
126173
:return:
127174
"""
128175
return [""]
@@ -177,6 +224,18 @@ def add_parameters(params):
177224
RigifyParameters PropertyGroup
178225
"""
179226

227+
items = [
228+
('def_mediator', 'DEF-mediator', ''),
229+
('glue', 'Glue', '')
230+
]
231+
232+
params.glue_mode = bpy.props.EnumProperty(
233+
items=items,
234+
name="Glue Mode",
235+
description="Glue adds constraints on generated ctrls DEF mediator is a DEF helper",
236+
default='glue'
237+
)
238+
180239
params.glue_string = bpy.props.StringProperty(name="Rigify Glue String",
181240
description="Defines a set of cns between controls")
182241

@@ -187,9 +246,12 @@ def add_parameters(params):
187246

188247
def parameters_ui(layout, params):
189248
""" Create the ui for the rig parameters."""
190-
191249
row = layout.row()
192-
row.prop(params, "glue_string", text="Glue string")
250+
row.prop(params, "glue_mode")
193251

194-
row = layout.row()
195-
row.prop(params, "add_glue_def", text="Add DEF bone")
252+
if params.glue_mode == 'glue':
253+
row = layout.row()
254+
row.prop(params, "glue_string", text="Glue string")
255+
256+
row = layout.row()
257+
row.prop(params, "add_glue_def", text="Add DEF bone")

0 commit comments

Comments
 (0)