[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