forked from bartvdbraak/blender
Fix drivers and shape keys not handling subframes / frame mapping properly.
Change Scene.frame_set so that it ensures subframe in range [0,1[ as Blender expects, otherwise some things like physics point cache lookups don't get evaluated properly.
This commit is contained in:
parent
431619e45b
commit
6cadd2bee3
@ -2258,7 +2258,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha
|
|||||||
{
|
{
|
||||||
bActionModifier *amod;
|
bActionModifier *amod;
|
||||||
bActionStrip *strip, *strip2;
|
bActionStrip *strip, *strip2;
|
||||||
float scene_cfra = (float)scene->r.cfra;
|
float scene_cfra = BKE_scene_frame_get(scene);
|
||||||
int do_modif;
|
int do_modif;
|
||||||
|
|
||||||
for (strip = armob->nlastrips.first; strip; strip = strip->next) {
|
for (strip = armob->nlastrips.first; strip; strip = strip->next) {
|
||||||
|
@ -1065,7 +1065,7 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, const int
|
|||||||
if (key->slurph && key->type != KEY_RELATIVE) {
|
if (key->slurph && key->type != KEY_RELATIVE) {
|
||||||
const float ctime_scaled = key->ctime / 100.0f;
|
const float ctime_scaled = key->ctime / 100.0f;
|
||||||
float delta = (float)key->slurph / tot;
|
float delta = (float)key->slurph / tot;
|
||||||
float cfra = (float)scene->r.cfra + scene->r.subframe;
|
float cfra = BKE_scene_frame_get(scene);
|
||||||
int step, a;
|
int step, a;
|
||||||
|
|
||||||
if (tot > 100 && slurph_opt) {
|
if (tot > 100 && slurph_opt) {
|
||||||
@ -1163,7 +1163,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, const in
|
|||||||
if (key->slurph && key->type != KEY_RELATIVE) {
|
if (key->slurph && key->type != KEY_RELATIVE) {
|
||||||
const float ctime_scaled = key->ctime / 100.0f;
|
const float ctime_scaled = key->ctime / 100.0f;
|
||||||
float delta = (float)key->slurph / tot;
|
float delta = (float)key->slurph / tot;
|
||||||
float cfra = (float)scene->r.cfra + scene->r.subframe;
|
float cfra = BKE_scene_frame_get(scene);
|
||||||
Nurb *nu;
|
Nurb *nu;
|
||||||
int i = 0, remain = 0;
|
int i = 0, remain = 0;
|
||||||
int step, a;
|
int step, a;
|
||||||
@ -1245,7 +1245,7 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, const int
|
|||||||
if (key->slurph && key->type != KEY_RELATIVE) {
|
if (key->slurph && key->type != KEY_RELATIVE) {
|
||||||
const float ctime_scaled = key->ctime / 100.0f;
|
const float ctime_scaled = key->ctime / 100.0f;
|
||||||
float delta = (float)key->slurph / tot;
|
float delta = (float)key->slurph / tot;
|
||||||
float cfra = (float)scene->r.cfra + scene->r.subframe;
|
float cfra = BKE_scene_frame_get(scene);
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
for (a = 0; a < tot; a++, cfra += delta) {
|
for (a = 0; a < tot; a++, cfra += delta) {
|
||||||
@ -1360,7 +1360,7 @@ float *BKE_key_evaluate_object(Scene *scene, Object *ob, int *r_totelem)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* do shapekey local drivers */
|
/* do shapekey local drivers */
|
||||||
float ctime = (float)scene->r.cfra + scene->r.subframe;
|
float ctime = BKE_scene_frame_get(scene);
|
||||||
|
|
||||||
BKE_animsys_evaluate_animdata(scene, &key->id, key->adt, ctime, ADT_RECALC_DRIVERS);
|
BKE_animsys_evaluate_animdata(scene, &key->id, key->adt, ctime, ADT_RECALC_DRIVERS);
|
||||||
|
|
||||||
|
@ -1808,7 +1808,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[4][4])
|
|||||||
CLAMP(ctime, 0.0f, 1.0f);
|
CLAMP(ctime, 0.0f, 1.0f);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ctime = scene->r.cfra;
|
ctime = BKE_scene_frame_get(scene);
|
||||||
if (IS_EQF(cu->pathlen, 0.0f) == 0)
|
if (IS_EQF(cu->pathlen, 0.0f) == 0)
|
||||||
ctime /= cu->pathlen;
|
ctime /= cu->pathlen;
|
||||||
|
|
||||||
@ -2187,7 +2187,7 @@ void BKE_object_where_is_calc_mat4(Scene *scene, Object *ob, float obmat[4][4])
|
|||||||
|
|
||||||
void BKE_object_where_is_calc(struct Scene *scene, Object *ob)
|
void BKE_object_where_is_calc(struct Scene *scene, Object *ob)
|
||||||
{
|
{
|
||||||
BKE_object_where_is_calc_time(scene, ob, (float)scene->r.cfra);
|
BKE_object_where_is_calc_time(scene, ob, BKE_scene_frame_get(scene));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BKE_object_where_is_calc_simul(Scene *scene, Object *ob)
|
void BKE_object_where_is_calc_simul(Scene *scene, Object *ob)
|
||||||
@ -2226,7 +2226,7 @@ void BKE_object_where_is_calc_simul(Scene *scene, Object *ob)
|
|||||||
bConstraintOb *cob;
|
bConstraintOb *cob;
|
||||||
|
|
||||||
cob = BKE_constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
|
cob = BKE_constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
|
||||||
BKE_solve_constraints(&ob->constraints, cob, (float)scene->r.cfra);
|
BKE_solve_constraints(&ob->constraints, cob, BKE_scene_frame_get(scene));
|
||||||
BKE_constraints_clear_evalob(cob);
|
BKE_constraints_clear_evalob(cob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2670,7 +2670,7 @@ void BKE_object_handle_update(Scene *scene, Object *ob)
|
|||||||
if (ob->recalc & OB_RECALC_DATA) {
|
if (ob->recalc & OB_RECALC_DATA) {
|
||||||
ID *data_id = (ID *)ob->data;
|
ID *data_id = (ID *)ob->data;
|
||||||
AnimData *adt = BKE_animdata_from_id(data_id);
|
AnimData *adt = BKE_animdata_from_id(data_id);
|
||||||
float ctime = (float)scene->r.cfra; /* XXX this is bad... */
|
float ctime = BKE_scene_frame_get(scene);
|
||||||
|
|
||||||
if (G.debug & G_DEBUG)
|
if (G.debug & G_DEBUG)
|
||||||
printf("recalcdata %s\n", ob->id.name + 2);
|
printf("recalcdata %s\n", ob->id.name + 2);
|
||||||
|
@ -55,8 +55,10 @@
|
|||||||
|
|
||||||
static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
|
static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
|
||||||
{
|
{
|
||||||
scene->r.cfra = frame;
|
float cfra = (float)frame + subframe;
|
||||||
scene->r.subframe = subframe;
|
|
||||||
|
scene->r.cfra = floorf(cfra);
|
||||||
|
scene->r.subframe = cfra - floorf(cfra);
|
||||||
|
|
||||||
CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
|
CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
|
||||||
BKE_scene_update_for_newframe(G.main, scene, (1 << 20) - 1);
|
BKE_scene_update_for_newframe(G.main, scene, (1 << 20) - 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user