[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45562] trunk/blender/source/blender/ blenkernel: change add_keyblock() not to sort keyblocks by time since this can be a problem when using the function in lower level parts of the code , instead add add_keyblock_ctime() which sets time and sorts on absolute shape keys.

Campbell Barton ideasman42 at gmail.com
Thu Apr 12 13:05:17 CEST 2012


Revision: 45562
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45562
Author:   campbellbarton
Date:     2012-04-12 11:05:16 +0000 (Thu, 12 Apr 2012)
Log Message:
-----------
change add_keyblock() not to sort keyblocks by time since this can be a problem when using the function in lower level parts of the code, instead add add_keyblock_ctime() which sets time and sorts on absolute shape keys.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_key.h
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/blenkernel/intern/object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_key.h	2012-04-12 09:10:10 UTC (rev 45561)
+++ trunk/blender/source/blender/blenkernel/BKE_key.h	2012-04-12 11:05:16 UTC (rev 45562)
@@ -63,6 +63,7 @@
 
 struct Key *ob_get_key(struct Object *ob);
 struct KeyBlock *add_keyblock(struct Key *key, const char *name);
+struct KeyBlock *add_keyblock_ctime(struct Key *key, const char * name, const short do_force);
 struct KeyBlock *ob_get_keyblock(struct Object *ob);
 struct KeyBlock *ob_get_reference_keyblock(struct Object *ob);
 struct KeyBlock *key_get_keyblock(struct Key *key, int index);

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2012-04-12 09:10:10 UTC (rev 45561)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2012-04-12 11:05:16 UTC (rev 45562)
@@ -1472,15 +1472,30 @@
 	
 	kb->slidermin= 0.0f;
 	kb->slidermax= 1.0f;
-	
-	// XXX kb->pos is the confusing old horizontal-line RVK crap in old IPO Editor...
-	if (key->type == KEY_RELATIVE)  {
-		kb->pos= curpos + 0.1f;
-	}
-	else {
+
+	/**
+	 * \note caller may want to set this to current time, but don't do it here since we need to sort
+	 * which could cause problems in some cases, see #add_keyblock_ctime */
+	kb->pos = curpos + 0.1f; /* only used for absolute shape keys */
+
+	return kb;
+}
+
+/**
+ * \note sorting is a problematic side effect in some cases,
+ * better only do this explicitly by having its own function,
+ *
+ * \param do_force always use ctime even for relative keys.
+ */
+KeyBlock *add_keyblock_ctime(Key *key, const char *name, const short do_force)
+{
+	KeyBlock *kb = add_keyblock(key, name);
+
+	if (do_force || (key->type != KEY_RELATIVE)) {
 		kb->pos = key->ctime / 100.0f;
 		sort_keys(key);
 	}
+
 	return kb;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2012-04-12 09:10:10 UTC (rev 45561)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2012-04-12 11:05:16 UTC (rev 45562)
@@ -2869,7 +2869,7 @@
 
 	if (newkey || from_mix==FALSE) {
 		/* create from mesh */
-		kb= add_keyblock(key, name);
+		kb = add_keyblock_ctime(key, name, FALSE);
 		mesh_to_key(me, kb);
 	}
 	else {
@@ -2877,7 +2877,7 @@
 		float *data= do_ob_key(scene, ob);
 
 		/* create new block with prepared data */
-		kb= add_keyblock(key, name);
+		kb = add_keyblock_ctime(key, name, FALSE);
 		kb->data= data;
 		kb->totelem= me->totvert;
 	}
@@ -2899,7 +2899,7 @@
 	}
 
 	if (newkey || from_mix==FALSE) {
-		kb= add_keyblock(key, name);
+		kb = add_keyblock_ctime(key, name, FALSE);
 		if (!newkey) {
 			KeyBlock *basekb= (KeyBlock *)key->block.first;
 			kb->data= MEM_dupallocN(basekb->data);
@@ -2914,7 +2914,7 @@
 		float *data= do_ob_key(scene, ob);
 
 		/* create new block with prepared data */
-		kb= add_keyblock(key, name);
+		kb = add_keyblock_ctime(key, name, FALSE);
 		kb->totelem= lt->pntsu*lt->pntsv*lt->pntsw;
 		kb->data= data;
 	}
@@ -2938,7 +2938,7 @@
 
 	if (newkey || from_mix==FALSE) {
 		/* create from curve */
-		kb= add_keyblock(key, name);
+		kb = add_keyblock_ctime(key, name, FALSE);
 		if (!newkey) {
 			KeyBlock *basekb= (KeyBlock *)key->block.first;
 			kb->data= MEM_dupallocN(basekb->data);
@@ -2953,7 +2953,7 @@
 		float *data= do_ob_key(scene, ob);
 
 		/* create new block with prepared data */
-		kb= add_keyblock(key, name);
+		kb = add_keyblock_ctime(key, name, FALSE);
 		kb->totelem= count_curveverts(lb);
 		kb->data= data;
 	}




More information about the Bf-blender-cvs mailing list