From ce49719a0c9baf75576929f956e1224fcd46afc7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 7 Dec 2009 20:49:12 +0000 Subject: [PATCH] use the SUM driver type to avoid adding all values on each bone. also avoids hitting the 255 string limit if you want to add 100's of values. eg. >>> b05/max(0.001, [globals().update({"LOCALS":locals(), "ADD":float.__add__, "reduce":__import__("functools").reduce}), 0.0][1], max((, [LOCALS["b%.2d" % (i+1)] for i in range(5)]))) Since this more simple expression reaches the limit fairly quick... >>> b05/max(0.001,b01+b02+b03+b04+b05) --- release/scripts/modules/rigify/neck.py | 38 ++++++++++++----- release/scripts/modules/rigify/spine.py | 55 +++++++++++++++++-------- 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/release/scripts/modules/rigify/neck.py b/release/scripts/modules/rigify/neck.py index 06e2e1077b2..6963bfbfb8d 100644 --- a/release/scripts/modules/rigify/neck.py +++ b/release/scripts/modules/rigify/neck.py @@ -220,10 +220,21 @@ def main(obj, bone_definition, base_names): head_driver_path = mt.head_p.path_to_id() - # b01/max(0.001,b01+b02+b03+b04+b05) target_names = [("b%.2d" % (i + 1)) for i in range(len(neck_chain))] - expression_suffix = "/max(0.001,%s)" % "+".join(target_names) + + mt.head_p["bend_tot"] = 0.0 + fcurve = mt.head_p.driver_add('["bend_tot"]', 0) + driver = fcurve.driver + driver.type = 'SUM' + fcurve.modifiers.remove(0) # grr dont need a modifier + for i in range(len(neck_chain)): + tar = driver.targets.new() + tar.name = target_names[i] + tar.id_type = 'OBJECT' + tar.id = obj + tar.rna_path = head_driver_path + ('["bend_%.2d"]' % (i + 1)) + for i, attr in enumerate(mt_chain.attr_names): neck_p = getattr(mt_chain, attr + "_p") @@ -252,16 +263,23 @@ def main(obj, bone_definition, base_names): fcurve = con.driver_add("influence", 0) driver = fcurve.driver driver.type = 'SCRIPTED' - # b01/max(0.001,b01+b02+b03+b04+b05) - driver.expression = target_names[i] + expression_suffix + driver.expression = "bend/bend_tot" + fcurve.modifiers.remove(0) # grr dont need a modifier + - for j in range(len(neck_chain)): - tar = driver.targets.new() - tar.name = target_names[j] - tar.id_type = 'OBJECT' - tar.id = obj - tar.rna_path = head_driver_path + ('["bend_%.2d"]' % (j + 1)) + # add target + tar = driver.targets.new() + tar.name = "bend_tot" + tar.id_type = 'OBJECT' + tar.id = obj + tar.rna_path = head_driver_path + ('["bend_tot"]') + + tar = driver.targets.new() + tar.name = "bend" + tar.id_type = 'OBJECT' + tar.id = obj + tar.rna_path = head_driver_path + ('["%s"]' % prop_name) # no blending the result of this return None diff --git a/release/scripts/modules/rigify/spine.py b/release/scripts/modules/rigify/spine.py index 39ba4baee61..23af154520a 100644 --- a/release/scripts/modules/rigify/spine.py +++ b/release/scripts/modules/rigify/spine.py @@ -364,12 +364,6 @@ def main(obj, bone_definition, base_names): prop["soft_min"] = 1.0 / spine_chain_len prop["soft_max"] = 1.0 - for i in range(spine_chain_len - 1): - prop_name = "bend_%.2d" % (i + 1) - prop = rna_idprop_ui_prop_get(mt.ribcage_p, prop_name, create=True) - mt.ribcage_p[prop_name] = 1.0 - prop["soft_min"] = 0.0 - prop["soft_max"] = 1.0 # Create a fake connected parent/child relationship with bone location constraints # positioned at the tip. @@ -387,15 +381,32 @@ def main(obj, bone_definition, base_names): # Constrain 'inbetween' bones - - # b01/max(0.001,b01+b02+b03+b04+b05) target_names = [("b%.2d" % (i + 1)) for i in range(spine_chain_len - 1)] - expression_suffix = "/max(0.001,%s)" % "+".join(target_names) - rib_driver_path = mt.ribcage_p.path_to_id() + mt.ribcage_p["bend_tot"] = 0.0 + fcurve = mt.ribcage_p.driver_add('["bend_tot"]', 0) + driver = fcurve.driver + driver.type = 'SUM' + fcurve.modifiers.remove(0) # grr dont need a modifier + + for i in range(spine_chain_len - 1): + tar = driver.targets.new() + tar.name = target_names[i] + tar.id_type = 'OBJECT' + tar.id = obj + tar.rna_path = rib_driver_path + ('["bend_%.2d"]' % (i + 1)) + print(rib_driver_path) + for i in range(1, spine_chain_len): + # Add bend prop + prop_name = "bend_%.2d" % i + prop = rna_idprop_ui_prop_get(mt.ribcage_p, prop_name, create=True) + mt.ribcage_p[prop_name] = 1.0 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + spine_p = getattr(ex_chain, ex_chain.attr_names[i] + "_p") spine_p_parent = spine_p.parent # interlaced bone @@ -410,16 +421,24 @@ def main(obj, bone_definition, base_names): fcurve = con.driver_add("influence", 0) driver = fcurve.driver driver.type = 'SCRIPTED' - # b01/max(0.001,b01+b02+b03+b04+b05) - driver.expression = target_names[i - 1] + expression_suffix + driver.expression = "bend/bend_tot" + fcurve.modifiers.remove(0) # grr dont need a modifier + - for j in range(spine_chain_len - 1): - tar = driver.targets.new() - tar.name = target_names[j] - tar.id_type = 'OBJECT' - tar.id = obj - tar.rna_path = rib_driver_path + ('["bend_%.2d"]' % (j + 1)) + # add target + tar = driver.targets.new() + tar.name = "bend_tot" + tar.id_type = 'OBJECT' + tar.id = obj + tar.rna_path = rib_driver_path + ('["bend_tot"]') + + tar = driver.targets.new() + tar.name = "bend" + tar.id_type = 'OBJECT' + tar.id = obj + tar.rna_path = rib_driver_path + ('["%s"]' % prop_name) + # original bone drivers