[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25870] trunk/blender/release/scripts/ modules: patch from Cessen, update to metarigs and some changes to the rigging main loop.
Campbell Barton
ideasman42 at gmail.com
Sun Jan 10 19:53:17 CET 2010
Revision: 25870
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25870
Author: campbellbarton
Date: 2010-01-10 19:53:15 +0100 (Sun, 10 Jan 2010)
Log Message:
-----------
patch from Cessen, update to metarigs and some changes to the rigging main loop.
- property names dont need the bone type prefix anymore
- always add a root bone that all non parented bones are parented to
- x/y/z axis properties for bones.
Modified Paths:
--------------
trunk/blender/release/scripts/modules/bpy_types.py
trunk/blender/release/scripts/modules/rigify/__init__.py
trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py
trunk/blender/release/scripts/modules/rigify/copy.py
trunk/blender/release/scripts/modules/rigify/finger_curl.py
trunk/blender/release/scripts/modules/rigify/leg_biped_generic.py
trunk/blender/release/scripts/modules/rigify/leg_quadruped_generic.py
trunk/blender/release/scripts/modules/rigify/neck_flex.py
trunk/blender/release/scripts/modules/rigify/palm_curl.py
trunk/blender/release/scripts/modules/rigify/spine_pivot_flex.py
trunk/blender/release/scripts/modules/rigify_utils.py
Modified: trunk/blender/release/scripts/modules/bpy_types.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy_types.py 2010-01-10 16:29:53 UTC (rev 25869)
+++ trunk/blender/release/scripts/modules/bpy_types.py 2010-01-10 18:53:15 UTC (rev 25870)
@@ -19,6 +19,7 @@
# <pep8 compliant>
from _bpy import types as bpy_types
+from Mathutils import Vector
StructRNA = bpy_types.Struct.__bases__[0]
# StructRNA = bpy_types.Struct
@@ -88,6 +89,24 @@
i += 1
return 0
+
+ @property
+ def x_axis(self):
+ """ Vector pointing down the x-axis of the bone.
+ """
+ return self.matrix.rotationPart() * Vector(1,0,0)
+
+ @property
+ def y_axis(self):
+ """ Vector pointing down the x-axis of the bone.
+ """
+ return self.matrix.rotationPart() * Vector(0,1,0)
+
+ @property
+ def z_axis(self):
+ """ Vector pointing down the x-axis of the bone.
+ """
+ return self.matrix.rotationPart() * Vector(0,0,1)
@property
def basename(self):
Modified: trunk/blender/release/scripts/modules/rigify/__init__.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/__init__.py 2010-01-10 16:29:53 UTC (rev 25869)
+++ trunk/blender/release/scripts/modules/rigify/__init__.py 2010-01-10 18:53:15 UTC (rev 25870)
@@ -28,11 +28,17 @@
ORG_LAYERS = [n==31 for n in range(0,32)]
MCH_LAYERS = [n==30 for n in range(0,32)]
-DEF_LAYERS = [n==29 for n in range(0,32)]
+DEF_LAYERS = [n==29 for n in range(0,32)]
+ROOT_LAYERS = [n==28 for n in range(0,32)]
+ORG_PREFIX = "ORG-"
+MCH_PREFIX = "MCH-"
+DEF_PREFIX = "DEF-"
+WGT_PREFIX = "WGT-"
+
class RigifyError(Exception):
"""Exception raised for errors in the metarig.
"""
@@ -79,11 +85,15 @@
options = {}
bone_name = pbone.name
for key, value in pbone.items():
- key_pair = key.split(".")
+ key_pair = key.rsplit(".")
+ # get all bone properties
+ """"
if key_pair[0] == type_name:
if len(key_pair) != 2:
raise RigifyError("option error for bone '%s', property name was not a pair '%s'" % (bone_name, key_pair))
options[key_pair[1]] = value
+ """
+ options[key] = value
return options
@@ -174,18 +184,22 @@
arm = obj.data
- # original name mapping
+ # prepend the ORG prefix to the bones, and create the base_names mapping
base_names = {}
-
- # add all new parentless children to this bone
- root_bone = None
-
bpy.ops.object.mode_set(mode='EDIT')
for bone in arm.edit_bones:
bone_name = bone.name
- if obj.pose.bones[bone_name].get("type", "") != "root":
- bone.name = prefix + bone_name
- base_names[bone.name] = bone_name # new -> old mapping
+ bone.name = ORG_PREFIX + bone_name
+ base_names[bone.name] = bone_name
+
+ # create root_bone
+ bpy.ops.object.mode_set(mode='EDIT')
+ edit_bone = obj.data.edit_bones.new("root")
+ root_bone = edit_bone.name
+ edit_bone.head = (0.0, 0.0, 0.0)
+ edit_bone.tail = (0.0, 1.0, 0.0)
+ edit_bone.roll = 0.0
+ edit_bone.layer = ROOT_LAYERS
bpy.ops.object.mode_set(mode='OBJECT')
# key: bone name
@@ -218,12 +232,6 @@
else:
bone_type_list = []
- if bone_type_list == ["root"]: # special case!
- if root_bone:
- raise RigifyError("cant have more then 1 root bone, found '%s' and '%s' to have type==root" % (root_bone, bone_name))
- root_bone = bone_name
- bone_type_list[:] = []
-
for bone_type in bone_type_list:
type_name, submod, type_func = submodule_func_from_type(bone_type)
reload(submod)
@@ -292,9 +300,11 @@
# need a reverse lookup on bone_genesis so as to know immediately
# where a bone comes from
bone_genesis_reverse = {}
+ '''
for bone_name, bone_children in bone_genesis.items():
for bone_child_name in bone_children:
bone_genesis_reverse[bone_child_name] = bone_name
+ '''
if root_bone:
@@ -304,6 +314,9 @@
root_ebone = arm.edit_bones[root_bone]
for ebone in arm.edit_bones:
bone_name = ebone.name
+ if ebone.parent is None:
+ ebone.parent = root_ebone
+ '''
if ebone.parent is None and bone_name not in base_names:
# check for override
bone_creator = bone_genesis_reverse[bone_name]
@@ -317,6 +330,7 @@
ebone.connected = False
ebone.parent = root_ebone_tmp
+ '''
bpy.ops.object.mode_set(mode='OBJECT')
@@ -348,18 +362,22 @@
for bone_name, bone in arm.bones.items():
bone.deform = False # Non DEF bones shouldn't deform
- if bone_name.startswith(prefix):
+ if bone_name.startswith(ORG_PREFIX):
bone.layer = ORG_LAYERS
- elif bone_name.startswith("MCH-"): # XXX fixme
+ elif bone_name.startswith(MCH_PREFIX): # XXX fixme
bone.layer = MCH_LAYERS
- elif bone_name.startswith("DEF-"): # XXX fixme
+ elif bone_name.startswith(DEF_PREFIX): # XXX fixme
bone.layer = DEF_LAYERS
bone.deform = True
+ else:
+ # Assign bone appearance if there is a widget for it
+ obj.pose.bones[bone_name].custom_shape = context.scene.objects.get(WGT_PREFIX+bone_name)
layer_tot[:] = [max(lay) for lay in zip(layer_tot, bone.layer)]
# Only for demo'ing
- arm.layer = layer_tot
+ layer_show = [a and not (b or c or d) for a,b,c,d in zip(layer_tot, ORG_LAYERS, MCH_LAYERS, DEF_LAYERS)]
+ arm.layer = layer_show
# obj.restrict_view = True
Modified: trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py 2010-01-10 16:29:53 UTC (rev 25869)
+++ trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py 2010-01-10 18:53:15 UTC (rev 25870)
@@ -20,7 +20,7 @@
import bpy
from math import radians
-from rigify import RigifyError, get_layer_dict
+from rigify import RigifyError, get_layer_dict, ORG_PREFIX
from rigify_utils import bone_class_instance, copy_bone_simple, add_pole_target_bone, add_stretch_to, blend_bone_list, get_side_name, get_base_name
from rna_prop_ui import rna_idprop_ui_prop_get
from Mathutils import Vector
@@ -126,7 +126,7 @@
if elbow_parent_name:
try:
- elbow_parent_e = arm.edit_bones[elbow_parent_name]
+ elbow_parent_e = arm.edit_bones[ORG_PREFIX + elbow_parent_name]
except:
# TODO, old/new parent mapping
raise RigifyError("parent bone from property 'arm_biped_generic.elbow_parent' not found '%s'" % elbow_parent_name)
@@ -165,14 +165,15 @@
con.pole_angle = -90.0 # XXX, RAD2DEG
# last step setup layers
- layers = get_layer_dict(options)
- lay = layers["ik"]
- for attr in ik_chain.attr_names:
- getattr(ik_chain, attr + "_b").layer = lay
- for attr in ik.attr_names:
- getattr(ik, attr + "_b").layer = lay
+ if "ik_layer" in options:
+ layer = [n==options["ik_layer"] for n in range(0,32)]
+ else:
+ layer = list(mt.arm_b.layer)
+ ik_chain.hand_b.layer = layer
+ ik.hand_vis_b.layer = layer
+ ik.pole_b.layer = layer
+ ik.pole_vis_b.layer = layer
-
bpy.ops.object.mode_set(mode='EDIT')
# don't blend the shoulder
return [None] + ik_chain.names()
@@ -200,9 +201,9 @@
ex.socket_e.parent = mt.shoulder_e
ex.socket_e.length *= 0.5
- # insert the 'DLT-hand', between the forearm and the hand
+ # insert the 'MCH-delta_hand', between the forearm and the hand
# copies forarm rotation
- ex.hand_delta_e = copy_bone_simple(arm, fk_chain.hand, "DLT-%s" % base_names[mt.hand], parent=True)
+ ex.hand_delta_e = copy_bone_simple(arm, fk_chain.hand, "MCH-delta_%s" % base_names[mt.hand], parent=True)
ex.hand_delta = ex.hand_delta_e.name
ex.hand_delta_e.length *= 0.5
ex.hand_delta_e.connected = False
@@ -267,18 +268,15 @@
hinge_setup()
-
# last step setup layers
- layers = get_layer_dict(options)
- lay = layers["fk"]
- for attr in fk_chain.attr_names:
- getattr(fk_chain, attr + "_b").layer = lay
+ if "fk_layer" in options:
+ layer = [n==options["fk_layer"] for n in range(0,32)]
+ else:
+ layer = list(mt.arm_b.layer)
+ fk_chain.arm_b.layer = layer
+ fk_chain.forearm_b.layer = layer
+ fk_chain.hand_b.layer = layer
- lay = layers["extra"]
- for attr in ex.attr_names:
- getattr(ex, attr + "_b").layer = lay
-
-
bpy.ops.object.mode_set(mode='EDIT')
return None, fk_chain.arm, fk_chain.forearm, fk_chain.hand
@@ -378,4 +376,3 @@
bpy.ops.object.mode_set(mode='OBJECT')
blend_bone_list(obj, bone_definition, bones_fk, bones_ik, target_bone=bones_ik[3], target_prop="ik", blend_default=0.0)
-
Modified: trunk/blender/release/scripts/modules/rigify/copy.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/copy.py 2010-01-10 16:29:53 UTC (rev 25869)
+++ trunk/blender/release/scripts/modules/rigify/copy.py 2010-01-10 18:53:15 UTC (rev 25870)
@@ -69,10 +69,12 @@
return (bone_name,)
-def main(obj, bone_definition, base_names, options):
+def control(obj, definitions, base_names, options):
+ bpy.ops.object.mode_set(mode='EDIT')
+
arm = obj.data
mt = bone_class_instance(obj, METARIG_NAMES)
- mt.cpy = bone_definition[0]
+ mt.cpy = definitions[0]
mt.update()
cp = bone_class_instance(obj, ["cpy"])
cp.cpy_e = copy_bone_simple(arm, mt.cpy, base_names[mt.cpy], parent=True)
@@ -96,12 +98,17 @@
cp.cpy_p.lock_rotation_w = mt.cpy_p.lock_rotation_w
cp.cpy_p.lock_scale = tuple(mt.cpy_p.lock_scale)
+ # Layers
+ cp.cpy_b.layer = list(mt.cpy_b.layer)
+
+ return (mt.cpy,)
+
+
+def main(obj, bone_definition, base_names, options):
+ # Create control bone
+ cpy = control(obj, bone_definition, base_names, options)[0]
# Create deform bone
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list