[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