[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24949] trunk/blender: new palm rig type + some refactoring to make names less confusing for the arm rig

Campbell Barton ideasman42 at gmail.com
Fri Nov 27 14:24:05 CET 2009


Revision: 24949
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24949
Author:   campbellbarton
Date:     2009-11-27 14:24:04 +0100 (Fri, 27 Nov 2009)

Log Message:
-----------
new palm rig type + some refactoring to make names less confusing for the arm rig
linked text would not run

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/rigify.py
    trunk/blender/source/blender/editors/space_text/text_ops.c

Modified: trunk/blender/release/scripts/modules/rigify.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify.py	2009-11-27 12:50:08 UTC (rev 24948)
+++ trunk/blender/release/scripts/modules/rigify.py	2009-11-27 13:24:04 UTC (rev 24949)
@@ -25,7 +25,50 @@
 
 empty_layer = [False] * 16
 
+def auto_class(slots, name="ContainerClass"):
+    return type(name, (object,), {"__slots__":tuple(slots)})
+    
+def auto_class_instance(slots, name="ContainerClass"):
+    return auto_class(slots, name)()
 
+
+
+def bone_class_instance(obj, slots, name="BoneContainer"):
+    for member in slots[:]:
+        slots.append(member + "_b") # bone bone
+        slots.append(member + "_p") # pose bone
+        slots.append(member + "_e") # edit bone
+    
+    slots.extend(["obj", "update"])
+    
+    instance = auto_class_instance(slots, name)
+    
+    def update():
+        '''
+        Re-Assigns bones from the blender data
+        '''
+        arm = obj.data
+        
+        bbones = arm.bones
+        pbones = obj.pose.bones
+        ebones = arm.edit_bones
+        
+        for member in slots:
+            
+            if member in ("update", "obj"):
+                continue
+            
+            if not member[-2] == "_":
+                name = getattr(instance, member, None)
+                if name is not None:
+                    setattr(instance, member + "_b", bbones.get(name, None))
+                    setattr(instance, member + "_p", pbones.get(name, None))
+                    setattr(instance, member + "_e", ebones.get(name, None))
+        
+    instance.update = update
+    
+    return instance
+
 def gen_none(obj, orig_bone_name):
     pass
 
@@ -388,22 +431,31 @@
     - IKSwitch, MCH-%s ()
     """
     
-    def validate_chain():
+    # Since there are 3 chains, this gets confusing so divide into 3 chains
+    # Initialize container classes for convenience
+    mt = bone_class_instance(obj, ["shoulder", "arm", "forearm", "hand"])
+    ik = bone_class_instance(obj, ["arm", "forearm", "pole", "hand"])
+    sw = bone_class_instance(obj, ["socket", "shoulder", "arm", "forearm", "hand"])
+    
+    def chain_init():
         '''
         Sanity check and return the arm as a list of bone names.
         '''
         # do a sanity check
-        arm, orig_pbone, orig_ebone = get_bone_data(obj, orig_bone_name)
-        shoulder_pbone = orig_pbone.parent
+        mt.arm = orig_bone_name
+        mt.update()
         
-        if not shoulder_pbone:
+        mt.shoulder_p = mt.arm_p.parent
+        mt.shoulder = mt.shoulder_p.name
+        
+        if not mt.shoulder_p:
             print("could not find 'arm' parent, skipping:", orig_bone_name)
             return
 
         # We could have some bones attached, find the bone that has this as its 2nd parent
         hands = []
         for pbone in obj.pose.bones:
-            index = pbone.parent_index(orig_pbone)
+            index = pbone.parent_index(mt.arm_p)
             if index == 2:
                 hands.append(pbone)
 
@@ -412,53 +464,48 @@
             return
 
         # first add the 2 new bones
-        hand_pbone = hands[0]
-        forearm_pbone = hand_pbone.parent
-        
-        return shoulder_pbone.name, orig_pbone.name, forearm_pbone.name, hand_pbone.name
+        mt.hand_p = hands[0]
+        mt.hand = mt.hand_p.name
+
+        mt.forearm_p = mt.hand_p.parent
+        mt.forearm = mt.forearm_p.name
     
-    
     arm = obj.data
     
-    original_chain_tuple = validate_chain()
-    shoulder_name, arm_name, forearm_name, hand_name = original_chain_tuple
     
-    
     def chain_ik(prefix="MCH-%s_ik"):
         
-        arm, arm_pbone, arm_ebone = get_bone_data(obj, arm_name)
-        arm, hand_pbone, hand_ebone = get_bone_data(obj, hand_name)
+        mt.update()
         
         # Add the edit bones
-        hand_ik_ebone = copy_bone_simple(arm, hand_name, prefix % hand_name)
-        hand_ik_name = hand_ik_ebone.name
+        ik.hand_e = copy_bone_simple(arm, mt.hand, prefix % mt.hand)
+        ik.hand = ik.hand_e.name
         
-        arm_ik_ebone = copy_bone_simple(arm, arm_name, prefix % arm_name)
-        arm_ik_name = arm_ik_ebone.name
+        ik.arm_e = copy_bone_simple(arm, mt.arm, prefix % mt.arm)
+        ik.arm = ik.arm_e.name
 
-        forearm_ik_ebone = copy_bone_simple(arm, forearm_name, prefix % forearm_name)
-        forearm_ik_name = forearm_ik_ebone.name
+        ik.forearm_e = copy_bone_simple(arm, mt.forearm, prefix % mt.forearm)
+        ik.forearm = ik.forearm_e.name
 
-        arm_ik_ebone.parent = arm_ebone.parent
-        forearm_ik_ebone.connected = arm_ebone.connected
+        ik.arm_e.parent = mt.arm_e.parent
+        ik.forearm_e.connected = mt.arm_e.connected
         
-        forearm_ik_ebone.parent = arm_ik_ebone
-        forearm_ik_ebone.connected = True
+        ik.forearm_e.parent = ik.arm_e
+        ik.forearm_e.connected = True
         
         
         # Add the bone used for the arms poll target
-        pole_ik_name = add_pole_target_bone(obj, forearm_name, "elbow_poll", mode='+Z')
+        ik.pole = add_pole_target_bone(obj, mt.forearm, "elbow_poll", mode='+Z')
         
         bpy.ops.object.mode_set(mode='OBJECT')
         
-        arm, forearm_ik_pbone, forearm_ik_bone = get_bone_data(obj, forearm_ik_name)
+        ik.update()
         
-        
-        con = forearm_ik_pbone.constraints.new('IK')
+        con = ik.forearm_p.constraints.new('IK')
         con.target = obj
-        con.subtarget = hand_ik_name
+        con.subtarget = ik.hand
         con.pole_target = obj
-        con.pole_subtarget = pole_ik_name
+        con.pole_subtarget = ik.pole
         
         con.use_tail = True
         con.use_stretch = True
@@ -468,46 +515,47 @@
         con.pole_angle = -90.0 # XXX, RAD2DEG
         
         # ID Propery on the hand for IK/FK switch
-        arm, hand_ik_pbone, hand_ik_bone = get_bone_data(obj, hand_ik_name)
         
-        prop = rna_idprop_ui_prop_get(hand_ik_pbone, "ik", create=True)
-        hand_ik_pbone["ik"] = 0.5
+        prop = rna_idprop_ui_prop_get(ik.hand_p, "ik", create=True)
+        ik.hand_p["ik"] = 0.5
         prop["soft_min"] = 0.0
         prop["soft_max"] = 1.0
         
         bpy.ops.object.mode_set(mode='EDIT')
-        return None, arm_ik_name, forearm_ik_name, hand_ik_name, pole_ik_name
+        
+        ik.arm = ik.arm
+        ik.forearm = ik.forearm
+        ik.hand = ik.hand
+        ik.pole = ik.pole
     
-    ik_chain_tuple = chain_ik()
-    
     def chain_switch(prefix="MCH-%s"):
+
+        sw.shoulder_e = copy_bone_simple(arm, mt.shoulder, prefix % mt.shoulder)
+        sw.shoulder = sw.shoulder_e.name
+
+        sw.arm_e = copy_bone_simple(arm, mt.arm, prefix % mt.arm)
+        sw.arm = sw.arm_e.name
+        sw.arm_e.parent = sw.arm_e
+        sw.arm_e.connected = arm.edit_bones[mt.shoulder].connected
         
-        arm_sw_ebone = copy_bone_simple(arm, arm_name, prefix % arm_name)
-        arm_sw_name = arm_sw_ebone.name
-        
-        
-        
-        forearm_sw_ebone = copy_bone_simple(arm, forearm_name, prefix % forearm_name)
-        forearm_sw_name = forearm_sw_ebone.name
-        forearm_sw_ebone.parent = arm_sw_ebone
-        forearm_sw_ebone.connected = arm.edit_bones[forearm_name].connected
+        sw.forearm_e = copy_bone_simple(arm, mt.forearm, prefix % mt.forearm)
+        sw.forearm = sw.forearm_e.name
+        sw.forearm_e.parent = sw.arm_e
+        sw.forearm_e.connected = arm.edit_bones[mt.forearm].connected
 
-        hand_sw_ebone = copy_bone_simple(arm, hand_name, prefix % hand_name)
-        hand_sw_name = hand_sw_ebone.name
-        hand_sw_ebone.parent = forearm_sw_ebone
-        hand_sw_ebone.connected = arm.edit_bones[hand_name].connected
+        sw.hand_e = copy_bone_simple(arm, mt.hand, prefix % mt.hand)
+        sw.hand = sw.hand_e.name
+        sw.hand_e.parent = sw.forearm_e
+        sw.hand_e.connected = arm.edit_bones[mt.hand].connected
         
         bpy.ops.object.mode_set(mode='OBJECT')
         
-        
         # Add constraints
-        arm_sw_pbone = obj.pose.bones[arm_sw_name]
-        forearm_sw_pbone = obj.pose.bones[forearm_sw_name]
-        hand_sw_pbone = obj.pose.bones[hand_sw_name]
+        sw.update()
         
-        dummy, arm_ik_name, forearm_ik_name, hand_ik_name, pole_ik_name = ik_chain_tuple
+        #dummy, ik.arm, ik.forearm, ik.hand, ik.pole = ik_chain_tuple
         
-        ik_driver_path = obj.pose.bones[hand_ik_name].path_to_id() + '["ik"]'
+        ik_driver_path = obj.pose.bones[ik.hand].path_to_id() + '["ik"]'
         
         
         def ik_fk_driver(con):
@@ -524,60 +572,194 @@
             tar.rna_path = ik_driver_path
 
         # ***********
-        con = arm_sw_pbone.constraints.new('COPY_ROTATION')
+        con = sw.arm_p.constraints.new('COPY_ROTATION')
         con.name = "FK"
         con.target = obj
-        con.subtarget = arm_name
+        con.subtarget = mt.arm
 
-        con = arm_sw_pbone.constraints.new('COPY_ROTATION')
+        con = sw.arm_p.constraints.new('COPY_ROTATION')
 
         con.target = obj
-        con.subtarget = arm_ik_name
+        con.subtarget = ik.arm
         con.influence = 0.5
         ik_fk_driver(con)
         
         # ***********
-        con = forearm_sw_pbone.constraints.new('COPY_ROTATION')
+        con = sw.forearm_p.constraints.new('COPY_ROTATION')
         con.name = "FK"
         con.target = obj
-        con.subtarget = forearm_name
+        con.subtarget = mt.forearm
 
-        con = forearm_sw_pbone.constraints.new('COPY_ROTATION')
+        con = sw.forearm_p.constraints.new('COPY_ROTATION')
         con.name = "IK"
         con.target = obj
-        con.subtarget = forearm_ik_name
+        con.subtarget = ik.forearm
         con.influence = 0.5
         ik_fk_driver(con)
         
         # ***********
-        con = hand_sw_pbone.constraints.new('COPY_ROTATION')
+        con = sw.hand_p.constraints.new('COPY_ROTATION')
         con.name = "FK"
         con.target = obj
-        con.subtarget = hand_name
+        con.subtarget = mt.hand
 
-        con = hand_sw_pbone.constraints.new('COPY_ROTATION')
+        con = sw.hand_p.constraints.new('COPY_ROTATION')
         con.name = "IK"
         con.target = obj
-        con.subtarget = hand_ik_name
+        con.subtarget = ik.hand
         con.influence = 0.5

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list