[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45409] trunk/blender: report [#30814] Absolute Shape Keys not working in 2.6

Campbell Barton ideasman42 at gmail.com
Thu Apr 5 07:05:18 CEST 2012


Revision: 45409
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45409
Author:   campbellbarton
Date:     2012-04-05 05:05:18 +0000 (Thu, 05 Apr 2012)
Log Message:
-----------
report [#30814] Absolute Shape Keys not working in 2.6

This report points out thet absolute shape keys are unusable.

The problem is there was no way to adjust the play time of a shape key (all absolte shape keys would start at frame zero with no way to change the speed).

Added an 'eval_time' property to the key block that works like the curve path evaluation time, so the time in the keyblock can be controlled.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_mesh.py
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/makesdna/DNA_key_types.h
    trunk/blender/source/blender/makesrna/intern/rna_key.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_mesh.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_mesh.py	2012-04-05 03:05:02 UTC (rev 45408)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_mesh.py	2012-04-05 05:05:18 UTC (rev 45409)
@@ -259,8 +259,9 @@
                     col.prop_search(kb, "relative_key", key, "key_blocks", text="")
 
             else:
-                row = layout.row()
+                row = layout.column()
                 row.active = enable_edit_value
+                row.prop(key, "eval_time")
                 row.prop(key, "slurph")
 
 

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2012-04-05 03:05:02 UTC (rev 45408)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2012-04-05 05:05:18 UTC (rev 45409)
@@ -1106,36 +1106,28 @@
 static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
 {
 	KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
-	float cfra, ctime, t[4], delta;
-	int a, flag = 0, step;
-	
-	if (key->slurph && key->type!=KEY_RELATIVE ) {
-		delta= key->slurph;
-		delta/= tot;
-		
-		step= 1;
-		if (tot>100 && slurph_opt) {
-			step= tot/50;
-			delta*= step;
+	float cfra, t[4], delta;
+	int a, flag = 0;
+
+	if (key->slurph && key->type != KEY_RELATIVE) {
+		const float ctime_scaled = key->ctime / 100.0f;
+		int step;
+
+		delta = (float)key->slurph / tot;
+
+		if (tot > 100 && slurph_opt) {
+			step = tot / 50;
+			delta *= step;
 			/* in do_key and cp_key the case a>tot is handled */
 		}
-		
+		else {
+			step = 1;
+		}
+
 		cfra= (float)scene->r.cfra;
 		
 		for (a=0; a<tot; a+=step, cfra+= delta) {
-			
-			ctime= BKE_curframe(scene);
-#if 0 // XXX old animation system
-			if (calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
-				ctime /= 100.0;
-				CLAMP(ctime, 0.0, 1.0);
-			}
-#endif // XXX old animation system
-			// XXX for now... since speed curve cannot be directly ported yet
-			ctime /= 100.0f;
-			CLAMP(ctime, 0.0f, 1.0f); // XXX for compat, we use this, but this clamping was confusing
-		
-			flag= setkeys(ctime, &key->block, k, t, 0);
+			flag = setkeys(ctime_scaled, &key->block, k, t, 0);
 
 			if (flag==0)
 				do_key(a, a+step, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
@@ -1158,20 +1150,10 @@
 			}
 		}
 		else {
-			ctime= BKE_curframe(scene);
-			
-#if 0 // XXX old animation system
-			if (calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
-				ctime /= 100.0;
-				CLAMP(ctime, 0.0, 1.0);
-			}
-#endif // XXX old animation system
-			// XXX for now... since speed curve cannot be directly ported yet
-			ctime /= 100.0f;
-			CLAMP(ctime, 0.0f, 1.0f); // XXX for compat, we use this, but this clamping was confusing
-			
-			flag= setkeys(ctime, &key->block, k, t, 0);
+			const float ctime_scaled = key->ctime / 100.0f;
 
+			flag = setkeys(ctime_scaled, &key->block, k, t, 0);
+
 			if (flag==0)
 				do_key(0, tot, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
 			else
@@ -1199,7 +1181,7 @@
 	}
 }
 
-static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float UNUSED(ctime), char *out, const int tot)
+static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, char *out, const int tot)
 {
 	Nurb *nu;
 	int a, step;
@@ -1222,21 +1204,24 @@
 {
 	Curve *cu= ob->data;
 	KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
-	float cfra, ctime, t[4], delta;
-	int a, flag = 0, step = 0;
+	float cfra, t[4], delta;
+	int a, flag = 0;
 
-	if (key->slurph  && key->type!=KEY_RELATIVE) {
+	if (key->slurph && key->type != KEY_RELATIVE) {
+		const float ctime_scaled = key->ctime / 100.0f;
 		Nurb *nu;
-		int mode=0, i= 0, remain= 0, estep=0, count=0;
+		int mode = 0, i = 0, remain = 0, step, estep = 0, count = 0;
 
-		delta= (float)key->slurph / tot;
+		delta = (float)key->slurph / tot;
 
-		step= 1;
-		if (tot>100 && slurph_opt) {
-			step= tot/50;
-			delta*= step;
+		if (tot > 100 && slurph_opt) {
+			step = tot / 50;
+			delta *= step;
 			/* in do_key and cp_key the case a>tot has been handled */
 		}
+		else {
+			step = 1;
+		}
 
 		cfra= (float)scene->r.cfra;
 
@@ -1250,18 +1235,14 @@
 				estep= 3*nu->pntsu;
 			}
 			else
-				step= 0;
+				step= 0; /* XXX - is this some mistake??? - the estep from last iter could be used - campbell */
 
 			a= 0;
 			while (a < estep) {
 				if (remain <= 0) {
 					cfra+= delta;
-					ctime= BKE_curframe(scene);
+					flag = setkeys(ctime_scaled, &key->block, k, t, 0);
 
-					ctime /= 100.0f;
-					CLAMP(ctime, 0.0f, 1.0f); // XXX for compat, we use this, but this clamping was confusing
-					flag= setkeys(ctime, &key->block, k, t, 0);
-
 					remain= step;
 				}
 
@@ -1282,22 +1263,14 @@
 		}
 	}
 	else {
-		
-		ctime= BKE_curframe(scene);
-		
 		if (key->type==KEY_RELATIVE) {
-			do_rel_cu_key(cu, cu->key, actkb, ctime, out, tot);
+			do_rel_cu_key(cu, cu->key, actkb, out, tot);
 		}
 		else {
-#if 0 // XXX old animation system
-			if (calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
-				ctime /= 100.0;
-				CLAMP(ctime, 0.0, 1.0);
-			}
-#endif // XXX old animation system
-			
-			flag= setkeys(ctime, &key->block, k, t, 0);
-			
+			const float ctime_scaled = key->ctime / 100.0f;
+
+			flag = setkeys(ctime_scaled, &key->block, k, t, 0);
+
 			if (flag==0) do_cu_key(cu, key, actkb, k, t, out, tot);
 			else cp_cu_key(cu, key, actkb, k[2], 0, tot, out, tot);
 		}
@@ -1308,26 +1281,18 @@
 {
 	Lattice *lt= ob->data;
 	KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
-	float delta, cfra, ctime, t[4];
+	float delta, cfra, t[4];
 	int a, flag;
 	
-	if (key->slurph) {
-		delta= key->slurph;
-		delta/= (float)tot;
+	if (key->slurph  && key->type != KEY_RELATIVE) {
+		const float ctime_scaled = key->ctime / 100.0f;
+
+		delta = (float)key->slurph / tot;
 		
-		cfra= (float)scene->r.cfra;
+		cfra = (float)scene->r.cfra;
 		
 		for (a=0; a<tot; a++, cfra+= delta) {
-			
-			ctime= BKE_curframe(scene);
-#if 0 // XXX old animation system
-			if (calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
-				ctime /= 100.0;
-				CLAMP(ctime, 0.0, 1.0);
-			}
-#endif // XXX old animation system
-		
-			flag= setkeys(ctime, &key->block, k, t, 0);
+			flag = setkeys(ctime_scaled, &key->block, k, t, 0);
 
 			if (flag==0)
 				do_key(a, a+1, tot, out, key, actkb, k, t, KEY_MODE_DUMMY);
@@ -1350,16 +1315,9 @@
 			}
 		}
 		else {
-			ctime= BKE_curframe(scene);
-
-#if 0 // XXX old animation system
-			if (calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
-				ctime /= 100.0;
-				CLAMP(ctime, 0.0, 1.0);
-			}
-#endif // XXX old animation system
+			const float ctime_scaled = key->ctime / 100.0f;
 			
-			flag= setkeys(ctime, &key->block, k, t, 0);
+			flag = setkeys(ctime_scaled, &key->block, k, t, 0);
 
 			if (flag==0)
 				do_key(0, tot, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
@@ -1446,7 +1404,7 @@
 	else {
 		/* do shapekey local drivers */
 		float ctime= (float)scene->r.cfra; // XXX this needs to be checked
-		
+
 		BKE_animsys_evaluate_animdata(scene, &key->id, key->adt, ctime, ADT_RECALC_DRIVERS);
 		
 		if (ob->type==OB_MESH) do_mesh_key(scene, ob, key, out, tot);

Modified: trunk/blender/source/blender/makesdna/DNA_key_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_key_types.h	2012-04-05 03:05:02 UTC (rev 45408)
+++ trunk/blender/source/blender/makesdna/DNA_key_types.h	2012-04-05 05:05:18 UTC (rev 45409)
@@ -74,9 +74,10 @@
 
 	short type, totkey;
 	short slurph, flag;
+	float ctime;
 
 	/*can never be 0, this is used for detecting old data*/
-	int uidgen, pad; /*current free uid for keyblocks*/
+	int uidgen; /*current free uid for keyblocks*/
 } Key;
 
 /* **************** KEY ********************* */

Modified: trunk/blender/source/blender/makesrna/intern/rna_key.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_key.c	2012-04-05 03:05:02 UTC (rev 45408)
+++ trunk/blender/source/blender/makesrna/intern/rna_key.c	2012-04-05 05:05:18 UTC (rev 45409)
@@ -33,6 +33,7 @@
 #include "rna_internal.h"
 
 #include "DNA_ID.h"
+#include "DNA_scene_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_key_types.h"
 #include "DNA_lattice_types.h"
@@ -620,9 +621,17 @@
 
 	prop = RNA_def_property(srna, "use_relative", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "type", KEY_RELATIVE);
-	RNA_def_property_ui_text(prop, "Relative", "Make shape keys relative");
+	RNA_def_property_ui_text(prop, "Relative",
+	                         "Make shape keys relative, "
+	                         "otherwise play through shapes as a sequence using the evaluation time");
 	RNA_def_property_update(prop, 0, "rna_Key_update_data");
 
+	prop = RNA_def_property(srna, "eval_time", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "ctime");
+	RNA_def_property_range(prop, MINFRAME, MAXFRAME);
+	RNA_def_property_ui_text(prop, "Evaluation Time", "Evaluation time for absolute shape keys");
+	RNA_def_property_update(prop, 0, "rna_Key_update_data");
+
 	prop = RNA_def_property(srna, "slurph", PROP_INT, PROP_UNSIGNED);
 	RNA_def_property_int_sdna(prop, NULL, "slurph");
 	RNA_def_property_range(prop, -500, 500);




More information about the Bf-blender-cvs mailing list