change add_keyblock() not to sort keyblocks by time since this can be a problem when...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 12 Apr 2012 11:05:16 +0000 (11:05 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 12 Apr 2012 11:05:16 +0000 (11:05 +0000)
source/blender/blenkernel/BKE_key.h
source/blender/blenkernel/intern/key.c
source/blender/blenkernel/intern/object.c

index c241160102ef00ac2d956918d894917b7a445acd..63d9d73109760a6d7e3521729b7d048c764e65bf 100644 (file)
@@ -63,6 +63,7 @@ float *do_ob_key(struct Scene *scene, struct Object *ob);
 
 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);
index 62701f4e98e1aad6af3d9126564a6c293d394228..74d56a82c75bf1c9597344f01eb0b4654958063a 100644 (file)
@@ -1472,15 +1472,30 @@ KeyBlock *add_keyblock(Key *key, const char *name)
        
        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;
 }
 
index 237d268e307f1677caf6918737398159387f3f54..4d8d6e937a9272d050c61543983fc2bad929f955 100644 (file)
@@ -2869,7 +2869,7 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, const char *name, int
 
        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 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, const char *name, int
                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 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int
        }
 
        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 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int
                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 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int
 
        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 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int
                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;
        }