Fix T59495, T59992, T59904, T59178, T60598: broken keyframed value editing.
This removes a bunch of animation/driver evaluations and recalc flags that should be redundant in the new depsgraph, and were incorrectly affecting the evaluated scene in a permanent way. Still two cases that could be removed if the depsgraph is improved, in BKE_object_handle_data_update and BKE_cachefile_update_frame. For physics subframe interpolation there are also still calls to BKE_object_where_is_calc that should ideally be removed as well, though they are not known to cause keyframing bugs. Differential Revision: https://developer.blender.org/D4274
This commit is contained in:
@@ -186,6 +186,13 @@ void BKE_animsys_free_nla_keyframing_context_cache(struct ListBase *cache);
|
||||
/* ------------- Main API -------------------- */
|
||||
/* In general, these ones should be called to do all animation evaluation */
|
||||
|
||||
/* Flags for recalc parameter, indicating which part to recalculate. */
|
||||
typedef enum eAnimData_Recalc {
|
||||
ADT_RECALC_DRIVERS = (1 << 0),
|
||||
ADT_RECALC_ANIM = (1 << 1),
|
||||
ADT_RECALC_ALL = (ADT_RECALC_DRIVERS | ADT_RECALC_ANIM),
|
||||
} eAnimData_Recalc;
|
||||
|
||||
/* Evaluation loop for evaluating animation data */
|
||||
void BKE_animsys_evaluate_animdata(struct Depsgraph *depsgraph, struct Scene *scene, struct ID *id, struct AnimData *adt, float ctime, short recalc);
|
||||
|
||||
|
||||
@@ -166,9 +166,6 @@ void BKE_object_where_is_calc_ex(
|
||||
struct Object *ob, float r_originmat[3][3]);
|
||||
void BKE_object_where_is_calc_time(
|
||||
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, float ctime);
|
||||
void BKE_object_where_is_calc_time_ex(
|
||||
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, float ctime,
|
||||
struct RigidBodyWorld *rbw, float r_originmat[3][3]);
|
||||
void BKE_object_where_is_calc_mat4(struct Object *ob, float obmat[4][4]);
|
||||
|
||||
/* possibly belong in own moduke? */
|
||||
|
||||
@@ -1470,7 +1470,6 @@ void what_does_obaction(Object *ob, Object *workob, bPose *pose, bAction *act, c
|
||||
/* init animdata, and attach to workob */
|
||||
workob->adt = &adt;
|
||||
|
||||
adt.recalc = ADT_RECALC_ANIM;
|
||||
adt.action = act;
|
||||
|
||||
/* execute effects of Action on to workob (or it's PoseChannels) */
|
||||
|
||||
@@ -1764,7 +1764,7 @@ static void animsys_evaluate_drivers(PointerRNA *ptr, AnimData *adt, float ctime
|
||||
if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) {
|
||||
/* check if driver itself is tagged for recalculation */
|
||||
/* XXX driver recalc flag is not set yet by depsgraph! */
|
||||
if ((driver) && !(driver->flag & DRIVER_FLAG_INVALID) /*&& (driver->flag & DRIVER_FLAG_RECALC)*/) {
|
||||
if ((driver) && !(driver->flag & DRIVER_FLAG_INVALID)) {
|
||||
/* evaluate this using values set already in other places
|
||||
* NOTE: for 'layering' option later on, we should check if we should remove old value before adding
|
||||
* new to only be done when drivers only changed */
|
||||
@@ -1775,9 +1775,6 @@ static void animsys_evaluate_drivers(PointerRNA *ptr, AnimData *adt, float ctime
|
||||
ok = animsys_write_rna_setting(&anim_rna, curval);
|
||||
}
|
||||
|
||||
/* clear recalc flag */
|
||||
driver->flag &= ~DRIVER_FLAG_RECALC;
|
||||
|
||||
/* set error-flag if evaluation failed */
|
||||
if (ok == 0)
|
||||
driver->flag |= DRIVER_FLAG_INVALID;
|
||||
@@ -3513,7 +3510,7 @@ void BKE_animsys_evaluate_animdata(Depsgraph *depsgraph, Scene *scene, ID *id, A
|
||||
* that overrides 'rough' work in NLA
|
||||
*/
|
||||
/* TODO: need to double check that this all works correctly */
|
||||
if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM)) {
|
||||
if (recalc & ADT_RECALC_ANIM) {
|
||||
/* evaluate NLA data */
|
||||
if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) {
|
||||
/* evaluate NLA-stack
|
||||
@@ -3524,9 +3521,6 @@ void BKE_animsys_evaluate_animdata(Depsgraph *depsgraph, Scene *scene, ID *id, A
|
||||
/* evaluate Active Action only */
|
||||
else if (adt->action)
|
||||
animsys_evaluate_action_ex(depsgraph, &id_ptr, adt->action, ctime);
|
||||
|
||||
/* reset tag */
|
||||
adt->recalc &= ~ADT_RECALC_ANIM;
|
||||
}
|
||||
|
||||
/* recalculate drivers
|
||||
@@ -3534,10 +3528,7 @@ void BKE_animsys_evaluate_animdata(Depsgraph *depsgraph, Scene *scene, ID *id, A
|
||||
* or be layered on top of existing animation data.
|
||||
* - Drivers should be in the appropriate order to be evaluated without problems...
|
||||
*/
|
||||
if ((recalc & ADT_RECALC_DRIVERS)
|
||||
/* XXX for now, don't check yet, as depsgraph hasn't been updated */
|
||||
/* && (adt->recalc & ADT_RECALC_DRIVERS)*/)
|
||||
{
|
||||
if (recalc & ADT_RECALC_DRIVERS) {
|
||||
animsys_evaluate_drivers(&id_ptr, adt, ctime);
|
||||
}
|
||||
|
||||
@@ -3555,9 +3546,6 @@ void BKE_animsys_evaluate_animdata(Depsgraph *depsgraph, Scene *scene, ID *id, A
|
||||
RNA_property_update_cache_flush(bmain, scene);
|
||||
RNA_property_update_cache_free();
|
||||
}
|
||||
|
||||
/* clear recalc flag now */
|
||||
adt->recalc = 0;
|
||||
}
|
||||
|
||||
/* Evaluation of all ID-blocks with Animation Data blocks - Animation Data Only
|
||||
@@ -3705,8 +3693,7 @@ void BKE_animsys_eval_animdata(Depsgraph *depsgraph, ID *id)
|
||||
* which should get handled as part of the dependency graph instead...
|
||||
*/
|
||||
DEG_debug_print_eval_time(depsgraph, __func__, id->name, id, ctime);
|
||||
short recalc = ADT_RECALC_ANIM;
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, id, adt, ctime, recalc);
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, id, adt, ctime, ADT_RECALC_ANIM);
|
||||
}
|
||||
|
||||
void BKE_animsys_update_driver_array(ID *id)
|
||||
@@ -3758,7 +3745,7 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph,
|
||||
if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) {
|
||||
/* check if driver itself is tagged for recalculation */
|
||||
/* XXX driver recalc flag is not set yet by depsgraph! */
|
||||
if ((driver_orig) && !(driver_orig->flag & DRIVER_FLAG_INVALID) /*&& (driver_orig->flag & DRIVER_FLAG_RECALC)*/) {
|
||||
if ((driver_orig) && !(driver_orig->flag & DRIVER_FLAG_INVALID)) {
|
||||
/* evaluate this using values set already in other places
|
||||
* NOTE: for 'layering' option later on, we should check if we should remove old value before adding
|
||||
* new to only be done when drivers only changed */
|
||||
@@ -3797,11 +3784,6 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph,
|
||||
}
|
||||
}
|
||||
|
||||
//printf("\tnew val = %f\n", fcu->curval);
|
||||
|
||||
/* clear recalc flag */
|
||||
driver_orig->flag &= ~DRIVER_FLAG_RECALC;
|
||||
|
||||
/* set error-flag if evaluation failed */
|
||||
if (ok == 0) {
|
||||
printf("invalid driver - %s[%d]\n", fcu->rna_path, fcu->array_index);
|
||||
|
||||
@@ -184,7 +184,8 @@ void BKE_cachefile_update_frame(
|
||||
char filename[FILE_MAX];
|
||||
|
||||
for (cache_file = bmain->cachefiles.first; cache_file; cache_file = cache_file->id.next) {
|
||||
/* Execute drivers only, as animation has already been done. */
|
||||
/* TODO: dependency graph should be updated to do drivers on cachefile.
|
||||
* Execute drivers only, as animation has already been done. */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &cache_file->id, cache_file->adt, ctime, ADT_RECALC_DRIVERS);
|
||||
|
||||
if (!cache_file->is_sequence) {
|
||||
|
||||
@@ -5962,8 +5962,6 @@ static int dynamicPaint_doStep(
|
||||
psys_check_enabled(brushObj, brush->psys, for_render))
|
||||
{
|
||||
/* Paint a particle system */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &brush->psys->part->id, brush->psys->part->adt,
|
||||
BKE_scene_frame_get(scene), ADT_RECALC_ANIM);
|
||||
dynamicPaint_paintParticles(surface, brush->psys, brush, timescale);
|
||||
}
|
||||
/* Object center distance: */
|
||||
|
||||
@@ -2210,15 +2210,10 @@ static void solve_parenting(Object *ob, Object *par, float obmat[4][4],
|
||||
}
|
||||
|
||||
/* note, scene is the active scene while actual_scene is the scene the object resides in */
|
||||
void BKE_object_where_is_calc_time_ex(
|
||||
static void object_where_is_calc_ex(
|
||||
Depsgraph *depsgraph, Scene *scene, Object *ob, float ctime,
|
||||
RigidBodyWorld *rbw, float r_originmat[3][3])
|
||||
{
|
||||
if (ob == NULL) return;
|
||||
|
||||
/* execute drivers only, as animation has already been done */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &ob->id, ob->adt, ctime, ADT_RECALC_DRIVERS);
|
||||
|
||||
if (ob->parent) {
|
||||
Object *par = ob->parent;
|
||||
|
||||
@@ -2249,7 +2244,9 @@ void BKE_object_where_is_calc_time_ex(
|
||||
|
||||
void BKE_object_where_is_calc_time(Depsgraph *depsgraph, Scene *scene, Object *ob, float ctime)
|
||||
{
|
||||
BKE_object_where_is_calc_time_ex(depsgraph, scene, ob, ctime, NULL, NULL);
|
||||
/* Execute drivers and animation. */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &ob->id, ob->adt, ctime, ADT_RECALC_ALL);
|
||||
object_where_is_calc_ex(depsgraph, scene, ob, ctime, NULL, NULL);
|
||||
}
|
||||
|
||||
/* get object transformation matrix without recalculating dependencies and
|
||||
@@ -2269,11 +2266,13 @@ void BKE_object_where_is_calc_mat4(Object *ob, float obmat[4][4])
|
||||
|
||||
void BKE_object_where_is_calc_ex(Depsgraph *depsgraph, Scene *scene, RigidBodyWorld *rbw, Object *ob, float r_originmat[3][3])
|
||||
{
|
||||
BKE_object_where_is_calc_time_ex(depsgraph, scene, ob, DEG_get_ctime(depsgraph), rbw, r_originmat);
|
||||
float ctime = DEG_get_ctime(depsgraph);
|
||||
object_where_is_calc_ex(depsgraph, scene, ob, ctime, rbw, r_originmat);
|
||||
}
|
||||
void BKE_object_where_is_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
|
||||
{
|
||||
BKE_object_where_is_calc_time_ex(depsgraph, scene, ob, DEG_get_ctime(depsgraph), NULL, NULL);
|
||||
float ctime = DEG_get_ctime(depsgraph);
|
||||
object_where_is_calc_ex(depsgraph, scene, ob, ctime, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4013,16 +4012,17 @@ bool BKE_object_modifier_update_subframe(
|
||||
/* was originally ID_RECALC_ALL - TODO - which flags are really needed??? */
|
||||
/* TODO(sergey): What about animation? */
|
||||
ob->id.recalc |= ID_RECALC_ALL;
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &ob->id, ob->adt, frame, ADT_RECALC_ANIM);
|
||||
if (update_mesh) {
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &ob->id, ob->adt, frame, ADT_RECALC_ANIM);
|
||||
/* ignore cache clear during subframe updates
|
||||
* to not mess up cache validity */
|
||||
object_cacheIgnoreClear(ob, 1);
|
||||
BKE_object_handle_update(depsgraph, scene, ob);
|
||||
object_cacheIgnoreClear(ob, 0);
|
||||
}
|
||||
else
|
||||
else {
|
||||
BKE_object_where_is_calc_time(depsgraph, scene, ob, frame);
|
||||
}
|
||||
|
||||
/* for curve following objects, parented curve has to be updated too */
|
||||
if (ob->type == OB_CURVE) {
|
||||
|
||||
@@ -158,22 +158,13 @@ void BKE_object_handle_data_update(
|
||||
Scene *scene,
|
||||
Object *ob)
|
||||
{
|
||||
ID *data_id = (ID *)ob->data;
|
||||
AnimData *adt = BKE_animdata_from_id(data_id);
|
||||
Key *key;
|
||||
float ctime = BKE_scene_frame_get(scene);
|
||||
|
||||
DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
|
||||
|
||||
/* TODO(sergey): Only used by legacy depsgraph. */
|
||||
if (adt) {
|
||||
/* evaluate drivers - datalevel */
|
||||
/* XXX: for mesh types, should we push this to evaluated mesh instead? */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, data_id, adt, ctime, ADT_RECALC_DRIVERS);
|
||||
}
|
||||
|
||||
/* TODO(sergey): Only used by legacy depsgraph. */
|
||||
key = BKE_key_from_object(ob);
|
||||
/* TODO: only here to evaluate drivers twice to fix dependency graph
|
||||
* not handling shape key values that depend on each other. */
|
||||
Key *key = BKE_key_from_object(ob);
|
||||
if (key && key->block.first) {
|
||||
if (!(ob->shapeflag & OB_SHAPE_LOCK))
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &key->id, key->adt, ctime, ADT_RECALC_DRIVERS);
|
||||
|
||||
@@ -993,8 +993,6 @@ static void evaluate_emitter_anim(struct Depsgraph *depsgraph, Scene *scene, Obj
|
||||
if (ob->parent)
|
||||
evaluate_emitter_anim(depsgraph, scene, ob->parent, cfra);
|
||||
|
||||
/* we have to force RECALC_ANIM here since where_is_objec_time only does drivers */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &ob->id, ob->adt, cfra, ADT_RECALC_ANIM);
|
||||
BKE_object_where_is_calc_time(depsgraph, scene, ob, cfra);
|
||||
}
|
||||
|
||||
@@ -4239,9 +4237,6 @@ void particle_system_update(struct Depsgraph *depsgraph, Scene *scene, Object *o
|
||||
BKE_mesh_tessface_ensure(sim.psmd->mesh_final);
|
||||
}
|
||||
|
||||
/* execute drivers only, as animation has already been done */
|
||||
BKE_animsys_evaluate_animdata(depsgraph, scene, &part->id, part->adt, cfra, ADT_RECALC_DRIVERS);
|
||||
|
||||
/* to verify if we need to restore object afterwards */
|
||||
psys->flag &= ~PSYS_OB_ANIM_RESTORE;
|
||||
|
||||
|
||||
@@ -1412,6 +1412,8 @@ static void rigidbody_update_sim_ob(Depsgraph *depsgraph, Scene *scene, RigidBod
|
||||
*/
|
||||
static void rigidbody_update_simulation(Depsgraph *depsgraph, Scene *scene, RigidBodyWorld *rbw, bool rebuild)
|
||||
{
|
||||
float ctime = DEG_get_ctime(depsgraph);
|
||||
|
||||
/* update world */
|
||||
if (rebuild)
|
||||
BKE_rigidbody_validate_sim_world(scene, rbw, true);
|
||||
@@ -1443,7 +1445,7 @@ static void rigidbody_update_simulation(Depsgraph *depsgraph, Scene *scene, Rigi
|
||||
/* validate that we've got valid object set up here... */
|
||||
RigidBodyOb *rbo = ob->rigidbody_object;
|
||||
/* update transformation matrix of the object so we don't get a frame of lag for simple animations */
|
||||
BKE_object_where_is_calc(depsgraph, scene, ob);
|
||||
BKE_object_where_is_calc_time(depsgraph, scene, ob, ctime);
|
||||
|
||||
/* TODO remove this whole block once we are sure we never get NULL rbo here anymore. */
|
||||
/* This cannot be done in CoW evaluation context anymore... */
|
||||
@@ -1497,7 +1499,7 @@ static void rigidbody_update_simulation(Depsgraph *depsgraph, Scene *scene, Rigi
|
||||
/* validate that we've got valid object set up here... */
|
||||
RigidBodyCon *rbc = ob->rigidbody_constraint;
|
||||
/* update transformation matrix of the object so we don't get a frame of lag for simple animations */
|
||||
BKE_object_where_is_calc(depsgraph, scene, ob);
|
||||
BKE_object_where_is_calc_time(depsgraph, scene, ob, ctime);
|
||||
|
||||
/* TODO remove this whole block once we are sure we never get NULL rbo here anymore. */
|
||||
/* This cannot be done in CoW evaluation context anymore... */
|
||||
|
||||
@@ -1402,7 +1402,7 @@ static void scene_armature_depsgraph_workaround(Main *bmain, Depsgraph *depsgrap
|
||||
return;
|
||||
}
|
||||
for (ob = bmain->object.first; ob; ob = ob->id.next) {
|
||||
if (ob->type == OB_ARMATURE && ob->adt && ob->adt->recalc & ADT_RECALC_ANIM) {
|
||||
if (ob->type == OB_ARMATURE && ob->adt) {
|
||||
if (ob->pose == NULL || (ob->pose->flag & POSE_RECALC)) {
|
||||
BKE_pose_rebuild(bmain, ob, ob->data, true);
|
||||
}
|
||||
|
||||
@@ -132,12 +132,6 @@ void deg_graph_build_finalize(Main *bmain, Depsgraph *graph)
|
||||
ID *id = id_node->id_orig;
|
||||
id_node->finalize_build(graph);
|
||||
int flag = 0;
|
||||
if ((id->recalc & ID_RECALC_ALL)) {
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
if (adt != NULL && (adt->recalc & ADT_RECALC_ANIM) != 0) {
|
||||
flag |= ID_RECALC_ANIMATION;
|
||||
}
|
||||
}
|
||||
/* Tag rebuild if special evaluation flags changed. */
|
||||
if (id_node->eval_flags != id_node->previous_eval_flags) {
|
||||
flag |= ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY;
|
||||
|
||||
@@ -166,13 +166,6 @@ void DepsgraphNodeBuilder::build_rig(Object *object, bool is_object_visible)
|
||||
if (object->pose == NULL || (object->pose->flag & POSE_RECALC)) {
|
||||
/* By definition, no need to tag depsgraph as dirty from here, so we can pass NULL bmain. */
|
||||
BKE_pose_rebuild(NULL, object, armature, true);
|
||||
/* XXX: Without this animation gets lost in certain circumstances
|
||||
* after loading file. Need to investigate further since it does
|
||||
* not happen with simple scenes..
|
||||
*/
|
||||
if (object->adt) {
|
||||
object->adt->recalc |= ADT_RECALC_ANIM;
|
||||
}
|
||||
}
|
||||
/* Speed optimization for animation lookups. */
|
||||
if (object->pose != NULL) {
|
||||
|
||||
@@ -72,7 +72,6 @@ static void eevee_motion_blur_camera_get_matrix_at_time(
|
||||
/* Past matrix */
|
||||
/* FIXME : This is a temporal solution that does not take care of parent animations */
|
||||
/* Recalc Anim manually */
|
||||
BKE_animsys_evaluate_animdata(draw_ctx->depsgraph, scene, &cam_cpy.id, cam_cpy.adt, time, ADT_RECALC_ALL);
|
||||
BKE_animsys_evaluate_animdata(draw_ctx->depsgraph, scene, &camdata_cpy.id, camdata_cpy.adt, time, ADT_RECALC_ALL);
|
||||
BKE_object_where_is_calc_time(draw_ctx->depsgraph, scene, &cam_cpy, time);
|
||||
|
||||
|
||||
@@ -77,7 +77,6 @@ void ANIM_list_elem_update(Main *bmain, Scene *scene, bAnimListElem *ale)
|
||||
/* tag AnimData for refresh so that other views will update in realtime with these changes */
|
||||
adt = BKE_animdata_from_id(id);
|
||||
if (adt) {
|
||||
adt->recalc |= ADT_RECALC_ANIM;
|
||||
DEG_id_tag_update(id, ID_RECALC_ANIMATION);
|
||||
if (adt->action != NULL) {
|
||||
DEG_id_tag_update(&adt->action->id, ID_RECALC_COPY_ON_WRITE);
|
||||
@@ -117,13 +116,6 @@ void ANIM_list_elem_update(Main *bmain, Scene *scene, bAnimListElem *ale)
|
||||
void ANIM_id_update(Main *bmain, ID *id)
|
||||
{
|
||||
if (id) {
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
|
||||
/* tag AnimData for refresh so that other views will update in realtime with these changes */
|
||||
if (adt)
|
||||
adt->recalc |= ADT_RECALC_ANIM;
|
||||
|
||||
/* set recalc flags */
|
||||
DEG_id_tag_update_ex(bmain, id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION); // XXX or do we want something more restrictive?
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1242,7 +1242,7 @@ static void object_pose_tag_update(Main *bmain, Object *ob)
|
||||
* Note that this is a bit wide here, since we cannot be sure whether there are some locked proxy bones
|
||||
* or not...
|
||||
* XXX Temp hack until new depsgraph hopefully solves this. */
|
||||
ob->adt->recalc |= ADT_RECALC_ANIM;
|
||||
DEG_id_tag_update(&ob->id, ID_RECALC_ANIMATION);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1856,7 +1856,7 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
|
||||
/* We need to make use of ugly POSE_ANIMATION_WORKAROUND here too, else anim data are not reloaded
|
||||
* after calling `BKE_pose_rebuild()`, which causes T43872.
|
||||
* XXX Temp hack until new depsgraph hopefully solves this. */
|
||||
ob->adt->recalc |= ADT_RECALC_ANIM;
|
||||
DEG_id_tag_update(&ob->id, ID_RECALC_ANIMATION);
|
||||
}
|
||||
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_TRANSFORM);
|
||||
}
|
||||
|
||||
@@ -2190,23 +2190,8 @@ static int ocean_bake_exec(bContext *C, wmOperator *op)
|
||||
|
||||
/* precalculate time variable before baking */
|
||||
for (f = omd->bakestart; f <= omd->bakeend; f++) {
|
||||
/* from physics_fluid.c:
|
||||
*
|
||||
* XXX: This can't be used due to an anim sys optimization that ignores recalc object animation,
|
||||
* leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ )
|
||||
* --> BKE_animsys_evaluate_all_animation(bmain, eval_time);
|
||||
* This doesn't work with drivers:
|
||||
* --> BKE_animsys_evaluate_animdata(&fsDomain->id, fsDomain->adt, eval_time, ADT_RECALC_ALL);
|
||||
*/
|
||||
|
||||
/* Modifying the global scene isn't nice, but we can do it in
|
||||
* this part of the process before a threaded job is created */
|
||||
|
||||
//scene->r.cfra = f;
|
||||
//ED_update_for_newframe(bmain, scene);
|
||||
|
||||
/* ok, this doesn't work with drivers, but is way faster.
|
||||
* let's use this for now and hope nobody wants to drive the time value... */
|
||||
/* For now only simple animation of time value is supported, nothing else.
|
||||
* No drivers or other modifier parameters. */
|
||||
BKE_animsys_evaluate_animdata(CTX_data_depsgraph(C), scene, (ID *)ob, ob->adt, f, ADT_RECALC_ANIM);
|
||||
|
||||
och->time[i] = omd->time;
|
||||
|
||||
@@ -399,13 +399,6 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid
|
||||
|
||||
eval_time = domainSettings->bakeStart + i;
|
||||
|
||||
/* XXX: This can't be used due to an anim sys optimization that ignores recalc object animation,
|
||||
* leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ )
|
||||
* --> BKE_animsys_evaluate_all_animation(CTX_data_main(C), eval_time);
|
||||
* This doesn't work with drivers:
|
||||
* --> BKE_animsys_evaluate_animdata(&fsDomain->id, fsDomain->adt, eval_time, ADT_RECALC_ALL);
|
||||
*/
|
||||
|
||||
/* Modifying the global scene isn't nice, but we can do it in
|
||||
* this part of the process before a threaded job is created */
|
||||
scene->r.cfra = (int)eval_time;
|
||||
|
||||
@@ -5791,7 +5791,7 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
|
||||
skip_invert = true;
|
||||
|
||||
if (skip_invert == false && constinv == false) {
|
||||
ob->transflag |= OB_NO_CONSTRAINTS; /* BKE_object_where_is_calc_time checks this */
|
||||
ob->transflag |= OB_NO_CONSTRAINTS; /* BKE_object_where_is_calc checks this */
|
||||
BKE_object_where_is_calc(t->depsgraph, t->scene, ob);
|
||||
ob->transflag &= ~OB_NO_CONSTRAINTS;
|
||||
}
|
||||
|
||||
@@ -520,8 +520,7 @@ typedef enum eDriver_Types {
|
||||
typedef enum eDriver_Flags {
|
||||
/* driver has invalid settings (internal flag) */
|
||||
DRIVER_FLAG_INVALID = (1<<0),
|
||||
/* driver needs recalculation (set by depsgraph) */
|
||||
DRIVER_FLAG_RECALC = (1<<1),
|
||||
DRIVER_FLAG_DEPRECATED = (1<<1),
|
||||
/* driver does replace value, but overrides (for layering of animation over driver) */
|
||||
// TODO: this needs to be implemented at some stage or left out...
|
||||
//DRIVER_FLAG_LAYERING = (1<<2),
|
||||
@@ -1058,8 +1057,7 @@ typedef struct AnimData {
|
||||
/* settings for animation evaluation */
|
||||
/** User-defined settings. */
|
||||
int flag;
|
||||
/** Depsgraph recalculation flags. */
|
||||
int recalc;
|
||||
int pad;
|
||||
|
||||
/* settings for active action evaluation (based on NLA strip settings) */
|
||||
/** Accumulation mode for active action. */
|
||||
@@ -1100,13 +1098,6 @@ typedef enum eAnimData_Flag {
|
||||
ADT_CURVES_ALWAYS_VISIBLE = (1<<17),
|
||||
} eAnimData_Flag;
|
||||
|
||||
/* Animation Data recalculation settings (to be set by depsgraph) */
|
||||
typedef enum eAnimData_Recalc {
|
||||
ADT_RECALC_DRIVERS = (1 << 0),
|
||||
ADT_RECALC_ANIM = (1 << 1),
|
||||
ADT_RECALC_ALL = (ADT_RECALC_DRIVERS | ADT_RECALC_ANIM),
|
||||
} eAnimData_Recalc;
|
||||
|
||||
/* Base Struct for Anim ------------------------------------- */
|
||||
|
||||
/* Used for BKE_animdata_from_id()
|
||||
|
||||
@@ -622,8 +622,6 @@ static void rna_FModifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Poin
|
||||
*/
|
||||
DEG_id_tag_update(id, ID_RECALC_ANIMATION);
|
||||
if (adt != NULL) {
|
||||
adt->recalc |= ADT_RECALC_ANIM;
|
||||
|
||||
if (adt->action != NULL) {
|
||||
/* action is separate datablock, needs separate tag */
|
||||
DEG_id_tag_update(&adt->action->id, ID_RECALC_COPY_ON_WRITE);
|
||||
|
||||
@@ -1516,7 +1516,7 @@ static void rna_SpaceDopeSheetEditor_action_update(bContext *C, PointerRNA *ptr)
|
||||
}
|
||||
|
||||
/* Force update of animdata */
|
||||
adt->recalc |= ADT_RECALC_ANIM;
|
||||
DEG_id_tag_update(&obact->id, ID_RECALC_ANIMATION);
|
||||
}
|
||||
|
||||
/* force depsgraph flush too */
|
||||
|
||||
Reference in New Issue
Block a user