Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2019-11-02 16:08:26 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2019-11-02 16:09:39 +0300
commit67f1fbca1482d9d9362a4001332e785c3fd5d230 (patch)
tree27cf708ca5fca23bea8cc7e999178e98ca21922a /rigify/rigs/basic/pivot.py
parentdb3e15be7a0f7b403bedb5b762d79e1970a4fc59 (diff)
Rigify: support switchable parents in the basic.pivot rig.
Implement options to generate a parent switch mechanism for the main pivot control, and to register the pivot as a parent for other rigs to use (including support for one level parent injection).
Diffstat (limited to 'rigify/rigs/basic/pivot.py')
-rw-r--r--rigify/rigs/basic/pivot.py129
1 files changed, 111 insertions, 18 deletions
diff --git a/rigify/rigs/basic/pivot.py b/rigify/rigs/basic/pivot.py
index c0625c1a..e5d31659 100644
--- a/rigify/rigs/basic/pivot.py
+++ b/rigify/rigs/basic/pivot.py
@@ -23,7 +23,9 @@ import bpy
from ...base_rig import BaseRig
from ...utils.naming import make_derived_name
+from ...utils.bones import set_bone_widget_transform
from ...utils.widgets_basic import create_cube_widget, create_pivot_widget
+from ...utils.switch_parent import SwitchParentBuilder
class Rig(BaseRig):
@@ -34,54 +36,134 @@ class Rig(BaseRig):
def initialize(self):
self.make_control = self.params.make_extra_control
+ self.make_pivot = self.params.make_control or not self.make_control
self.make_deform = self.params.make_extra_deform
def generate_bones(self):
org = self.bones.org
- self.bones.ctrl.pivot = self.copy_bone(org, make_derived_name(org, 'ctrl'), parent=not self.make_control)
-
if self.make_control:
- self.bones.ctrl.master = self.copy_bone(org, make_derived_name(org, 'ctrl', '_master'), parent=True)
+ self.bones.ctrl.master = name = self.copy_bone(org, make_derived_name(org, 'ctrl'), parent=True)
+
+ if self.make_pivot:
+ self.bones.ctrl.pivot = self.copy_bone(org, make_derived_name(org, 'ctrl', '_pivot'))
+
+ if self.params.make_parent_switch:
+ self.build_parent_switch(name)
+
+ if self.params.register_parent:
+ self.register_parent(name, self.get_parent_tags())
+
+ else:
+ self.bones.ctrl.pivot = self.copy_bone(org, make_derived_name(org, 'ctrl'), parent=True)
if self.make_deform:
self.bones.deform = self.copy_bone(org, make_derived_name(org, 'def'), bbone=True)
+ def build_parent_switch(self, master_name):
+ pbuilder = SwitchParentBuilder(self.generator)
+
+ org_parent = self.get_bone_parent(self.bones.org)
+ parents = [org_parent] if org_parent else []
+
+ pbuilder.build_child(
+ self, master_name,
+ context_rig=self.rigify_parent, allow_self=True,
+ prop_name="Parent ({})".format(master_name),
+ extra_parents=parents, select_parent=org_parent,
+ controls=lambda: self.bones.ctrl.flatten()
+ )
+
+ def get_parent_tags(self):
+ tags = {t.strip() for t in self.params.register_parent_tags.split(',')}
+
+ if self.params.make_parent_switch:
+ tags.add('child')
+
+ tags.discard('')
+ return tags
+
+ def register_parent(self, master_name, tags):
+ pbuilder = SwitchParentBuilder(self.generator)
+
+ inject = self.rigify_parent if 'injected' in tags else None
+
+ pbuilder.register_parent(
+ self, self.bones.org, name=master_name,
+ inject_into=inject, tags=tags
+ )
+
+
def parent_bones(self):
- if self.make_control:
- self.set_bone_parent(self.bones.ctrl.pivot, self.bones.ctrl.master, use_connect=False)
+ ctrl = self.bones.ctrl
+
+ if self.make_pivot:
+ if self.make_control:
+ self.set_bone_parent(ctrl.pivot, ctrl.master, use_connect=False)
- self.set_bone_parent(self.bones.org, self.bones.ctrl.pivot, use_connect=False)
+ self.set_bone_parent(self.bones.org, ctrl.pivot, use_connect=False)
+
+ else:
+ self.set_bone_parent(self.bones.org, ctrl.master, use_connect=False)
if self.make_deform:
self.set_bone_parent(self.bones.deform, self.bones.org, use_connect=False)
def configure_bones(self):
- self.copy_bone_properties(self.bones.org, self.bones.ctrl.pivot)
-
if self.make_control:
self.copy_bone_properties(self.bones.org, self.bones.ctrl.master)
+ else:
+ self.copy_bone_properties(self.bones.org, self.bones.ctrl.pivot)
+
def rig_bones(self):
- self.make_constraint(
- self.bones.org, 'COPY_LOCATION', self.bones.ctrl.pivot,
- space='LOCAL', invert_xyz=(True,)*3
- )
+ if self.make_pivot:
+ self.make_constraint(
+ self.bones.org, 'COPY_LOCATION', self.bones.ctrl.pivot,
+ space='LOCAL', invert_xyz=(True,)*3
+ )
def generate_widgets(self):
- create_pivot_widget(self.obj, self.bones.ctrl.pivot, square=True, axis_size=2.0)
+ if self.make_pivot:
+ create_pivot_widget(self.obj, self.bones.ctrl.pivot, square=True, axis_size=2.0)
if self.make_control:
+ set_bone_widget_transform(self.obj, self.bones.ctrl.master, self.bones.org)
+
create_cube_widget(self.obj, self.bones.ctrl.master, radius=0.5)
@classmethod
def add_parameters(self, params):
+ params.make_control = bpy.props.BoolProperty(
+ name = "Control",
+ default = True,
+ description = "Create a control bone for the copy"
+ )
+
+ params.make_parent_switch = bpy.props.BoolProperty(
+ name = "Switchable Parent",
+ default = False,
+ description = "Allow switching the parent of the master control"
+ )
+
+ params.register_parent = bpy.props.BoolProperty(
+ name = "Register Parent",
+ default = False,
+ description = "Register the control as a switchable parent candidate"
+ )
+
+ params.register_parent_tags = bpy.props.StringProperty(
+ name = "Parent Tags",
+ default = "",
+ description = "Comma-separated tags to use for the registered parent"
+ )
+
params.make_extra_control = bpy.props.BoolProperty(
name = "Extra Control",
default = False,
@@ -98,7 +180,18 @@ class Rig(BaseRig):
@classmethod
def parameters_ui(self, layout, params):
r = layout.row()
- r.prop(params, "make_extra_control", text="Extra Master Control")
+ r.prop(params, "make_extra_control", text="Master Control")
+
+ if params.make_extra_control:
+ layout.prop(params, "make_parent_switch")
+ layout.prop(params, "register_parent")
+
+ r = layout.row()
+ r.active = params.register_parent
+ r.prop(params, "register_parent_tags", text="Tags")
+
+ layout.prop(params, "make_control", text="Pivot Control")
+
r = layout.row()
r.prop(params, "make_extra_deform", text="Deform Bone")
@@ -112,15 +205,15 @@ def create_sample(obj):
bones = {}
- bone = arm.edit_bones.new('Bone')
+ bone = arm.edit_bones.new('pivot')
bone.head[:] = 0.0000, 0.0000, 0.0000
- bone.tail[:] = 0.0000, 0.0000, 0.2000
+ bone.tail[:] = 0.0000, 0.5000, 0.0000
bone.roll = 0.0000
bone.use_connect = False
- bones['Bone'] = bone.name
+ bones['pivot'] = bone.name
bpy.ops.object.mode_set(mode='OBJECT')
- pbone = obj.pose.bones[bones['Bone']]
+ pbone = obj.pose.bones[bones['pivot']]
pbone.rigify_type = 'basic.pivot'
pbone.lock_location = (False, False, False)
pbone.lock_rotation = (False, False, False)