1
1
import bpy
2
2
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
4
4
from ...utils import strip_org , copy_bone
5
5
6
6
from .base_rig import BaseRig
@@ -13,6 +13,7 @@ class Rig(BaseRig):
13
13
def __init__ (self , obj , bone_name , params ):
14
14
super ().__init__ (obj , bone_name , params )
15
15
16
+ self .glue_mode = params .glue_mode
16
17
self .bones ['ctrl' ]['all_ctrls' ] = self .get_all_armature_ctrls ()
17
18
18
19
def get_all_armature_ctrls (self ):
@@ -65,6 +66,10 @@ def get_ctrls_by_position(self, position, groups=None, relative_error=0):
65
66
66
67
return bones_in_range
67
68
69
+ def get_def_by_org (self , org_name ):
70
+ base_name = strip_org (org_name )
71
+ return make_deformer_name (base_name )
72
+
68
73
def create_def (self ):
69
74
"""
70
75
If add_glue_def is True adds a DEF
@@ -85,8 +90,18 @@ def create_def(self):
85
90
edit_bones [def_bone ].layers = DEF_LAYER
86
91
edit_bones [def_bone ].use_deform = True
87
92
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
89
103
104
+ def make_glue_constraints (self ):
90
105
bpy .ops .object .mode_set (mode = 'OBJECT' )
91
106
pose_bones = self .obj .pose .bones
92
107
@@ -111,18 +126,50 @@ def make_glue_constraints(self):
111
126
make_constraints_from_string (owner_pb , target = self .obj , subtarget = tail_ctrls [0 ],
112
127
fstring = "DT1.0#ST1.0" )
113
128
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
+
114
157
def glue (self ):
115
158
"""
116
159
Glue pass
117
160
:return:
118
161
"""
119
162
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 ()
122
169
123
170
def generate (self ):
124
171
"""
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
126
173
:return:
127
174
"""
128
175
return ["" ]
@@ -177,6 +224,18 @@ def add_parameters(params):
177
224
RigifyParameters PropertyGroup
178
225
"""
179
226
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
+
180
239
params .glue_string = bpy .props .StringProperty (name = "Rigify Glue String" ,
181
240
description = "Defines a set of cns between controls" )
182
241
@@ -187,9 +246,12 @@ def add_parameters(params):
187
246
188
247
def parameters_ui (layout , params ):
189
248
""" Create the ui for the rig parameters."""
190
-
191
249
row = layout .row ()
192
- row .prop (params , "glue_string" , text = "Glue string " )
250
+ row .prop (params , "glue_mode " )
193
251
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