[Bf-blender-cvs] [00ddbd5848d] blender2.8: Depsgraph: Fix crash with copy on write when scene has legacy bases
Sergey Sharybin
noreply at git.blender.org
Thu Jul 20 13:27:51 CEST 2017
Commit: 00ddbd5848da7e746e23695cff00a739eaf75cf2
Author: Sergey Sharybin
Date: Thu Jul 20 13:25:52 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB00ddbd5848da7e746e23695cff00a739eaf75cf2
Depsgraph: Fix crash with copy on write when scene has legacy bases
The remapping code was creating plkaceholders for objects coming from legacy
bases, but since those objects were never created by dependency graph (since
they are supposed to be ignored) the copy on write relations creation was
confused.
Now we do some special trickery to clear legacy bases on copy on write.
===================================================================
M source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
===================================================================
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index f895563dd99..da06cfdf330 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -110,7 +110,18 @@ void nested_id_hack_discard_pointers(ID *id_cow)
SPECIAL_CASE(ID_LS, FreestyleLineStyle, nodetree)
SPECIAL_CASE(ID_LA, Lamp, nodetree)
SPECIAL_CASE(ID_MA, Material, nodetree)
+#if 0
SPECIAL_CASE(ID_SCE, Scene, nodetree)
+#else
+ case ID_SCE:
+ {
+ Scene *scene_cow = (Scene *)id_cow;
+ scene_cow->nodetree = NULL;
+ scene_cow->base.first = NULL;
+ scene_cow->base.last = NULL;
+ break;
+ }
+#endif
SPECIAL_CASE(ID_TE, Tex, nodetree)
SPECIAL_CASE(ID_WO, World, nodetree)
@@ -142,7 +153,18 @@ const ID *nested_id_hack_get_discarded_pointers(NestedIDHackTempStorage *storage
SPECIAL_CASE(ID_LS, FreestyleLineStyle, nodetree, linestyle)
SPECIAL_CASE(ID_LA, Lamp, nodetree, lamp)
SPECIAL_CASE(ID_MA, Material, nodetree, material)
+#if 0
SPECIAL_CASE(ID_SCE, Scene, nodetree, scene)
+#else
+ case ID_SCE:
+ {
+ storage->scene = *(Scene *)id;
+ storage->scene.nodetree = NULL;
+ storage->scene.base.first = NULL;
+ storage->scene.base.last = NULL;
+ return &storage->scene.id;
+ }
+#endif
SPECIAL_CASE(ID_TE, Tex, nodetree, tex)
SPECIAL_CASE(ID_WO, World, nodetree, world)
More information about the Bf-blender-cvs
mailing list