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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user