[Bf-blender-cvs] [0417f205f56] blender2.8: Fix crash with wertex and weight modes

Sergey Sharybin noreply at git.blender.org
Fri Jun 8 16:24:12 CEST 2018


Commit: 0417f205f564bb883181c27db86d5639a97b0121
Author: Sergey Sharybin
Date:   Fri Jun 8 16:22:52 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB0417f205f564bb883181c27db86d5639a97b0121

Fix crash with wertex and weight modes

Similar to recent sculpt mode.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/editors/sculpt_paint/paint_vertex.c
M	source/blender/editors/sculpt_paint/sculpt.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 7ff0093db6c..6172c9998af 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -66,6 +66,7 @@ void BKE_object_free_curve_cache(struct Object *ob);
 
 void BKE_object_free(struct Object *ob);
 void BKE_object_free_derived_caches(struct Object *ob);
+void BKE_object_free_derived_mesh_caches(struct Object *ob);
 void BKE_object_free_caches(struct Object *object);
 
 void BKE_object_modifier_hook_reset(struct Object *ob, struct HookModifierData *hmd);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 3951f15a50d..f55925f64f5 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -330,16 +330,7 @@ void BKE_object_free_derived_caches(Object *ob)
 		ob->bb = NULL;
 	}
 
-	if (ob->derivedFinal) {
-		ob->derivedFinal->needsFree = 1;
-		ob->derivedFinal->release(ob->derivedFinal);
-		ob->derivedFinal = NULL;
-	}
-	if (ob->derivedDeform) {
-		ob->derivedDeform->needsFree = 1;
-		ob->derivedDeform->release(ob->derivedDeform);
-		ob->derivedDeform = NULL;
-	}
+	BKE_object_free_derived_mesh_caches(ob);
 
 	if (ob->runtime.mesh_eval != NULL) {
 		Mesh *mesh_eval = ob->runtime.mesh_eval;
@@ -365,6 +356,20 @@ void BKE_object_free_derived_caches(Object *ob)
 	BKE_object_free_curve_cache(ob);
 }
 
+void BKE_object_free_derived_mesh_caches(struct Object *ob)
+{
+	if (ob->derivedFinal) {
+		ob->derivedFinal->needsFree = 1;
+		ob->derivedFinal->release(ob->derivedFinal);
+		ob->derivedFinal = NULL;
+	}
+	if (ob->derivedDeform) {
+		ob->derivedDeform->needsFree = 1;
+		ob->derivedDeform->release(ob->derivedDeform);
+		ob->derivedDeform = NULL;
+	}
+}
+
 void BKE_object_free_caches(Object *object)
 {
 	ModifierData *md;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index dab207d7350..5a5c76318f3 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -59,6 +59,7 @@
 #include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_mesh_mapping.h"
+#include "BKE_object.h"
 #include "BKE_object_deform.h"
 #include "BKE_paint.h"
 #include "BKE_report.h"
@@ -1067,6 +1068,11 @@ static void ed_vwpaintmode_enter_generic(
 	ob->mode |= mode_flag;
 	Mesh *me = BKE_mesh_from_object(ob);
 
+	/* Same as sculpt mode, make sure we don't have cached derived mesh which
+	 * points to freed arrays.
+	 */
+	BKE_object_free_derived_mesh_caches(ob);
+
 	if (mode_flag == OB_MODE_VERTEX_PAINT) {
 		const ePaintMode paint_mode = ePaintVertex;
 		ED_mesh_color_ensure(me, NULL);
@@ -1192,6 +1198,9 @@ static void ed_vwpaintmode_exit_generic(
 		ED_mesh_mirror_topo_table(NULL, NULL, 'e');
 	}
 
+	/* Never leave derived meshes behind. */
+	BKE_object_free_derived_mesh_caches(ob);
+
 	/* Flush object mode. */
 	DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
 }
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index a59e2abdb5f..2e9d55a4c6f 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5668,11 +5668,7 @@ void ED_object_sculptmode_enter_ex(
 	/* Make sure derived final from original object does not reference possibly
 	 * freed memory.
 	 */
-	if (ob->derivedFinal != NULL) {
-		ob->derivedFinal->needsFree = true;
-		ob->derivedFinal->release(ob->derivedFinal);
-		ob->derivedFinal = NULL;
-	}
+	BKE_object_free_derived_mesh_caches(ob);
 
 	sculpt_init_session(depsgraph, scene, ob);
 
@@ -5801,6 +5797,9 @@ void ED_object_sculptmode_exit_ex(
 
 	paint_cursor_delete_textures();
 
+	/* Never leave derived meshes behind. */
+	BKE_object_free_derived_mesh_caches(ob);
+
 	/* Flush object mode. */
 	DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
 }



More information about the Bf-blender-cvs mailing list