Depsgraph: more tweaking for update acces from python API

* Move scene_update_pre callback before depsgraph flusing so it works better
  when you do modifications on objects then.
* Fix missing update after making modifications in frame_change_pre, recalc
  flags were not being flushed.
This commit is contained in:
Brecht Van Lommel 2011-11-03 16:41:48 +00:00
parent b99f6e3d08
commit d53989bda6

@ -990,18 +990,22 @@ static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scen
/* this is called in main loop, doing tagged updates before redraw */ /* this is called in main loop, doing tagged updates before redraw */
void scene_update_tagged(Main *bmain, Scene *scene) void scene_update_tagged(Main *bmain, Scene *scene)
{ {
DAG_ids_flush_tagged(bmain); /* keep this first */
BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_PRE); BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_PRE);
/* flush recalc flags to dependencies */
DAG_ids_flush_tagged(bmain);
scene->physics_settings.quick_cache_step= 0; scene->physics_settings.quick_cache_step= 0;
/* update all objects: drivers, matrices, displists, etc. flags set /* update all objects: drivers, matrices, displists, etc. flags set
by depgraph or manual, no layer check here, gets correct flushed */ by depgraph or manual, no layer check here, gets correct flushed
in the future this should handle updates for all datablocks, not
only objects and scenes. - brecht */
scene_update_tagged_recursive(bmain, scene, scene); scene_update_tagged_recursive(bmain, scene, scene);
/* recalc scene animation data here (for sequencer) */ /* extra call here to recalc scene animation (for sequencer) */
{ {
AnimData *adt= BKE_animdata_from_id(&scene->id); AnimData *adt= BKE_animdata_from_id(&scene->id);
float ctime = BKE_curframe(scene); float ctime = BKE_curframe(scene);
@ -1010,15 +1014,15 @@ void scene_update_tagged(Main *bmain, Scene *scene)
BKE_animsys_evaluate_animdata(scene, &scene->id, adt, ctime, 0); BKE_animsys_evaluate_animdata(scene, &scene->id, adt, ctime, 0);
} }
/* quick point cache updates */
if (scene->physics_settings.quick_cache_step) if (scene->physics_settings.quick_cache_step)
BKE_ptcache_quick_cache_all(bmain, scene); BKE_ptcache_quick_cache_all(bmain, scene);
/* notify editors about recalc */
DAG_ids_check_recalc(bmain); DAG_ids_check_recalc(bmain);
/* keep this last */
BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_POST); BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_POST);
/* in the future this should handle updates for all datablocks, not
only objects and scenes. - brecht */
} }
void scene_clear_tagged(Main *bmain, Scene *UNUSED(scene)) void scene_clear_tagged(Main *bmain, Scene *UNUSED(scene))
@ -1033,7 +1037,8 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
Scene *sce_iter; Scene *sce_iter;
/* keep this first */ /* keep this first */
BLI_exec_cb(bmain, (ID *)sce, BLI_CB_EVT_FRAME_CHANGE_PRE); BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_PRE);
BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_SCENE_UPDATE_PRE);
sound_set_cfra(sce->r.cfra); sound_set_cfra(sce->r.cfra);
@ -1045,13 +1050,15 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
DAG_scene_sort(bmain, sce_iter); DAG_scene_sort(bmain, sce_iter);
} }
/* flush recalc flags to dependencies, if we were only changing a frame
this would not be necessary, but if a user or a script has modified
some datablock before scene_update_tagged was called, we need the flush */
DAG_ids_flush_tagged(bmain);
/* Following 2 functions are recursive /* Following 2 functions are recursive
* so dont call within 'scene_update_tagged_recursive' */ * so dont call within 'scene_update_tagged_recursive' */
DAG_scene_update_flags(bmain, sce, lay, TRUE); // only stuff that moves or needs display still DAG_scene_update_flags(bmain, sce, lay, TRUE); // only stuff that moves or needs display still
BLI_exec_cb(bmain, (ID *)sce, BLI_CB_EVT_SCENE_UPDATE_PRE);
/* All 'standard' (i.e. without any dependencies) animation is handled here, /* All 'standard' (i.e. without any dependencies) animation is handled here,
* with an 'local' to 'macro' order of evaluation. This should ensure that * with an 'local' to 'macro' order of evaluation. This should ensure that
* settings stored nestled within a hierarchy (i.e. settings in a Texture block * settings stored nestled within a hierarchy (i.e. settings in a Texture block
@ -1065,8 +1072,8 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
scene_update_tagged_recursive(bmain, sce, sce); scene_update_tagged_recursive(bmain, sce, sce);
/* keep this last */ /* keep this last */
BLI_exec_cb(bmain, (ID *)sce, BLI_CB_EVT_SCENE_UPDATE_POST); BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_SCENE_UPDATE_POST);
BLI_exec_cb(bmain, (ID *)sce, BLI_CB_EVT_FRAME_CHANGE_POST); BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_POST);
DAG_ids_clear_recalc(bmain); DAG_ids_clear_recalc(bmain);
} }