[Bf-blender-cvs] [4c31bed6b46] blender2.8: Fix T57981: Crash entering sculpt mode

Sergey Sharybin noreply at git.blender.org
Fri Nov 30 01:47:28 CET 2018


Commit: 4c31bed6b462db32bf2c2eabf6af932428a65f25
Author: Sergey Sharybin
Date:   Fri Nov 30 11:46:42 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB4c31bed6b462db32bf2c2eabf6af932428a65f25

Fix T57981: Crash entering sculpt mode

===================================================================

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 636b270fe83..89d3740c43e 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
@@ -131,7 +131,6 @@ 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)
-		SPECIAL_CASE(ID_SCE, Scene, nodetree)
 		SPECIAL_CASE(ID_TE, Tex, nodetree)
 		SPECIAL_CASE(ID_WO, World, nodetree)
 
@@ -139,6 +138,17 @@ void nested_id_hack_discard_pointers(ID *id_cow)
 		SPECIAL_CASE(ID_LT, Lattice, key)
 		SPECIAL_CASE(ID_ME, Mesh, key)
 
+		case ID_SCE:
+		{
+			Scene *scene_cow = (Scene *)id_cow;
+			/* Node trees always have their own ID node in the graph, and are
+			 * being copied as part of their copy-on-write process. */
+			scene_cow->nodetree = NULL;
+			/* Tool settings pointer is shared with the original scene. */
+			scene_cow->toolsettings = NULL;
+			break;
+		}
+
 		case ID_OB:
 		{
 			/* Clear the ParticleSettings pointer to prevent doubly-freeing it. */
@@ -174,7 +184,6 @@ 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)
-		SPECIAL_CASE(ID_SCE, Scene, nodetree, scene)
 		SPECIAL_CASE(ID_TE, Tex, nodetree, tex)
 		SPECIAL_CASE(ID_WO, World, nodetree, world)
 
@@ -182,6 +191,14 @@ const ID *nested_id_hack_get_discarded_pointers(NestedIDHackTempStorage *storage
 		SPECIAL_CASE(ID_LT, Lattice, key, lattice)
 		SPECIAL_CASE(ID_ME, Mesh, key, mesh)
 
+		case ID_SCE:
+		{
+			storage->scene = *(Scene *)id;
+			storage->scene.toolsettings = NULL;
+			storage->scene.nodetree = NULL;
+			return &storage->scene.id;
+		}
+
 #  undef SPECIAL_CASE
 
 		default:
@@ -629,6 +646,7 @@ void update_special_pointers(const Depsgraph *depsgraph,
 		{
 			Scene *scene_cow = (Scene *)id_cow;
 			const Scene *scene_orig = (const Scene *)id_orig;
+			scene_cow->toolsettings = scene_orig->toolsettings;
 			scene_cow->eevee.light_cache = scene_orig->eevee.light_cache;
 			break;
 		}
@@ -1003,6 +1021,7 @@ void discard_mesh_edit_mode_pointers(ID *id_cow)
 void discard_scene_pointers(ID *id_cow)
 {
 	Scene *scene_cow = (Scene *)id_cow;
+	scene_cow->toolsettings = NULL;
 	scene_cow->eevee.light_cache = NULL;
 }



More information about the Bf-blender-cvs mailing list