Rigify: support choosing widgets out of a list in super_copy and pivot.
Register the most generic widgets in the list and add a few more. Use it to assign a nicer looking shoulder widget in human metarigs.
This commit is contained in:
parent
9bc98387d9
commit
b0361dcaac
|
@ -574,6 +574,8 @@ def register():
|
|||
name="Rigify Active Collection",
|
||||
description="The selected rig collection")
|
||||
|
||||
IDStore.rigify_widgets = CollectionProperty(type=RigifyName)
|
||||
|
||||
IDStore.rigify_types = CollectionProperty(type=RigifyName)
|
||||
IDStore.rigify_active_type = IntProperty(name="Rigify Active Type", description="The selected rig type")
|
||||
|
||||
|
|
|
@ -262,13 +262,14 @@ class Generator(base_generate.BaseGenerator):
|
|||
|
||||
|
||||
def __assign_layers(self):
|
||||
bones = self.obj.data.bones
|
||||
pbones = self.obj.pose.bones
|
||||
|
||||
bones[self.root_bone].layers = ROOT_LAYER
|
||||
pbones[self.root_bone].bone.layers = ROOT_LAYER
|
||||
|
||||
# Every bone that has a name starting with "DEF-" make deforming. All the
|
||||
# others make non-deforming.
|
||||
for bone in bones:
|
||||
for pbone in pbones:
|
||||
bone = pbone.bone
|
||||
name = bone.name
|
||||
layers = None
|
||||
|
||||
|
@ -288,7 +289,7 @@ class Generator(base_generate.BaseGenerator):
|
|||
bone.layers = layers
|
||||
|
||||
# Remove custom shapes from non-control bones
|
||||
bone.custom_shape = None
|
||||
pbone.custom_shape = None
|
||||
|
||||
bone.bbone_x = bone.bbone_z = bone.length * 0.05
|
||||
|
||||
|
|
|
@ -530,7 +530,11 @@ def create(obj):
|
|||
pbone.rotation_mode = 'YXZ'
|
||||
pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
|
||||
try:
|
||||
pbone.rigify_parameters.make_widget = False
|
||||
pbone.rigify_parameters.make_widget = True
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
pbone.rigify_parameters.super_copy_widget_type = "shoulder"
|
||||
except AttributeError:
|
||||
pass
|
||||
pbone = obj.pose.bones[bones['shoulder.R']]
|
||||
|
@ -542,7 +546,11 @@ def create(obj):
|
|||
pbone.rotation_mode = 'YXZ'
|
||||
pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
|
||||
try:
|
||||
pbone.rigify_parameters.make_widget = False
|
||||
pbone.rigify_parameters.make_widget = True
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
pbone.rigify_parameters.super_copy_widget_type = "shoulder"
|
||||
except AttributeError:
|
||||
pass
|
||||
pbone = obj.pose.bones[bones['breast.L']]
|
||||
|
|
|
@ -1440,7 +1440,11 @@ def create(obj):
|
|||
pbone.rotation_mode = 'YXZ'
|
||||
pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
|
||||
try:
|
||||
pbone.rigify_parameters.make_widget = False
|
||||
pbone.rigify_parameters.make_widget = True
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
pbone.rigify_parameters.super_copy_widget_type = "shoulder"
|
||||
except AttributeError:
|
||||
pass
|
||||
pbone = obj.pose.bones[bones['shoulder.R']]
|
||||
|
@ -1452,7 +1456,11 @@ def create(obj):
|
|||
pbone.rotation_mode = 'YXZ'
|
||||
pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
|
||||
try:
|
||||
pbone.rigify_parameters.make_widget = False
|
||||
pbone.rigify_parameters.make_widget = True
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
pbone.rigify_parameters.super_copy_widget_type = "shoulder"
|
||||
except AttributeError:
|
||||
pass
|
||||
pbone = obj.pose.bones[bones['breast.L']]
|
||||
|
|
|
@ -24,7 +24,8 @@ 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.widgets import layout_widget_dropdown, create_registered_widget
|
||||
from ...utils.widgets_basic import create_pivot_widget
|
||||
from ...utils.switch_parent import SwitchParentBuilder
|
||||
|
||||
|
||||
|
@ -135,7 +136,7 @@ class Rig(BaseRig):
|
|||
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)
|
||||
create_registered_widget(self.obj, self.bones.ctrl.master, self.params.pivot_master_widget_type or 'cube')
|
||||
|
||||
|
||||
@classmethod
|
||||
|
@ -146,6 +147,12 @@ class Rig(BaseRig):
|
|||
description = "Create a control bone for the copy"
|
||||
)
|
||||
|
||||
params.pivot_master_widget_type = bpy.props.StringProperty(
|
||||
name = "Widget Type",
|
||||
default = 'cube',
|
||||
description = "Choose the type of the widget to create"
|
||||
)
|
||||
|
||||
params.make_parent_switch = bpy.props.BoolProperty(
|
||||
name = "Switchable Parent",
|
||||
default = False,
|
||||
|
@ -183,6 +190,8 @@ class Rig(BaseRig):
|
|||
r.prop(params, "make_extra_control", text="Master Control")
|
||||
|
||||
if params.make_extra_control:
|
||||
layout_widget_dropdown(layout, params, "pivot_master_widget_type")
|
||||
|
||||
layout.prop(params, "make_parent_switch")
|
||||
layout.prop(params, "register_parent")
|
||||
|
||||
|
|
|
@ -23,7 +23,8 @@ import bpy
|
|||
from ...base_rig import BaseRig
|
||||
|
||||
from ...utils.naming import strip_org, make_deformer_name
|
||||
from ...utils.widgets_basic import create_bone_widget, create_circle_widget
|
||||
from ...utils.widgets import layout_widget_dropdown, create_registered_widget
|
||||
from ...utils.widgets_basic import create_bone_widget
|
||||
|
||||
from .raw_copy import RelinkConstraintsMixin
|
||||
|
||||
|
@ -95,7 +96,7 @@ class Rig(BaseRig, RelinkConstraintsMixin):
|
|||
if self.make_control:
|
||||
# Create control widget
|
||||
if self.make_widget:
|
||||
create_circle_widget(self.obj, bones.ctrl, radius=0.5)
|
||||
create_registered_widget(self.obj, bones.ctrl, self.params.super_copy_widget_type or 'circle')
|
||||
else:
|
||||
create_bone_widget(self.obj, bones.ctrl)
|
||||
|
||||
|
@ -117,6 +118,12 @@ class Rig(BaseRig, RelinkConstraintsMixin):
|
|||
description = "Choose a widget for the bone control"
|
||||
)
|
||||
|
||||
params.super_copy_widget_type = bpy.props.StringProperty(
|
||||
name = "Widget Type",
|
||||
default = 'circle',
|
||||
description = "Choose the type of the widget to create"
|
||||
)
|
||||
|
||||
params.make_deform = bpy.props.BoolProperty(
|
||||
name = "Deform",
|
||||
default = True,
|
||||
|
@ -130,13 +137,17 @@ class Rig(BaseRig, RelinkConstraintsMixin):
|
|||
def parameters_ui(self, layout, params):
|
||||
""" Create the ui for the rig parameters.
|
||||
"""
|
||||
r = layout.row()
|
||||
r.prop(params, "make_control")
|
||||
r = layout.row()
|
||||
r.prop(params, "make_widget")
|
||||
r.enabled = params.make_control
|
||||
r = layout.row()
|
||||
r.prop(params, "make_deform")
|
||||
layout.prop(params, "make_control")
|
||||
|
||||
row = layout.split(factor=0.3)
|
||||
row.prop(params, "make_widget")
|
||||
row.enabled = params.make_control
|
||||
|
||||
row2 = row.row(align=True)
|
||||
row2.enabled = params.make_widget
|
||||
layout_widget_dropdown(row2, params, "super_copy_widget_type", text="")
|
||||
|
||||
layout.prop(params, "make_deform")
|
||||
|
||||
self.add_relink_constraints_ui(layout, params)
|
||||
|
||||
|
|
|
@ -206,7 +206,7 @@ class BaseLimbRig(BaseRig):
|
|||
|
||||
@stage.generate_widgets
|
||||
def make_master_control_widget(self):
|
||||
create_gear_widget(self.obj, self.bones.ctrl.master, size=10)
|
||||
create_gear_widget(self.obj, self.bones.ctrl.master, radius=1)
|
||||
|
||||
|
||||
####################################################
|
||||
|
|
|
@ -26,7 +26,7 @@ from itertools import count, repeat
|
|||
|
||||
from rigify.utils.rig import is_rig_base_bone
|
||||
from rigify.utils.naming import strip_org, make_derived_name, choose_derived_bone
|
||||
from rigify.utils.widgets import create_widget
|
||||
from rigify.utils.widgets import widget_generator, register_widget
|
||||
from rigify.utils.widgets_basic import create_bone_widget
|
||||
from rigify.utils.misc import map_list
|
||||
|
||||
|
@ -147,43 +147,7 @@ class Rig(BaseRig):
|
|||
self.make_control_widget(self.bones.ctrl.secondary)
|
||||
|
||||
def make_control_widget(self, ctrl):
|
||||
w = create_widget(self.obj, ctrl)
|
||||
if w is not None:
|
||||
mesh = w.data
|
||||
verts = [
|
||||
(0.1578, 0.0, -0.3),
|
||||
(0.1578, 1.0, -0.2),
|
||||
(-0.1578, 1.0, -0.2),
|
||||
(-0.1578, -0.0, -0.3),
|
||||
(-0.1578, -0.0, 0.3),
|
||||
(-0.1578, 1.0, 0.2),
|
||||
(0.1578, 1.0, 0.2),
|
||||
(0.1578, 0.0, 0.3),
|
||||
(0.1578, 0.25, -0.275),
|
||||
(-0.1578, 0.25, -0.275),
|
||||
(0.1578, 0.75, -0.225),
|
||||
(-0.1578, 0.75, -0.225),
|
||||
(0.1578, 0.75, 0.225),
|
||||
(0.1578, 0.25, 0.275),
|
||||
(-0.1578, 0.25, 0.275),
|
||||
(-0.1578, 0.75, 0.225),
|
||||
]
|
||||
|
||||
if 'Z' in self.palm_rotation_axis:
|
||||
# Flip x/z coordinates
|
||||
verts = [v[::-1] for v in verts]
|
||||
|
||||
edges = [
|
||||
(1, 2), (0, 3), (4, 7), (5, 6),
|
||||
(8, 0), (9, 3), (10, 1), (11, 2),
|
||||
(12, 6), (13, 7), (4, 14), (15, 5),
|
||||
(10, 8), (11, 9), (15, 14), (12, 13),
|
||||
]
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
|
||||
mod = w.modifiers.new("subsurf", 'SUBSURF')
|
||||
mod.levels = 2
|
||||
make_palm_widget(self.obj, ctrl, axis=self.palm_rotation_axis, radius=0.4)
|
||||
|
||||
####################################################
|
||||
# FK controls
|
||||
|
@ -354,6 +318,27 @@ class Rig(BaseRig):
|
|||
layout.prop(params, "make_extra_control", text="Extra FK Controls")
|
||||
|
||||
|
||||
@widget_generator(register="palm", subsurf=2)
|
||||
def make_palm_widget(geom, axis='X', radius=0.5):
|
||||
sx = radius / 0.4
|
||||
sz = radius / 0.3
|
||||
v = [(0.1578, 0.0, -0.3), (0.1578, 1.0, -0.2), (-0.1578, 1.0, -0.2), (-0.1578, -0.0, -0.3),
|
||||
(-0.1578, -0.0, 0.3), (-0.1578, 1.0, 0.2), (0.1578, 1.0, 0.2), (0.1578, 0.0, 0.3),
|
||||
(0.1578, 0.25, -0.275), (-0.1578, 0.25, -0.275), (0.1578, 0.75, -0.225), (-0.1578, 0.75, -0.225),
|
||||
(0.1578, 0.75, 0.225), (0.1578, 0.25, 0.275), (-0.1578, 0.25, 0.275), (-0.1578, 0.75, 0.225)]
|
||||
|
||||
geom.verts = [(x*sx, y, z*sz) for x,y,z in v]
|
||||
|
||||
if 'Z' in axis:
|
||||
# Flip x/z coordinates
|
||||
geom.verts = [v[::-1] for v in geom.verts]
|
||||
|
||||
geom.edges = [(1, 2), (0, 3), (4, 7), (5, 6), (8, 0), (9, 3), (10, 1), (11, 2), (12, 6),
|
||||
(13, 7), (4, 14), (15, 5), (10, 8), (11, 9), (15, 14), (12, 13)]
|
||||
|
||||
register_widget("palm_z", make_palm_widget, axis='Z')
|
||||
|
||||
|
||||
def create_sample(obj):
|
||||
# generated by rigify.utils.write_metarig
|
||||
bpy.ops.object.mode_set(mode='EDIT')
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from mathutils import Matrix
|
||||
from ..utils import create_widget
|
||||
from ..utils.widgets import create_widget, widget_generator
|
||||
|
||||
MODULE_NAME = "super_widgets" # Windows/Mac blender is weird, so __package__ doesn't work
|
||||
|
||||
|
@ -166,16 +166,8 @@ def create_ballsocket_widget(rig, bone_name, size=1.0, bone_transform_name=None)
|
|||
return None
|
||||
|
||||
|
||||
def create_gear_widget(rig, bone_name, size=1.0, bone_transform_name=None):
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj is not None:
|
||||
verts = [(0.11251477152109146*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (0.018439611420035362*size, -4.918176976786981e-09*size, 0.11251477152109146*size), (0.09270283579826355*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (0.08732416480779648*size, -1.5810827092010982e-09*size, 0.03617095574736595*size), (0.07858962565660477*size, -2.295374557093055e-09*size, 0.05251204967498779*size), (0.052511852234601974*size, -3.4352671818282943e-09*size, 0.07858975231647491*size), (0.03617073595523834*size, -3.8170644423018985e-09*size, 0.08732425421476364*size), (0.018439611420035362*size, -4.0521714872454595e-09*size, 0.09270287305116653*size), (0.09402976930141449*size, -2.937612375575327e-09*size, 0.06720473617315292*size), (0.08150213211774826*size, -3.513068946858766e-09*size, 0.08036965131759644*size), (0.06872907280921936*size, -4.0997978345558295e-09*size, 0.09379243850708008*size), (-0.1125146746635437*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (-0.01843959279358387*size, -4.918176976786981e-09*size, 0.11251477152109146*size), (1.078764189088588e-08*size, -4.918176976786981e-09*size, 0.11251477152109146*size), (-0.09270282834768295*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (-0.0873241126537323*size, -1.5810827092010982e-09*size, 0.03617095574736595*size), (-0.07858961820602417*size, -2.295374557093055e-09*size, 0.05251204967498779*size), (-0.05251181498169899*size, -3.4352671818282943e-09*size, 0.07858975231647491*size), (-0.036170728504657745*size, -3.8170644423018985e-09*size, 0.08732425421476364*size), (-0.01843959279358387*size, -4.0521714872454595e-09*size, 0.09270287305116653*size), (-0.09402971714735031*size, -2.937612375575327e-09*size, 0.06720473617315292*size), (-0.08150212466716766*size, -3.513068946858766e-09*size, 0.08036965131759644*size), (-0.06872902065515518*size, -4.0997978345558295e-09*size, 0.09379243850708008*size), (0.11251477152109146*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (0.11251477152109146*size, 3.801315519479033e-16*size, -8.696396491814085e-09*size), (0.018439611420035362*size, 4.918176532697771e-09*size, -0.11251476407051086*size), (0.09270283579826355*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (0.08732416480779648*size, 1.5810828202234006e-09*size, -0.03617095947265625*size), (0.07858962565660477*size, 2.29537477913766e-09*size, -0.05251205340027809*size), (0.052511852234601974*size, 3.435267403872899e-09*size, -0.07858975976705551*size), (0.03617073595523834*size, 3.8170644423018985e-09*size, -0.08732425421476364*size), (0.018439611420035362*size, 4.0521714872454595e-09*size, -0.09270287305116653*size), (0.09402976930141449*size, 2.937614596021376e-09*size, -0.0672047883272171*size), (0.08150213211774826*size, 3.513068946858766e-09*size, -0.08036965131759644*size), (0.06872907280921936*size, 4.099800055001879e-09*size, -0.09379249066114426*size), (-0.1125146746635437*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (-0.1125146746635437*size, 3.801315519479033e-16*size, -8.696396491814085e-09*size), (-0.01843959279358387*size, 4.918176532697771e-09*size, -0.11251476407051086*size), (1.078764189088588e-08*size, 4.918176532697771e-09*size, -0.11251476407051086*size), (-0.09270282834768295*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (-0.0873241126537323*size, 1.5810828202234006e-09*size, -0.03617095947265625*size), (-0.07858961820602417*size, 2.29537477913766e-09*size, -0.05251205340027809*size), (-0.05251181498169899*size, 3.435267403872899e-09*size, -0.07858975976705551*size), (-0.036170728504657745*size, 3.8170644423018985e-09*size, -0.08732425421476364*size), (-0.01843959279358387*size, 4.0521714872454595e-09*size, -0.09270287305116653*size), (-0.09402971714735031*size, 2.937614596021376e-09*size, -0.0672047883272171*size), (-0.08150212466716766*size, 3.513068946858766e-09*size, -0.08036965131759644*size), (-0.06872902065515518*size, 4.099800055001879e-09*size, -0.09379249066114426*size), ]
|
||||
edges = [(0, 2), (0, 24), (7, 1), (13, 1), (3, 2), (4, 3), (6, 5), (7, 6), (9, 8), (10, 9), (10, 5), (4, 8), (11, 14), (11, 36), (19, 12), (13, 12), (15, 14), (16, 15), (18, 17), (19, 18), (21, 20), (22, 21), (22, 17), (16, 20), (23, 26), (23, 24), (31, 25), (38, 25), (27, 26), (28, 27), (30, 29), (31, 30), (33, 32), (34, 33), (34, 29), (28, 32), (35, 39), (35, 36), (44, 37), (38, 37), (40, 39), (41, 40), (43, 42), (44, 43), (46, 45), (47, 46), (47, 42), (41, 45), ]
|
||||
faces = []
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, faces)
|
||||
mesh.update()
|
||||
mesh.update()
|
||||
return obj
|
||||
else:
|
||||
return None
|
||||
@widget_generator(register="gear")
|
||||
def create_gear_widget(geom, *, radius=0.5):
|
||||
size = radius * 10
|
||||
geom.verts = [(0.11251477152109146*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (0.018439611420035362*size, -4.918176976786981e-09*size, 0.11251477152109146*size), (0.09270283579826355*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (0.08732416480779648*size, -1.5810827092010982e-09*size, 0.03617095574736595*size), (0.07858962565660477*size, -2.295374557093055e-09*size, 0.05251204967498779*size), (0.052511852234601974*size, -3.4352671818282943e-09*size, 0.07858975231647491*size), (0.03617073595523834*size, -3.8170644423018985e-09*size, 0.08732425421476364*size), (0.018439611420035362*size, -4.0521714872454595e-09*size, 0.09270287305116653*size), (0.09402976930141449*size, -2.937612375575327e-09*size, 0.06720473617315292*size), (0.08150213211774826*size, -3.513068946858766e-09*size, 0.08036965131759644*size), (0.06872907280921936*size, -4.0997978345558295e-09*size, 0.09379243850708008*size), (-0.1125146746635437*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (-0.01843959279358387*size, -4.918176976786981e-09*size, 0.11251477152109146*size), (1.078764189088588e-08*size, -4.918176976786981e-09*size, 0.11251477152109146*size), (-0.09270282834768295*size, -8.06030631128607e-10*size, 0.01843983121216297*size), (-0.0873241126537323*size, -1.5810827092010982e-09*size, 0.03617095574736595*size), (-0.07858961820602417*size, -2.295374557093055e-09*size, 0.05251204967498779*size), (-0.05251181498169899*size, -3.4352671818282943e-09*size, 0.07858975231647491*size), (-0.036170728504657745*size, -3.8170644423018985e-09*size, 0.08732425421476364*size), (-0.01843959279358387*size, -4.0521714872454595e-09*size, 0.09270287305116653*size), (-0.09402971714735031*size, -2.937612375575327e-09*size, 0.06720473617315292*size), (-0.08150212466716766*size, -3.513068946858766e-09*size, 0.08036965131759644*size), (-0.06872902065515518*size, -4.0997978345558295e-09*size, 0.09379243850708008*size), (0.11251477152109146*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (0.11251477152109146*size, 3.801315519479033e-16*size, -8.696396491814085e-09*size), (0.018439611420035362*size, 4.918176532697771e-09*size, -0.11251476407051086*size), (0.09270283579826355*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (0.08732416480779648*size, 1.5810828202234006e-09*size, -0.03617095947265625*size), (0.07858962565660477*size, 2.29537477913766e-09*size, -0.05251205340027809*size), (0.052511852234601974*size, 3.435267403872899e-09*size, -0.07858975976705551*size), (0.03617073595523834*size, 3.8170644423018985e-09*size, -0.08732425421476364*size), (0.018439611420035362*size, 4.0521714872454595e-09*size, -0.09270287305116653*size), (0.09402976930141449*size, 2.937614596021376e-09*size, -0.0672047883272171*size), (0.08150213211774826*size, 3.513068946858766e-09*size, -0.08036965131759644*size), (0.06872907280921936*size, 4.099800055001879e-09*size, -0.09379249066114426*size), (-0.1125146746635437*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (-0.1125146746635437*size, 3.801315519479033e-16*size, -8.696396491814085e-09*size), (-0.01843959279358387*size, 4.918176532697771e-09*size, -0.11251476407051086*size), (1.078764189088588e-08*size, 4.918176532697771e-09*size, -0.11251476407051086*size), (-0.09270282834768295*size, 8.06031352773573e-10*size, -0.018439847975969315*size), (-0.0873241126537323*size, 1.5810828202234006e-09*size, -0.03617095947265625*size), (-0.07858961820602417*size, 2.29537477913766e-09*size, -0.05251205340027809*size), (-0.05251181498169899*size, 3.435267403872899e-09*size, -0.07858975976705551*size), (-0.036170728504657745*size, 3.8170644423018985e-09*size, -0.08732425421476364*size), (-0.01843959279358387*size, 4.0521714872454595e-09*size, -0.09270287305116653*size), (-0.09402971714735031*size, 2.937614596021376e-09*size, -0.0672047883272171*size), (-0.08150212466716766*size, 3.513068946858766e-09*size, -0.08036965131759644*size), (-0.06872902065515518*size, 4.099800055001879e-09*size, -0.09379249066114426*size), ]
|
||||
geom.edges = [(0, 2), (0, 24), (7, 1), (13, 1), (3, 2), (4, 3), (6, 5), (7, 6), (9, 8), (10, 9), (10, 5), (4, 8), (11, 14), (11, 36), (19, 12), (13, 12), (15, 14), (16, 15), (18, 17), (19, 18), (21, 20), (22, 21), (22, 17), (16, 20), (23, 26), (23, 24), (31, 25), (38, 25), (27, 26), (28, 27), (30, 29), (31, 30), (33, 32), (34, 33), (34, 29), (28, 32), (35, 39), (35, 36), (44, 37), (38, 37), (40, 39), (41, 40), (43, 42), (44, 43), (46, 45), (47, 46), (47, 42), (41, 45), ]
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
import bpy
|
||||
import math
|
||||
import inspect
|
||||
import functools
|
||||
|
||||
from mathutils import Matrix
|
||||
|
@ -95,6 +96,58 @@ def create_widget(rig, bone_name, bone_transform_name=None, *, widget_name=None,
|
|||
return obj
|
||||
|
||||
|
||||
#=============================================
|
||||
# Widget choice dropdown
|
||||
#=============================================
|
||||
|
||||
_registered_widgets = {}
|
||||
|
||||
|
||||
def _get_valid_args(callback, skip):
|
||||
spec = inspect.getfullargspec(callback)
|
||||
return set(spec.args[skip:] + spec.kwonlyargs)
|
||||
|
||||
|
||||
def register_widget(name, callback, **default_args):
|
||||
unwrapped = inspect.unwrap(callback)
|
||||
if unwrapped != callback:
|
||||
valid_args = _get_valid_args(unwrapped, 1)
|
||||
else:
|
||||
valid_args = _get_valid_args(callback, 2)
|
||||
|
||||
_registered_widgets[name] = (callback, valid_args, default_args)
|
||||
|
||||
|
||||
def layout_widget_dropdown(layout, props, prop_name, **kwargs):
|
||||
"Create a UI dropdown to select a widget from the known list."
|
||||
|
||||
id_store = bpy.context.window_manager
|
||||
rigify_widgets = id_store.rigify_widgets
|
||||
|
||||
rigify_widgets.clear()
|
||||
|
||||
for name in sorted(_registered_widgets):
|
||||
item = rigify_widgets.add()
|
||||
item.name = name
|
||||
|
||||
layout.prop_search(props, prop_name, id_store, "rigify_widgets", **kwargs)
|
||||
|
||||
|
||||
def create_registered_widget(obj, bone_name, widget_id, **kwargs):
|
||||
try:
|
||||
callback, valid_args, default_args = _registered_widgets[widget_id]
|
||||
except KeyError:
|
||||
raise MetarigError("Unknown widget name: " + widget_id)
|
||||
|
||||
args = { **default_args, **kwargs }
|
||||
|
||||
return callback(obj, bone_name, **{ k:v for k,v in args.items() if k in valid_args})
|
||||
|
||||
|
||||
#=============================================
|
||||
# Widget geometry
|
||||
#=============================================
|
||||
|
||||
class GeometryData:
|
||||
def __init__(self):
|
||||
self.verts = []
|
||||
|
@ -102,7 +155,10 @@ class GeometryData:
|
|||
self.faces = []
|
||||
|
||||
|
||||
def widget_generator(generate_func):
|
||||
def widget_generator(generate_func=None, *, register=None, subsurf=0):
|
||||
if generate_func is None:
|
||||
return functools.partial(widget_generator, register=register, subsurf=subsurf)
|
||||
|
||||
"""
|
||||
Decorator that encapsulates a call to create_widget, and only requires
|
||||
the actual function to fill the provided vertex and edge lists.
|
||||
|
@ -121,10 +177,18 @@ def widget_generator(generate_func):
|
|||
mesh = obj.data
|
||||
mesh.from_pydata(geom.verts, geom.edges, geom.faces)
|
||||
mesh.update()
|
||||
|
||||
if subsurf:
|
||||
mod = obj.modifiers.new("subsurf", 'SUBSURF')
|
||||
mod.levels = subsurf
|
||||
|
||||
return obj
|
||||
else:
|
||||
return None
|
||||
|
||||
if register:
|
||||
register_widget(register, wrapper)
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
|
|
|
@ -18,55 +18,76 @@
|
|||
|
||||
# <pep8 compliant>
|
||||
|
||||
from .widgets import create_widget
|
||||
from .widgets import create_widget, widget_generator, register_widget
|
||||
|
||||
# Common Widgets
|
||||
|
||||
|
||||
def create_line_widget(rig, bone_name, bone_transform_name=None):
|
||||
""" Creates a basic line widget, a line that spans the length of the bone.
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj is not None:
|
||||
mesh = obj.data
|
||||
mesh.from_pydata([(0, 0, 0), (0, 1, 0)], [(0, 1)], [])
|
||||
mesh.update()
|
||||
@widget_generator(register="line")
|
||||
def create_line_widget(geom):
|
||||
""" Creates a basic line widget, a line that spans the length of the bone. """
|
||||
geom.verts = [(0, 0, 0), (0, 1, 0)]
|
||||
geom.edges = [(0, 1)]
|
||||
|
||||
|
||||
def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, head_tail_x=None, with_line=False, bone_transform_name=None):
|
||||
@widget_generator
|
||||
def create_circle_widget(geom, *, radius=0.5, head_tail=0.0, head_tail_x=None, with_line=False):
|
||||
""" Creates a basic circle widget, a circle around the y-axis.
|
||||
radius: the radius of the circle
|
||||
head_tail: where along the length of the bone the circle is (0.0=head, 1.0=tail)
|
||||
head_tail_x: if not None, specifies a different value along the X axis to create a deformed circle
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj != None:
|
||||
v = [(0.7071068286895752, 2.980232238769531e-07, -0.7071065306663513), (0.8314696550369263, 2.980232238769531e-07, -0.5555699467658997), (0.9238795042037964, 2.682209014892578e-07, -0.3826831877231598), (0.9807852506637573, 2.5331974029541016e-07, -0.19509011507034302), (1.0, 2.365559055306221e-07, 1.6105803979371558e-07), (0.9807853698730469, 2.2351741790771484e-07, 0.19509044289588928), (0.9238796234130859, 2.086162567138672e-07, 0.38268351554870605), (0.8314696550369263, 1.7881393432617188e-07, 0.5555704236030579), (0.7071068286895752, 1.7881393432617188e-07, 0.7071070075035095), (0.5555702447891235, 1.7881393432617188e-07, 0.8314698934555054), (0.38268327713012695, 1.7881393432617188e-07, 0.923879861831665), (0.19509008526802063, 1.7881393432617188e-07, 0.9807855486869812), (-3.2584136988589307e-07, 1.1920928955078125e-07, 1.000000238418579), (-0.19509072601795197, 1.7881393432617188e-07, 0.9807854294776917), (-0.3826838731765747, 1.7881393432617188e-07, 0.9238795638084412), (-0.5555707216262817, 1.7881393432617188e-07, 0.8314695358276367), (-0.7071071863174438, 1.7881393432617188e-07, 0.7071065902709961), (-0.8314700126647949, 1.7881393432617188e-07, 0.5555698871612549), (-0.923879861831665, 2.086162567138672e-07, 0.3826829195022583), (-0.9807853698730469, 2.2351741790771484e-07, 0.1950896978378296), (-1.0, 2.365559907957504e-07, -7.290432222362142e-07), (-0.9807850122451782, 2.5331974029541016e-07, -0.195091113448143), (-0.9238790273666382, 2.682209014892578e-07, -0.38268423080444336), (-0.831468939781189, 2.980232238769531e-07, -0.5555710196495056), (-0.7071058750152588, 2.980232238769531e-07, -0.707107424736023), (-0.555569052696228, 2.980232238769531e-07, -0.8314701318740845), (-0.38268208503723145, 2.980232238769531e-07, -0.923879861831665), (-0.19508881866931915, 2.980232238769531e-07, -0.9807853102684021), (1.6053570561780361e-06, 2.980232238769531e-07, -0.9999997615814209), (0.19509197771549225, 2.980232238769531e-07, -0.9807847142219543), (0.3826850652694702, 2.980232238769531e-07, -0.9238786101341248), (0.5555717945098877, 2.980232238769531e-07, -0.8314683437347412)]
|
||||
delta = (head_tail_x - head_tail) if head_tail_x is not None else 0
|
||||
verts = [(a[0] * radius, head_tail + delta * a[0] * a[0], a[2] * radius) for a in v]
|
||||
if with_line:
|
||||
edges = [(28, 12), (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (0, 31)]
|
||||
else:
|
||||
edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (0, 31)]
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
return obj
|
||||
v = [(0.7071068286895752, 2.980232238769531e-07, -0.7071065306663513), (0.8314696550369263, 2.980232238769531e-07, -0.5555699467658997), (0.9238795042037964, 2.682209014892578e-07, -0.3826831877231598), (0.9807852506637573, 2.5331974029541016e-07, -0.19509011507034302), (1.0, 2.365559055306221e-07, 1.6105803979371558e-07), (0.9807853698730469, 2.2351741790771484e-07, 0.19509044289588928), (0.9238796234130859, 2.086162567138672e-07, 0.38268351554870605), (0.8314696550369263, 1.7881393432617188e-07, 0.5555704236030579), (0.7071068286895752, 1.7881393432617188e-07, 0.7071070075035095), (0.5555702447891235, 1.7881393432617188e-07, 0.8314698934555054), (0.38268327713012695, 1.7881393432617188e-07, 0.923879861831665), (0.19509008526802063, 1.7881393432617188e-07, 0.9807855486869812), (-3.2584136988589307e-07, 1.1920928955078125e-07, 1.000000238418579), (-0.19509072601795197, 1.7881393432617188e-07, 0.9807854294776917), (-0.3826838731765747, 1.7881393432617188e-07, 0.9238795638084412), (-0.5555707216262817, 1.7881393432617188e-07, 0.8314695358276367), (-0.7071071863174438, 1.7881393432617188e-07, 0.7071065902709961), (-0.8314700126647949, 1.7881393432617188e-07, 0.5555698871612549), (-0.923879861831665, 2.086162567138672e-07, 0.3826829195022583), (-0.9807853698730469, 2.2351741790771484e-07, 0.1950896978378296), (-1.0, 2.365559907957504e-07, -7.290432222362142e-07), (-0.9807850122451782, 2.5331974029541016e-07, -0.195091113448143), (-0.9238790273666382, 2.682209014892578e-07, -0.38268423080444336), (-0.831468939781189, 2.980232238769531e-07, -0.5555710196495056), (-0.7071058750152588, 2.980232238769531e-07, -0.707107424736023), (-0.555569052696228, 2.980232238769531e-07, -0.8314701318740845), (-0.38268208503723145, 2.980232238769531e-07, -0.923879861831665), (-0.19508881866931915, 2.980232238769531e-07, -0.9807853102684021), (1.6053570561780361e-06, 2.980232238769531e-07, -0.9999997615814209), (0.19509197771549225, 2.980232238769531e-07, -0.9807847142219543), (0.3826850652694702, 2.980232238769531e-07, -0.9238786101341248), (0.5555717945098877, 2.980232238769531e-07, -0.8314683437347412)]
|
||||
delta = (head_tail_x - head_tail) if head_tail_x is not None else 0
|
||||
geom.verts = [(a[0] * radius, head_tail + delta * a[0] * a[0], a[2] * radius) for a in v]
|
||||
if with_line:
|
||||
geom.edges = [(28, 12), (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (0, 31)]
|
||||
else:
|
||||
return None
|
||||
geom.edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (0, 31)]
|
||||
|
||||
register_widget("circle", create_circle_widget, radius=0.5)
|
||||
|
||||
|
||||
def create_cube_widget(rig, bone_name, radius=0.5, bone_transform_name=None):
|
||||
@widget_generator(register="cube")
|
||||
def create_cube_widget(geom, *, radius=0.5):
|
||||
""" Creates a basic cube widget.
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj is not None:
|
||||
r = radius
|
||||
verts = [(r, r, r), (r, -r, r), (-r, -r, r), (-r, r, r), (r, r, -r), (r, -r, -r), (-r, -r, -r), (-r, r, -r)]
|
||||
edges = [(0, 1), (1, 2), (2, 3), (3, 0), (4, 5), (5, 6), (6, 7), (7, 4), (0, 4), (1, 5), (2, 6), (3, 7)]
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
r = radius
|
||||
geom.verts = [(r, r, r), (r, -r, r), (-r, -r, r), (-r, r, r), (r, r, -r), (r, -r, -r), (-r, -r, -r), (-r, r, -r)]
|
||||
geom.edges = [(0, 1), (1, 2), (2, 3), (3, 0), (4, 5), (5, 6), (6, 7), (7, 4), (0, 4), (1, 5), (2, 6), (3, 7)]
|
||||
|
||||
|
||||
@widget_generator(register="diamond")
|
||||
def create_diamond_widget(geom, *, radius=0.5):
|
||||
"""Creates a basic octahedron widget"""
|
||||
r = radius
|
||||
geom.verts = [(r, 0, 0), (0, -r, 0), (0, r, 0), (0, 0, -r), (0, 0, r), (-r, 0, 0)]
|
||||
geom.edges = [(0, 1), (2, 3), (4, 5), (1, 5), (5, 2), (0, 2), (4, 2), (3, 1), (1, 4), (5, 3), (3, 0), (4, 0)]
|
||||
|
||||
|
||||
@widget_generator(register="cube_truncated")
|
||||
def create_truncated_cube_widget(geom, *, radius=0.5):
|
||||
"""Creates a basic truncated cube widget"""
|
||||
r = radius
|
||||
r3 = radius/3
|
||||
geom.verts = [(r, r3, r), (r, -r3, r), (r3, -r, r), (-r3, -r, r), (-r, -r3, r), (-r, r3, r),
|
||||
(-r3, r, r), (r3, r, r), (r, r3, -r), (r, -r3, -r), (r3, -r, -r), (-r3, -r, -r),
|
||||
(-r, -r3, -r), (-r, r3, -r), (-r3, r, -r), (r3, r, -r), (r, r, r3), (r, r, -r3),
|
||||
(r, -r, r3), (r, -r, -r3), (-r, -r, r3), (-r, -r, -r3), (-r, r, r3), (-r, r, -r3)]
|
||||
geom.edges = [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11), (12, 13), (14, 15), (16, 17), (18, 19),
|
||||
(20, 21), (22, 23), (6, 5), (5, 22), (22, 6), (7, 0), (0, 16), (16, 7), (14, 13), (13, 23),
|
||||
(23, 14), (15, 8), (8, 17), (17, 15), (12, 11), (11, 21), (21, 12), (10, 9), (9, 19), (19, 10),
|
||||
(2, 1), (1, 18), (18, 2), (4, 3), (3, 20), (20, 4)]
|
||||
|
||||
|
||||
@widget_generator(register="cuboctahedron")
|
||||
def create_cuboctahedron_widget(geom, *, radius=0.5):
|
||||
"""Creates a basic cuboctahedron (deeply truncated cube) widget"""
|
||||
r = radius
|
||||
geom.verts = [(r, 0, r), (0, -r, r), (-r, 0, r), (0, r, r), (r, 0, -r), (0, -r, -r),
|
||||
(-r, 0, -r), (0, r, -r), (r, r, 0), (r, -r, 0), (-r, -r, 0), (-r, r, 0)]
|
||||
geom.edges = [(7, 8), (3, 8), (3, 11), (7, 11), (2, 3), (1, 2), (0, 1), (0, 3), (0, 8), (0, 9),
|
||||
(4, 9), (4, 8), (5, 9), (1, 9), (1, 10), (5, 10), (2, 10), (6, 10), (6, 11), (2, 11),
|
||||
(4, 7), (4, 5), (5, 6), (6, 7)]
|
||||
|
||||
|
||||
def create_chain_widget(rig, bone_name, cube=False, radius=0.5, invert=False, bone_transform_name=None, axis="y", offset=0.0):
|
||||
|
@ -92,72 +113,85 @@ def create_chain_widget(rig, bone_name, cube=False, radius=0.5, invert=False, bo
|
|||
return obj
|
||||
|
||||
|
||||
def create_sphere_widget(rig, bone_name, bone_transform_name=None):
|
||||
@widget_generator(register="sphere")
|
||||
def create_sphere_widget(geom, *, radius=0.5):
|
||||
""" Creates a basic sphere widget, three pependicular overlapping circles.
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj != None:
|
||||
verts = [(0.3535533845424652, 0.3535533845424652, 0.0), (0.4619397521018982, 0.19134171307086945, 0.0), (0.5, -2.1855694143368964e-08, 0.0), (0.4619397521018982, -0.19134175777435303, 0.0), (0.3535533845424652, -0.3535533845424652, 0.0), (0.19134174287319183, -0.4619397521018982, 0.0), (7.549790126404332e-08, -0.5, 0.0), (-0.1913416087627411, -0.46193981170654297, 0.0), (-0.35355329513549805, -0.35355350375175476, 0.0), (-0.4619397521018982, -0.19134178757667542, 0.0), (-0.5, 5.962440319251527e-09, 0.0), (-0.4619397222995758, 0.1913418024778366, 0.0), (-0.35355326533317566, 0.35355350375175476, 0.0), (-0.19134148955345154, 0.46193987131118774, 0.0), (3.2584136988589307e-07, 0.5, 0.0), (0.1913420855998993, 0.46193960309028625, 0.0), (7.450580596923828e-08, 0.46193960309028625, 0.19134199619293213), (5.9254205098113744e-08, 0.5, 2.323586443253589e-07), (4.470348358154297e-08, 0.46193987131118774, -0.1913415789604187), (2.9802322387695312e-08, 0.35355350375175476, -0.3535533547401428), (2.9802322387695312e-08, 0.19134178757667542, -0.46193981170654297), (5.960464477539063e-08, -1.1151834122813398e-08, -0.5000000596046448), (5.960464477539063e-08, -0.1913418024778366, -0.46193984150886536), (5.960464477539063e-08, -0.35355350375175476, -0.3535533845424652), (7.450580596923828e-08, -0.46193981170654297, -0.19134166836738586), (9.348272556053416e-08, -0.5, 1.624372103492533e-08), (1.043081283569336e-07, -0.4619397521018982, 0.19134168326854706), (1.1920928955078125e-07, -0.3535533845424652, 0.35355329513549805), (1.1920928955078125e-07, -0.19134174287319183, 0.46193966269493103), (1.1920928955078125e-07, -4.7414250303745575e-09, 0.49999991059303284), (1.1920928955078125e-07, 0.19134172797203064, 0.46193966269493103), (8.940696716308594e-08, 0.3535533845424652, 0.35355329513549805), (0.3535534739494324, 0.0, 0.35355329513549805), (0.1913418173789978, -2.9802322387695312e-08, 0.46193966269493103), (8.303572940349113e-08, -5.005858838558197e-08, 0.49999991059303284), (-0.19134165346622467, -5.960464477539063e-08, 0.46193966269493103), (-0.35355329513549805, -8.940696716308594e-08, 0.35355329513549805), (-0.46193963289260864, -5.960464477539063e-08, 0.19134168326854706), (-0.49999991059303284, -5.960464477539063e-08, 1.624372103492533e-08), (-0.4619397521018982, -2.9802322387695312e-08, -0.19134166836738586), (-0.3535534143447876, -2.9802322387695312e-08, -0.3535533845424652), (-0.19134171307086945, 0.0, -0.46193984150886536), (7.662531942287387e-08, 9.546055501630235e-09, -0.5000000596046448), (0.19134187698364258, 5.960464477539063e-08, -0.46193981170654297), (0.3535535931587219, 5.960464477539063e-08, -0.3535533547401428), (0.4619399905204773, 5.960464477539063e-08, -0.1913415789604187), (0.5000000596046448, 5.960464477539063e-08, 2.323586443253589e-07), (0.4619396924972534, 2.9802322387695312e-08, 0.19134199619293213)]
|
||||
edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (0, 15), (16, 31), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (32, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 38), (38, 39), (39, 40), (40, 41), (41, 42), (42, 43), (43, 44), (44, 45), (45, 46), (46, 47), (32, 47)]
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
geom.verts = [(0.3535533845424652, 0.3535533845424652, 0.0), (0.4619397521018982, 0.19134171307086945, 0.0), (0.5, -2.1855694143368964e-08, 0.0), (0.4619397521018982, -0.19134175777435303, 0.0), (0.3535533845424652, -0.3535533845424652, 0.0), (0.19134174287319183, -0.4619397521018982, 0.0), (7.549790126404332e-08, -0.5, 0.0), (-0.1913416087627411, -0.46193981170654297, 0.0), (-0.35355329513549805, -0.35355350375175476, 0.0), (-0.4619397521018982, -0.19134178757667542, 0.0), (-0.5, 5.962440319251527e-09, 0.0), (-0.4619397222995758, 0.1913418024778366, 0.0), (-0.35355326533317566, 0.35355350375175476, 0.0), (-0.19134148955345154, 0.46193987131118774, 0.0), (3.2584136988589307e-07, 0.5, 0.0), (0.1913420855998993, 0.46193960309028625, 0.0), (7.450580596923828e-08, 0.46193960309028625, 0.19134199619293213), (5.9254205098113744e-08, 0.5, 2.323586443253589e-07), (4.470348358154297e-08, 0.46193987131118774, -0.1913415789604187), (2.9802322387695312e-08, 0.35355350375175476, -0.3535533547401428), (2.9802322387695312e-08, 0.19134178757667542, -0.46193981170654297), (5.960464477539063e-08, -1.1151834122813398e-08, -0.5000000596046448), (5.960464477539063e-08, -0.1913418024778366, -0.46193984150886536), (5.960464477539063e-08, -0.35355350375175476, -0.3535533845424652), (7.450580596923828e-08, -0.46193981170654297, -0.19134166836738586), (9.348272556053416e-08, -0.5, 1.624372103492533e-08), (1.043081283569336e-07, -0.4619397521018982, 0.19134168326854706), (1.1920928955078125e-07, -0.3535533845424652, 0.35355329513549805), (1.1920928955078125e-07, -0.19134174287319183, 0.46193966269493103), (1.1920928955078125e-07, -4.7414250303745575e-09, 0.49999991059303284), (1.1920928955078125e-07, 0.19134172797203064, 0.46193966269493103), (8.940696716308594e-08, 0.3535533845424652, 0.35355329513549805), (0.3535534739494324, 0.0, 0.35355329513549805), (0.1913418173789978, -2.9802322387695312e-08, 0.46193966269493103), (8.303572940349113e-08, -5.005858838558197e-08, 0.49999991059303284), (-0.19134165346622467, -5.960464477539063e-08, 0.46193966269493103), (-0.35355329513549805, -8.940696716308594e-08, 0.35355329513549805), (-0.46193963289260864, -5.960464477539063e-08, 0.19134168326854706), (-0.49999991059303284, -5.960464477539063e-08, 1.624372103492533e-08), (-0.4619397521018982, -2.9802322387695312e-08, -0.19134166836738586), (-0.3535534143447876, -2.9802322387695312e-08, -0.3535533845424652), (-0.19134171307086945, 0.0, -0.46193984150886536), (7.662531942287387e-08, 9.546055501630235e-09, -0.5000000596046448), (0.19134187698364258, 5.960464477539063e-08, -0.46193981170654297), (0.3535535931587219, 5.960464477539063e-08, -0.3535533547401428), (0.4619399905204773, 5.960464477539063e-08, -0.1913415789604187), (0.5000000596046448, 5.960464477539063e-08, 2.323586443253589e-07), (0.4619396924972534, 2.9802322387695312e-08, 0.19134199619293213)]
|
||||
if radius != 0.5:
|
||||
radius /= 0.5
|
||||
geom.verts = [(a[0] * radius, a[1] * radius, a[2] * radius) for a in geom.verts]
|
||||
geom.edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (0, 15), (16, 31), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (32, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 38), (38, 39), (39, 40), (40, 41), (41, 42), (42, 43), (43, 44), (44, 45), (45, 46), (46, 47), (32, 47)]
|
||||
|
||||
|
||||
def create_limb_widget(rig, bone_name, bone_transform_name=None):
|
||||
@widget_generator(register="limb")
|
||||
def create_limb_widget(geom):
|
||||
""" Creates a basic limb widget, a line that spans the length of the
|
||||
bone, with a circle around the center.
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj != None:
|
||||
verts = [(-1.1920928955078125e-07, 1.7881393432617188e-07, 0.0), (3.5762786865234375e-07, 1.0000004768371582, 0.0), (0.1767769455909729, 0.5000001192092896, 0.17677664756774902), (0.20786768198013306, 0.5000001192092896, 0.1388925313949585), (0.23097014427185059, 0.5000001192092896, 0.09567084908485413), (0.24519658088684082, 0.5000001192092896, 0.048772573471069336), (0.2500002384185791, 0.5000001192092896, -2.545945676502015e-09), (0.24519658088684082, 0.5000001192092896, -0.048772573471069336), (0.23097014427185059, 0.5000001192092896, -0.09567084908485413), (0.20786768198013306, 0.5000001192092896, -0.13889259099960327), (0.1767769455909729, 0.5000001192092896, -0.1767767071723938), (0.13889282941818237, 0.5000001192092896, -0.20786744356155396), (0.09567105770111084, 0.5000001192092896, -0.23096990585327148), (0.04877278208732605, 0.5000001192092896, -0.24519634246826172), (1.7279069197684294e-07, 0.5000000596046448, -0.25), (-0.0487724244594574, 0.5000001192092896, -0.24519634246826172), (-0.09567070007324219, 0.5000001192092896, -0.2309698462486267), (-0.13889241218566895, 0.5000001192092896, -0.20786738395690918), (-0.17677652835845947, 0.5000001192092896, -0.17677664756774902), (-0.20786726474761963, 0.5000001192092896, -0.13889244198799133), (-0.23096972703933716, 0.5000001192092896, -0.09567070007324219), (-0.24519610404968262, 0.5000001192092896, -0.04877239465713501), (-0.2499997615814209, 0.5000001192092896, 2.1997936983098043e-07), (-0.24519598484039307, 0.5000001192092896, 0.04877282679080963), (-0.23096948862075806, 0.5000001192092896, 0.09567108750343323), (-0.20786696672439575, 0.5000001192092896, 0.1388927698135376), (-0.1767762303352356, 0.5000001192092896, 0.17677688598632812), (-0.13889199495315552, 0.5000001192092896, 0.2078675627708435), (-0.09567028284072876, 0.5000001192092896, 0.23097002506256104), (-0.048771947622299194, 0.5000001192092896, 0.24519634246826172), (6.555903269145347e-07, 0.5000001192092896, 0.25), (0.04877324402332306, 0.5000001192092896, 0.24519622325897217), (0.09567153453826904, 0.5000001192092896, 0.23096966743469238), (0.13889318704605103, 0.5000001192092896, 0.20786714553833008)]
|
||||
edges = [(0, 1), (2, 3), (4, 3), (5, 4), (5, 6), (6, 7), (8, 7), (8, 9), (10, 9), (10, 11), (11, 12), (13, 12), (14, 13), (14, 15), (16, 15), (16, 17), (17, 18), (19, 18), (19, 20), (21, 20), (21, 22), (22, 23), (24, 23), (25, 24), (25, 26), (27, 26), (27, 28), (29, 28), (29, 30), (30, 31), (32, 31), (32, 33), (2, 33)]
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
geom.verts = [(-1.1920928955078125e-07, 1.7881393432617188e-07, 0.0), (3.5762786865234375e-07, 1.0000004768371582, 0.0), (0.1767769455909729, 0.5000001192092896, 0.17677664756774902), (0.20786768198013306, 0.5000001192092896, 0.1388925313949585), (0.23097014427185059, 0.5000001192092896, 0.09567084908485413), (0.24519658088684082, 0.5000001192092896, 0.048772573471069336), (0.2500002384185791, 0.5000001192092896, -2.545945676502015e-09), (0.24519658088684082, 0.5000001192092896, -0.048772573471069336), (0.23097014427185059, 0.5000001192092896, -0.09567084908485413), (0.20786768198013306, 0.5000001192092896, -0.13889259099960327), (0.1767769455909729, 0.5000001192092896, -0.1767767071723938), (0.13889282941818237, 0.5000001192092896, -0.20786744356155396), (0.09567105770111084, 0.5000001192092896, -0.23096990585327148), (0.04877278208732605, 0.5000001192092896, -0.24519634246826172), (1.7279069197684294e-07, 0.5000000596046448, -0.25), (-0.0487724244594574, 0.5000001192092896, -0.24519634246826172), (-0.09567070007324219, 0.5000001192092896, -0.2309698462486267), (-0.13889241218566895, 0.5000001192092896, -0.20786738395690918), (-0.17677652835845947, 0.5000001192092896, -0.17677664756774902), (-0.20786726474761963, 0.5000001192092896, -0.13889244198799133), (-0.23096972703933716, 0.5000001192092896, -0.09567070007324219), (-0.24519610404968262, 0.5000001192092896, -0.04877239465713501), (-0.2499997615814209, 0.5000001192092896, 2.1997936983098043e-07), (-0.24519598484039307, 0.5000001192092896, 0.04877282679080963), (-0.23096948862075806, 0.5000001192092896, 0.09567108750343323), (-0.20786696672439575, 0.5000001192092896, 0.1388927698135376), (-0.1767762303352356, 0.5000001192092896, 0.17677688598632812), (-0.13889199495315552, 0.5000001192092896, 0.2078675627708435), (-0.09567028284072876, 0.5000001192092896, 0.23097002506256104), (-0.048771947622299194, 0.5000001192092896, 0.24519634246826172), (6.555903269145347e-07, 0.5000001192092896, 0.25), (0.04877324402332306, 0.5000001192092896, 0.24519622325897217), (0.09567153453826904, 0.5000001192092896, 0.23096966743469238), (0.13889318704605103, 0.5000001192092896, 0.20786714553833008)]
|
||||
geom.edges = [(0, 1), (2, 3), (4, 3), (5, 4), (5, 6), (6, 7), (8, 7), (8, 9), (10, 9), (10, 11), (11, 12), (13, 12), (14, 13), (14, 15), (16, 15), (16, 17), (17, 18), (19, 18), (19, 20), (21, 20), (21, 22), (22, 23), (24, 23), (25, 24), (25, 26), (27, 26), (27, 28), (29, 28), (29, 30), (30, 31), (32, 31), (32, 33), (2, 33)]
|
||||
|
||||
|
||||
def create_bone_widget(rig, bone_name, r1=0.1, l1=0.0, r2=0.04, l2=1.0, bone_transform_name=None):
|
||||
@widget_generator(register="bone")
|
||||
def create_bone_widget(geom, *, r1=0.1, l1=0.0, r2=0.04, l2=1.0):
|
||||
""" Creates a basic bone widget, a simple obolisk-esk shape.
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj != None:
|
||||
verts = [(r2, l2, -r2), (r1, l1, -r1), (-r1, l1, -r1), (-r2, l2, -r2), (r2, l2, r2), (r1, l1, r1), (-r1, l1, r1), (-r2, l2, r2)]
|
||||
edges = [(1, 2), (0, 1), (0, 3), (2, 3), (4, 5), (5, 6), (6, 7), (4, 7), (1, 5), (0, 4), (2, 6), (3, 7)]
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
geom.verts = [(r2, l2, -r2), (r1, l1, -r1), (-r1, l1, -r1), (-r2, l2, -r2), (r2, l2, r2), (r1, l1, r1), (-r1, l1, r1), (-r2, l2, r2)]
|
||||
geom.edges = [(1, 2), (0, 1), (0, 3), (2, 3), (4, 5), (5, 6), (6, 7), (4, 7), (1, 5), (0, 4), (2, 6), (3, 7)]
|
||||
|
||||
|
||||
def create_pivot_widget(rig, bone_name, axis_size=1.0, cap_size=1.0, square=True, bone_transform_name=None):
|
||||
@widget_generator(register="pivot")
|
||||
def create_pivot_widget(geom, *, radius=0.5, axis_size=1.0, cap_size=1.0, square=True):
|
||||
"""Creates a widget similar to Plain Axes empty, but with a cross or
|
||||
a square on the end of each axis line.
|
||||
"""
|
||||
obj = create_widget(rig, bone_name, bone_transform_name)
|
||||
if obj is not None:
|
||||
axis = 0.5 * axis_size
|
||||
cap = 0.05 * cap_size
|
||||
if square:
|
||||
verts = [(0, 0, -axis), (-axis, 0, 0), (0, 0, axis), (axis, 0, 0), (axis, cap, -cap), (axis, cap, cap),
|
||||
(0, -axis, 0), (0, axis, 0), (cap, axis, cap), (cap, axis, -cap), (axis, -cap, -cap), (axis, -cap, cap),
|
||||
(-cap, axis, cap), (-cap, axis, -cap), (-axis, cap, cap), (-axis, cap, -cap), (-axis, -cap, cap), (-axis, -cap, -cap),
|
||||
(-cap, -axis, cap), (-cap, -axis, -cap), (cap, -axis, cap), (cap, -axis, -cap), (-cap, -cap, -axis), (-cap, cap, -axis),
|
||||
(cap, -cap, -axis), (cap, cap, -axis), (-cap, cap, axis), (-cap, -cap, axis), (cap, cap, axis), (cap, -cap, axis) ]
|
||||
edges = [(10, 4), (4, 5), (8, 9), (0, 2), (12, 8), (6, 7), (11, 10), (13, 12), (5, 11), (9, 13),
|
||||
(3, 1), (14, 15), (16, 14), (17, 16), (15, 17), (18, 19), (20, 18), (21, 20), (19, 21), (22, 23),
|
||||
(24, 22), (25, 24), (23, 25), (26, 27), (28, 26), (29, 28), (27, 29) ]
|
||||
else:
|
||||
verts = [(0, 0, -axis), (-axis, 0, 0), (0, 0, axis), (axis, 0, 0), (-cap, 0, -axis), (-axis, 0, -cap),
|
||||
(-axis, 0, cap), (-cap, 0, axis), (cap, 0, axis), (axis, 0, cap), (axis, 0, -cap), (cap, 0, -axis),
|
||||
(0, -axis, 0), (0, axis, 0), (0, -cap, -axis), (0, -axis, -cap), (0, -axis, cap), (0, -cap, axis),
|
||||
(0, cap, axis), (0, axis, cap), (0, axis, -cap), (0, cap, -axis), (-axis, -cap, 0), (-cap, -axis, 0),
|
||||
(cap, -axis, 0), (axis, -cap, 0), (axis, cap, 0), (cap, axis, 0), (-cap, axis, 0), (-axis, cap, 0) ]
|
||||
edges = [(4, 0), (6, 1), (8, 2), (10, 3), (1, 5), (2, 7), (3, 9), (0, 11), (16, 12), (0, 21),
|
||||
(2, 17), (20, 13), (12, 15), (0, 2), (18, 2), (13, 19), (12, 13), (1, 29), (22, 1), (3, 25),
|
||||
(13, 27), (14, 0), (26, 3), (28, 13), (24, 12), (12, 23), (3, 1) ]
|
||||
mesh = obj.data
|
||||
mesh.from_pydata(verts, edges, [])
|
||||
mesh.update()
|
||||
return obj
|
||||
axis = radius * axis_size
|
||||
cap = 0.1 * radius * cap_size
|
||||
if square:
|
||||
geom.verts = [(0, 0, -axis), (-axis, 0, 0), (0, 0, axis), (axis, 0, 0), (axis, cap, -cap), (axis, cap, cap),
|
||||
(0, -axis, 0), (0, axis, 0), (cap, axis, cap), (cap, axis, -cap), (axis, -cap, -cap), (axis, -cap, cap),
|
||||
(-cap, axis, cap), (-cap, axis, -cap), (-axis, cap, cap), (-axis, cap, -cap), (-axis, -cap, cap), (-axis, -cap, -cap),
|
||||
(-cap, -axis, cap), (-cap, -axis, -cap), (cap, -axis, cap), (cap, -axis, -cap), (-cap, -cap, -axis), (-cap, cap, -axis),
|
||||
(cap, -cap, -axis), (cap, cap, -axis), (-cap, cap, axis), (-cap, -cap, axis), (cap, cap, axis), (cap, -cap, axis) ]
|
||||
geom.edges = [(10, 4), (4, 5), (8, 9), (0, 2), (12, 8), (6, 7), (11, 10), (13, 12), (5, 11), (9, 13),
|
||||
(3, 1), (14, 15), (16, 14), (17, 16), (15, 17), (18, 19), (20, 18), (21, 20), (19, 21), (22, 23),
|
||||
(24, 22), (25, 24), (23, 25), (26, 27), (28, 26), (29, 28), (27, 29) ]
|
||||
else:
|
||||
return None
|
||||
geom.verts = [(0, 0, -axis), (-axis, 0, 0), (0, 0, axis), (axis, 0, 0), (-cap, 0, -axis), (-axis, 0, -cap),
|
||||
(-axis, 0, cap), (-cap, 0, axis), (cap, 0, axis), (axis, 0, cap), (axis, 0, -cap), (cap, 0, -axis),
|
||||
(0, -axis, 0), (0, axis, 0), (0, -cap, -axis), (0, -axis, -cap), (0, -axis, cap), (0, -cap, axis),
|
||||
(0, cap, axis), (0, axis, cap), (0, axis, -cap), (0, cap, -axis), (-axis, -cap, 0), (-cap, -axis, 0),
|
||||
(cap, -axis, 0), (axis, -cap, 0), (axis, cap, 0), (cap, axis, 0), (-cap, axis, 0), (-axis, cap, 0) ]
|
||||
geom.edges = [(4, 0), (6, 1), (8, 2), (10, 3), (1, 5), (2, 7), (3, 9), (0, 11), (16, 12), (0, 21),
|
||||
(2, 17), (20, 13), (12, 15), (0, 2), (18, 2), (13, 19), (12, 13), (1, 29), (22, 1), (3, 25),
|
||||
(13, 27), (14, 0), (26, 3), (28, 13), (24, 12), (12, 23), (3, 1) ]
|
||||
|
||||
register_widget("pivot_cross", create_pivot_widget, square=False)
|
||||
|
||||
|
||||
@widget_generator(register="shoulder")
|
||||
def create_shoulder_widget(geom, *, radius=0.5):
|
||||
r = radius * 2
|
||||
geom.verts = [(0, 0, 0), (0, 1, 0),
|
||||
(0.41214*r, 0.5+(0.276111-0.5)*r, 0.282165*r), (0.469006*r, 0.5+(0.31436-0.5)*r, 0.168047*r),
|
||||
(0.492711*r, 0.5+(0.370708-0.5)*r, 0.0740018*r), (0.498419*r, 0.5+(0.440597-0.5)*r, 0.0160567*r),
|
||||
(0.5*r, 0.5, 0), (0.498419*r, 0.5+(0.559402-0.5)*r, 0.0160563*r),
|
||||
(0.492712*r, 0.5+(0.629291-0.5)*r, 0.074001*r), (0.469006*r, 0.5+(0.68564-0.5)*r, 0.168046*r),
|
||||
(0.412141*r, 0.5+(0.723889-0.5)*r, 0.282164*r), (0.316952*r, 0.5+(0.742335-0.5)*r, 0.383591*r),
|
||||
(0.207152*r, 0.5+(0.74771-0.5)*r, 0.453489*r), (0.0999976*r, 0.5+(0.74949-0.5)*r, 0.489649*r),
|
||||
(0, 0.5+(0.75-0.5)*r, 0.5*r), (-0.099997*r, 0.5+(0.74949-0.5)*r, 0.489649*r),
|
||||
(-0.207152*r, 0.5+(0.74771-0.5)*r, 0.453489*r), (-0.316951*r, 0.5+(0.742335-0.5)*r, 0.383592*r),
|
||||
(-0.412141*r, 0.5+(0.723889-0.5)*r, 0.282165*r), (-0.469006*r, 0.5+(0.68564-0.5)*r, 0.168046*r),
|
||||
(-0.492711*r, 0.5+(0.629291-0.5)*r, 0.0740011*r), (-0.498419*r, 0.5+(0.559402-0.5)*r, 0.0160563*r),
|
||||
(-0.5*r, 0.5, 0), (-0.498419*r, 0.5+(0.440598-0.5)*r, 0.0160563*r),
|
||||
(-0.492711*r, 0.5+(0.370709-0.5)*r, 0.0740012*r), (-0.469006*r, 0.5+(0.31436-0.5)*r, 0.168047*r),
|
||||
(-0.41214*r, 0.5+(0.276111-0.5)*r, 0.282165*r), (-0.316951*r, 0.5+(0.257665-0.5)*r, 0.383592*r),
|
||||
(-0.207151*r, 0.5+(0.25229-0.5)*r, 0.453489*r), (-0.0999959*r, 0.5+(0.25051-0.5)*r, 0.489649*r),
|
||||
(0, 0.5+(0.25-0.5)*r, 0.5*r), (0.0999986*r, 0.5+(0.25051-0.5)*r, 0.489648*r),
|
||||
(0.207153*r, 0.5+(0.25229-0.5)*r, 0.453488*r), (0.316953*r, 0.5+(0.257665-0.5)*r, 0.38359*r),
|
||||
]
|
||||
geom.edges = [(0, 1), (2, 3), (4, 3), (5, 4), (5, 6), (6, 7), (8, 7), (8, 9), (10, 9), (10, 11),
|
||||
(11, 12), (13, 12), (14, 13), (14, 15), (16, 15), (16, 17), (17, 18), (19, 18), (19, 20), (21, 20),
|
||||
(21, 22), (22, 23), (24, 23), (25, 24), (25, 26), (27, 26), (27, 28), (29, 28), (29, 30), (30, 31),
|
||||
(32, 31), (32, 33), (2, 33), ]
|
||||
|
|
Loading…
Reference in New Issue