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
This commit is contained in:
Campbell Barton
2025-06-19 00:24:11 +00:00
parent 8ede46ae1e
commit 23b2f987d3

View File

@@ -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<Mesh>(*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<Mesh>(*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);
}