Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-04-19 13:03:02 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-04-19 13:05:17 +0300
commitb352d2705d1f4849022aa3d93d0d1a8881862d7b (patch)
treea11785c4d2cc5fa677a0fc1e884194aa2d303727
parentcaa7101df545bf5f3827fd26216b7e6d83e2f452 (diff)
Depsgraph: Fix crash with copy-on-write enabled
Was caused by ec0756af6c7, once again, we can't pass view layer, need to pass index. The sad part is that currently we don't have quick way to look up view layer by index. Can do similar thing as we do for bones and bases.
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/intern/object_update.c9
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc6
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h1
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc6
5 files changed, 16 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 2f352a880ca..1d28d7f52c7 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -248,7 +248,7 @@ void BKE_object_data_select_update(
void BKE_object_eval_flush_base_flags(
struct Depsgraph *depsgraph,
- struct ViewLayer *view_layer,
+ struct Scene *scene, const int view_layer_index,
struct Object *object, int base_index,
const bool is_from_set);
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index d043fcc9d1c..c8612c1d55c 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -445,9 +445,14 @@ void BKE_object_data_select_update(Depsgraph *UNUSED(depsgraph),
}
void BKE_object_eval_flush_base_flags(Depsgraph *UNUSED(depsgraph),
- ViewLayer *view_layer,
- Object *object, int base_index, bool is_from_set)
+ Scene *scene, const int view_layer_index,
+ Object *object, int base_index,
+ const bool is_from_set)
{
+ /* TODO(sergey): Avoid list lookup. */
+ BLI_assert(view_layer_index >= 0);
+ ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index);
+ BLI_assert(view_layer != NULL);
BLI_assert(view_layer->object_bases_array != NULL);
BLI_assert(base_index >= 0);
BLI_assert(base_index < MEM_allocN_len(view_layer->object_bases_array) / sizeof(Base *));
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index af321cb70e8..2e251c84fda 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -526,14 +526,16 @@ void DepsgraphNodeBuilder::build_object_flags(
if (base_index == -1) {
return;
}
- /* TODO(sergey): Is this really best component to be used? */
+ Scene *scene_cow = get_cow_datablock(scene_);
Object *object_cow = get_cow_datablock(object);
const bool is_from_set = (linked_state == DEG_ID_LINKED_VIA_SET);
+ /* TODO(sergey): Is this really best component to be used? */
add_operation_node(&object->id,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
function_bind(BKE_object_eval_flush_base_flags,
_1,
- view_layer_,
+ scene_cow,
+ view_layer_index_,
object_cow, base_index,
is_from_set),
DEG_OPCODE_OBJECT_BASE_FLAGS);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 757cacc6050..0180aa3b734 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -234,6 +234,7 @@ protected:
/* State which demotes currently built entities. */
Scene *scene_;
ViewLayer *view_layer_;
+ int view_layer_index_;
GHash *cow_id_hash_;
BuilderMap built_map_;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
index 390619aeeaa..750b0054ee5 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
@@ -70,6 +70,8 @@ void DepsgraphNodeBuilder::build_view_layer(
ViewLayer *view_layer,
eDepsNode_LinkedState_Type linked_state)
{
+ view_layer_index_ = BLI_findindex(&scene->view_layers, view_layer);
+ BLI_assert(view_layer_index_ != -1);
/* Scene ID block. */
add_id_node(&scene->id);
/* Time source. */
@@ -134,14 +136,12 @@ void DepsgraphNodeBuilder::build_view_layer(
build_movieclip(clip);
}
/* Collections. */
- int view_layer_index = BLI_findindex(&scene->view_layers, view_layer);
- BLI_assert(view_layer_index != -1);
add_operation_node(&scene->id,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
function_bind(BKE_layer_eval_view_layer_indexed,
_1,
&scene_cow->id,
- view_layer_index),
+ view_layer_index_),
DEG_OPCODE_VIEW_LAYER_EVAL);
/* Parameters evaluation for scene relations mainly. */
add_operation_node(&scene->id,