fix [#33682] Animation not updated when the active shape index isnt set

This commit is contained in:
Campbell Barton
2013-01-03 06:47:44 +00:00
parent df3e244887
commit d8d24bdebd
6 changed files with 27 additions and 19 deletions

View File

@@ -59,7 +59,7 @@ void key_curve_position_weights(float t, float data[4], int type);
void key_curve_tangent_weights(float t, float data[4], int type); void key_curve_tangent_weights(float t, float data[4], int type);
void key_curve_normal_weights(float t, float data[4], int type); void key_curve_normal_weights(float t, float data[4], int type);
float *do_ob_key(struct Scene *scene, struct Object *ob); float *BKE_key_evaluate_object(struct Scene *scene, struct Object *ob, int *r_totelem);
struct Key *BKE_key_from_object(struct Object *ob); struct Key *BKE_key_from_object(struct Object *ob);
struct KeyBlock *BKE_keyblock_from_object(struct Object *ob); struct KeyBlock *BKE_keyblock_from_object(struct Object *ob);

View File

@@ -799,7 +799,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl
required_mode |= eModifierMode_Editmode; required_mode |= eModifierMode_Editmode;
if (cu->editnurb == NULL) { if (cu->editnurb == NULL) {
keyVerts = do_ob_key(scene, ob); keyVerts = BKE_key_evaluate_object(scene, ob, &numVerts);
if (keyVerts) { if (keyVerts) {
/* split coords from key data, the latter also includes /* split coords from key data, the latter also includes
@@ -808,7 +808,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl
* shape key modifier yet. */ * shape key modifier yet. */
deformedVerts = BKE_curve_keyVertexCos_get(cu, nurb, keyVerts); deformedVerts = BKE_curve_keyVertexCos_get(cu, nurb, keyVerts);
originalVerts = MEM_dupallocN(deformedVerts); originalVerts = MEM_dupallocN(deformedVerts);
numVerts = BKE_nurbList_verts_count(nurb); BLI_assert(BKE_nurbList_verts_count(nurb) == numVerts);
} }
} }

View File

@@ -1300,7 +1300,7 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, const int
} }
/* returns key coordinates (+ tilt) when key applied, NULL otherwise */ /* returns key coordinates (+ tilt) when key applied, NULL otherwise */
float *do_ob_key(Scene *scene, Object *ob) float *BKE_key_evaluate_object(Scene *scene, Object *ob, int *r_totelem)
{ {
Key *key = BKE_key_from_object(ob); Key *key = BKE_key_from_object(ob);
KeyBlock *actkb = BKE_keyblock_from_object(ob); KeyBlock *actkb = BKE_keyblock_from_object(ob);
@@ -1344,7 +1344,7 @@ float *do_ob_key(Scene *scene, Object *ob)
return NULL; return NULL;
/* allocate array */ /* allocate array */
out = MEM_callocN(size, "do_ob_key out"); out = MEM_callocN(size, "BKE_key_evaluate_object out");
/* prevent python from screwing this up? anyhoo, the from pointer could be dropped */ /* prevent python from screwing this up? anyhoo, the from pointer could be dropped */
key->from = (ID *)ob->data; key->from = (ID *)ob->data;
@@ -1383,6 +1383,9 @@ float *do_ob_key(Scene *scene, Object *ob)
else if (ob->type == OB_SURF) do_curve_key(scene, ob, key, out, tot); else if (ob->type == OB_SURF) do_curve_key(scene, ob, key, out, tot);
} }
if (r_totelem) {
*r_totelem = tot;
}
return (float *)out; return (float *)out;
} }

View File

@@ -2981,12 +2981,13 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, const char *name, int
} }
else { else {
/* copy from current values */ /* copy from current values */
float *data = do_ob_key(scene, ob); int totelem;
float *data = BKE_key_evaluate_object(scene, ob, &totelem);
/* create new block with prepared data */ /* create new block with prepared data */
kb = BKE_keyblock_add_ctime(key, name, FALSE); kb = BKE_keyblock_add_ctime(key, name, FALSE);
kb->data = data; kb->data = data;
kb->totelem = me->totvert; kb->totelem = totelem;
} }
return kb; return kb;
@@ -3018,11 +3019,12 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int
} }
else { else {
/* copy from current values */ /* copy from current values */
float *data = do_ob_key(scene, ob); int totelem;
float *data = BKE_key_evaluate_object(scene, ob, &totelem);
/* create new block with prepared data */ /* create new block with prepared data */
kb = BKE_keyblock_add_ctime(key, name, FALSE); kb = BKE_keyblock_add_ctime(key, name, FALSE);
kb->totelem = lt->pntsu * lt->pntsv * lt->pntsw; kb->totelem = totelem;
kb->data = data; kb->data = data;
} }
@@ -3057,11 +3059,12 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int
} }
else { else {
/* copy from current values */ /* copy from current values */
float *data = do_ob_key(scene, ob); int totelem;
float *data = BKE_key_evaluate_object(scene, ob, &totelem);
/* create new block with prepared data */ /* create new block with prepared data */
kb = BKE_keyblock_add_ctime(key, name, FALSE); kb = BKE_keyblock_add_ctime(key, name, FALSE);
kb->totelem = BKE_nurbList_verts_count(lb); kb->totelem = totelem;
kb->data = data; kb->data = data;
} }

View File

@@ -54,13 +54,16 @@ static void deformVerts(ModifierData *md, Object *ob,
int numVerts, int numVerts,
ModifierApplyFlag UNUSED(flag)) ModifierApplyFlag UNUSED(flag))
{ {
KeyBlock *kb = BKE_keyblock_from_object(ob); Key *key = BKE_key_from_object(ob);
float (*deformedVerts)[3]; float (*deformedVerts)[3];
if (kb && kb->totelem == numVerts) { if (key && key->block.first) {
deformedVerts = (float(*)[3])do_ob_key(md->scene, ob); int deformedVerts_tot;
deformedVerts = (float(*)[3])BKE_key_evaluate_object(md->scene, ob, &deformedVerts_tot);
if (deformedVerts) { if (deformedVerts) {
if (numVerts == deformedVerts_tot) {
memcpy(vertexCos, deformedVerts, sizeof(float) * 3 * numVerts); memcpy(vertexCos, deformedVerts, sizeof(float) * 3 * numVerts);
}
MEM_freeN(deformedVerts); MEM_freeN(deformedVerts);
} }
} }

View File

@@ -779,8 +779,7 @@ add_dependencies(blender makesdna)
get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS) get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
set(BLENDER_LINK_LIBS list(APPEND BLENDER_LINK_LIBS
${BLENDER_LINK_LIBS}
bf_windowmanager bf_windowmanager
bf_render bf_render
) )