[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25189] trunk/blender/release/scripts/ modules/rigify: use the SUM driver type to avoid adding all values on each bone.

Campbell Barton ideasman42 at gmail.com
Mon Dec 7 21:49:12 CET 2009


Revision: 25189
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25189
Author:   campbellbarton
Date:     2009-12-07 21:49:12 +0100 (Mon, 07 Dec 2009)

Log Message:
-----------
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)

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/rigify/neck.py
    trunk/blender/release/scripts/modules/rigify/spine.py

Modified: trunk/blender/release/scripts/modules/rigify/neck.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/neck.py	2009-12-07 20:39:57 UTC (rev 25188)
+++ trunk/blender/release/scripts/modules/rigify/neck.py	2009-12-07 20:49:12 UTC (rev 25189)
@@ -220,10 +220,21 @@
 
     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 @@
         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

Modified: trunk/blender/release/scripts/modules/rigify/spine.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/spine.py	2009-12-07 20:39:57 UTC (rev 25188)
+++ trunk/blender/release/scripts/modules/rigify/spine.py	2009-12-07 20:49:12 UTC (rev 25189)
@@ -364,12 +364,6 @@
     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 @@
 
 
     # 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 @@
         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





More information about the Bf-blender-cvs mailing list