From 23b2f987d34e2cf063bbdeebbc7b4da02dbe5c58 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 19 Jun 2025 00:24:11 +0000 Subject: [PATCH] Fix #138715: Crash selecting in edit-mode with geometry-node modifiers The logic to access the edit-mesh for the selection engine didn't match the logic used for drawing. Resolve using the edit-mesh from: BKE_object_get_pre_modified_mesh Ref !140525 --- .../blender/draw/engines/select/select_engine.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/engines/select/select_engine.cc b/source/blender/draw/engines/select/select_engine.cc index d5fc9ba46c5..ce7afd1df93 100644 --- a/source/blender/draw/engines/select/select_engine.cc +++ b/source/blender/draw/engines/select/select_engine.cc @@ -204,6 +204,7 @@ struct Instance : public DrawEngine { } ElemIndexRanges edit_mesh_sync(Object *ob, + BMEditMesh *em, ResourceHandle res_handle, short select_mode, bool draw_facedot, @@ -212,7 +213,6 @@ struct Instance : public DrawEngine { using namespace blender::draw; using namespace blender; Mesh &mesh = DRW_object_get_data_for_drawing(*ob); - BMEditMesh *em = mesh.runtime->edit_mesh.get(); ElemIndexRanges ranges{}; ranges.total = IndexRange::from_begin_size(initial_index, 0); @@ -313,10 +313,16 @@ struct Instance : public DrawEngine { switch (ob->type) { case OB_MESH: { - const Mesh &mesh = DRW_object_get_data_for_drawing(*ob); - if (mesh.runtime->edit_mesh) { + const bool is_editmode = ob->mode == OB_MODE_EDIT; + /* NOTE: it's important to get the edit-mesh before modifiers have been applied + * because the evaluated mesh may not have an edit-mesh, see #138715. + * Match edit-mesh access from #mesh_render_data_create. */ + const Mesh *orig_edit_mesh = is_editmode ? BKE_object_get_pre_modified_mesh(ob) : nullptr; + BMEditMesh *em = (orig_edit_mesh) ? orig_edit_mesh->runtime->edit_mesh.get() : nullptr; + + if (em) { bool draw_facedot = check_ob_drawface_dot(select_mode, v3d, eDrawType(ob->dt)); - return edit_mesh_sync(ob, res_handle, select_mode, draw_facedot, index_start); + return edit_mesh_sync(ob, em, res_handle, select_mode, draw_facedot, index_start); } return mesh_sync(ob, res_handle, select_mode, index_start); }