[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25320] trunk/blender/release/scripts/ modules: rigify
Campbell Barton
ideasman42 at gmail.com
Fri Dec 11 17:30:29 CET 2009
Revision: 25320
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25320
Author: campbellbarton
Date: 2009-12-11 17:30:27 +0100 (Fri, 11 Dec 2009)
Log Message:
-----------
rigify
* optional default blend argument, use for better leg & arm defaults
* way to define arbitrary options for bones that can then be passed to the generator function, only used to set elbow target parent at the moment.
Modified Paths:
--------------
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/delta.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/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/rigify/__init__.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/__init__.py 2009-12-11 16:01:47 UTC (rev 25319)
+++ trunk/blender/release/scripts/modules/rigify/__init__.py 2009-12-11 16:30:27 UTC (rev 25320)
@@ -41,19 +41,19 @@
if len(type_pair) == 1:
type_pair = type_pair[0], "main"
- submod_name, func_name = type_pair
+ type_name, func_name = type_pair
# from rigify import leg
try:
- submod = __import__(name="%s.%s" % (__package__, submod_name), fromlist=[submod_name])
+ submod = __import__(name="%s.%s" % (__package__, type_name), fromlist=[type_name])
except ImportError:
- raise RigifyError("python module for type '%s' not found" % submod_name)
+ raise RigifyError("python module for type '%s' not found" % type_name)
reload(submod)
- return submod, getattr(submod, func_name)
+ return type_name, submod, getattr(submod, func_name)
-def submodule_types():
+def get_submodule_types():
import os
submodules = []
files = os.listdir(os.path.dirname(__file__))
@@ -63,7 +63,18 @@
return sorted(submodules)
+def get_bone_type_options(pbone, type_name):
+ options = {}
+ bone_name = pbone.name
+ for key, value in pbone.items():
+ key_pair = key.split(".")
+ 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
+ return options
+
def validate_rig(context, obj):
'''
Makes no changes
@@ -84,11 +95,13 @@
if bone_type.split(".")[0] in SPECIAL_TYPES:
continue
- submod, type_func = submodule_func_from_type(bone_type)
+ type_name, submod, type_func = submodule_func_from_type(bone_type)
reload(submod)
submod.metarig_definition(obj, bone_name)
type_found = True
-
+
+ get_bone_type_options(pbone, bone_type)
+
# missing, - check for duplicate root bone.
if not type_found:
@@ -162,6 +175,7 @@
# ...needed so we can override the root parent
bone_genesis = {}
+
# inspect all bones and assign their definitions before modifying
for pbone in obj.pose.bones:
bone_name = pbone.name
@@ -181,18 +195,17 @@
bone_type_list[:] = []
for bone_type in bone_type_list:
- submod, type_func = submodule_func_from_type(bone_type)
+ type_name, submod, type_func = submodule_func_from_type(bone_type)
reload(submod)
- submod_name = submod.__name__
bone_def_dict = bone_definitions.setdefault(bone_name, {})
# Only calculate bone definitions once
- if submod_name not in bone_def_dict:
- bone_def_dict[submod_name] = submod.metarig_definition(obj, bone_name)
+ if type_name not in bone_def_dict:
+ bone_def_dict[type_name] = submod.metarig_definition(obj, bone_name)
bone_typeinfo = bone_typeinfos.setdefault(bone_name, [])
- bone_typeinfo.append((submod_name, type_func))
+ bone_typeinfo.append((type_name, type_func))
# sort bones, not needed but gives more pradictable execution which may be useful in rare cases
@@ -216,16 +229,17 @@
bone_names_pre = set([bone.name for bone in arm.bones])
- for submod_name, type_func in bone_typeinfos[bone_name]:
+ for type_name, type_func in bone_typeinfos[bone_name]:
# this bones definition of the current typeinfo
- definition = bone_def_dict[submod_name]
+ definition = bone_def_dict[type_name]
+ options = get_bone_type_options(pbone, type_name)
bpy.ops.object.mode_set(mode='EDIT')
- ret = type_func(obj, definition, base_names)
+ ret = type_func(obj, definition, base_names, options)
bpy.ops.object.mode_set(mode='OBJECT')
if ret:
- result_submod = results.setdefault(submod_name, [])
+ result_submod = results.setdefault(type_name, [])
if result_submod and len(result_submod[-1]) != len(ret):
raise Exception("bone lists not compatible: %s, %s" % (result_submod[-1], ret))
@@ -234,7 +248,7 @@
for result_submod in results.values():
# blend 2 chains
- definition = bone_def_dict[submod_name]
+ definition = bone_def_dict[type_name]
if len(result_submod) == 2:
blend_bone_list(obj, definition, result_submod[0], result_submod[1], target_bone=bone_name)
@@ -325,11 +339,15 @@
obj.selected = False
obj_new.selected = True
- for module_name in submodule_types():
+ for module_name in get_submodule_types():
if (metarig_type and module_name != metarig_type):
continue
+
+ # XXX workaround!, problem with updating the pose matrix.
+ if module_name=="delta":
+ continue
- submodule, func = submodule_func_from_type(module_name)
+ type_name, submodule, func = submodule_func_from_type(module_name)
metarig_template = getattr(submodule, "metarig_template", None)
Modified: trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py 2009-12-11 16:01:47 UTC (rev 25319)
+++ trunk/blender/release/scripts/modules/rigify/arm_biped_generic.py 2009-12-11 16:30:27 UTC (rev 25320)
@@ -93,7 +93,10 @@
return mt.names()
-def ik(obj, definitions, base_names):
+def ik(obj, definitions, base_names, options):
+ print(options)
+ arm = obj.data
+
mt = bone_class_instance(obj, METARIG_NAMES)
mt.shoulder, mt.arm, mt.forearm, mt.hand = definitions
mt.update()
@@ -117,6 +120,17 @@
ik.update()
ik.pole_e.local_location = False
+ # option: elbow_parent
+ elbow_parent_name = options.get("elbow_parent", "")
+
+ if elbow_parent_name:
+ try:
+ elbow_parent_e = arm.edit_bones[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)
+ ik.pole_e.parent = elbow_parent_e
+
# update bones after this!
ik.hand_vis = add_stretch_to(obj, mt.hand, ik_chain.hand, "VIS-%s_ik" % base_names[mt.hand])
ik.pole_vis = add_stretch_to(obj, mt.forearm, ik.pole, "VIS-%s_ik" % base_names[mt.forearm])
@@ -162,7 +176,7 @@
return [None] + ik_chain.names()
-def fk(obj, definitions, base_names):
+def fk(obj, definitions, base_names, options):
arm = obj.data
@@ -254,9 +268,9 @@
return None, fk_chain.arm, fk_chain.forearm, fk_chain.hand
-def main(obj, bone_definition, base_names):
- bones_ik = ik(obj, bone_definition, base_names)
- bones_fk = fk(obj, bone_definition, base_names)
+def main(obj, bone_definition, base_names, options):
+ bones_ik = ik(obj, bone_definition, base_names, options)
+ bones_fk = fk(obj, bone_definition, base_names, options)
bpy.ops.object.mode_set(mode='OBJECT')
- blend_bone_list(obj, bone_definition, bones_ik, bones_fk, target_bone=bone_definition[1])
+ blend_bone_list(obj, bone_definition, bones_ik, bones_fk, target_bone=bone_definition[1], blend_default=1.0)
Modified: trunk/blender/release/scripts/modules/rigify/copy.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/copy.py 2009-12-11 16:01:47 UTC (rev 25319)
+++ trunk/blender/release/scripts/modules/rigify/copy.py 2009-12-11 16:30:27 UTC (rev 25320)
@@ -44,7 +44,7 @@
return [orig_bone_name]
-def main(obj, bone_definition, base_names):
+def main(obj, bone_definition, base_names, options):
arm = obj.data
mt = bone_class_instance(obj, METARIG_NAMES)
mt.cpy = bone_definition[0]
Modified: trunk/blender/release/scripts/modules/rigify/delta.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/delta.py 2009-12-11 16:01:47 UTC (rev 25319)
+++ trunk/blender/release/scripts/modules/rigify/delta.py 2009-12-11 16:30:27 UTC (rev 25320)
@@ -75,7 +75,7 @@
return bone_definition
-def main(obj, bone_definition, base_names):
+def main(obj, bone_definition, base_names, options):
'''
Use this bone to define a delta thats applied to its child in pose mode.
'''
Modified: trunk/blender/release/scripts/modules/rigify/finger_curl.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/finger_curl.py 2009-12-11 16:01:47 UTC (rev 25319)
+++ trunk/blender/release/scripts/modules/rigify/finger_curl.py 2009-12-11 16:30:27 UTC (rev 25320)
@@ -20,7 +20,7 @@
import bpy
from rigify import RigifyError
-from rigify_utils import copy_bone_simple, get_side_name, get_base_name, EMPTY_LAYER
+from rigify_utils import copy_bone_simple, get_side_name, get_base_name
from rna_prop_ui import rna_idprop_ui_prop_get
from functools import reduce
@@ -85,22 +85,18 @@
return bone_definition
-def main(obj, bone_definition, base_names):
-
+def main(obj, bone_definition, base_names, options):
# *** EDITMODE
# get assosiated data
arm = obj.data
- orig_pbone = obj.pose.bones[bone_definition[0]]
orig_ebone = arm.edit_bones[bone_definition[0]]
obj.animation_data_create() # needed if its a new armature with no keys
- arm.layer[0] = arm.layer[8] = True
+ children = orig_ebone.children_recursive
+ tot_len = reduce(lambda f, ebone: f + ebone.length, children, orig_ebone.length)
- children = orig_pbone.children_recursive
- tot_len = reduce(lambda f, pbone: f + pbone.bone.length, children, orig_pbone.bone.length)
-
# FIXME, the line below is far too arbitrary
base_name = base_names[bone_definition[0]].rsplit(".", 2)[0]
@@ -116,13 +112,8 @@
# now add bones inbetween this and its children recursively
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list