Fix T64161: Crashing using undo and multiple windows

It is possible that dependency graph was not yet initialized,
so need to do NULL pointer check.
This commit is contained in:
2019-05-06 16:38:17 +02:00
parent 958e00cebf
commit 4cdb4b9532
3 changed files with 25 additions and 2 deletions

View File

@@ -79,6 +79,16 @@ void DEG_get_customdata_mask_for_object(const struct Depsgraph *graph,
* one. Assert will happen if it's not. */
struct Scene *DEG_get_evaluated_scene(const struct Depsgraph *graph);
/* Similar to DEG_get_evaluated_scene(), but allows to access non-fully evaluated pointer without
* causing asserts or crashes. Works the following way:
* - If the scene was never evaluated NULL returned.
* - Otherwise the last known state of the scene is returned.
*
* Use in exceptional case if it's absolutely must to.
*
* Allows to pass depsgraph == NULL, wil lreturn NULL in that case. */
struct Scene *DEG_get_evaluated_scene_if_exists(const struct Depsgraph *graph);
/* Get view layer at its evaluated state.
* This is a shortcut for accessing active view layer from evaluated scene. */
struct ViewLayer *DEG_get_evaluated_view_layer(const struct Depsgraph *graph);

View File

@@ -152,6 +152,19 @@ Scene *DEG_get_evaluated_scene(const Depsgraph *graph)
return scene_cow;
}
Scene *DEG_get_evaluated_scene_if_exists(const Depsgraph *graph)
{
if (graph == NULL) {
return NULL;
}
const DEG::Depsgraph *deg_graph = reinterpret_cast<const DEG::Depsgraph *>(graph);
Scene *scene_cow = deg_graph->scene_cow;
if (scene_cow == NULL || !DEG::deg_copy_on_write_is_expanded(&scene_cow->id)) {
return NULL;
}
return scene_cow;
}
ViewLayer *DEG_get_evaluated_view_layer(const Depsgraph *graph)
{
const DEG::Depsgraph *deg_graph = reinterpret_cast<const DEG::Depsgraph *>(graph);

View File

@@ -3097,9 +3097,9 @@ void wm_event_do_handlers(bContext *C)
CTX_data_scene_set(C, scene);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Scene *scene_eval = DEG_get_evaluated_scene_if_exists(depsgraph);
if (scene) {
if (scene_eval) {
const int is_playing_sound = BKE_sound_scene_playing(scene_eval);
if (is_playing_sound != -1) {