Fix crash with wertex and weight modes
Similar to recent sculpt mode.
This commit is contained in:
parent
f638ad61b8
commit
0417f205f5
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue