[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