From 7935d3668a937ec5046558f9ff885a42a87b3384 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 2 Mar 2022 16:10:42 +0100 Subject: Fix T95479: geometry nodes crash with cage display Differential Revision: https://developer.blender.org/D14225 --- source/blender/modifiers/intern/MOD_nodes.cc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'source/blender/modifiers') diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index a4b46b951a3..269f0d94dc1 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -1227,8 +1227,34 @@ static void modifyGeometry(ModifierData *md, return; } + bool use_orig_index_verts = false; + bool use_orig_index_edges = false; + bool use_orig_index_polys = false; + if (geometry_set.has_mesh()) { + const Mesh &mesh = *geometry_set.get_mesh_for_read(); + use_orig_index_verts = CustomData_has_layer(&mesh.vdata, CD_ORIGINDEX); + use_orig_index_edges = CustomData_has_layer(&mesh.edata, CD_ORIGINDEX); + use_orig_index_polys = CustomData_has_layer(&mesh.pdata, CD_ORIGINDEX); + } + geometry_set = compute_geometry( tree, input_nodes, output_node, std::move(geometry_set), nmd, ctx); + + if (geometry_set.has_mesh()) { + /* Add #CD_ORIGINDEX layers if they don't exist already. This is required because the + * #eModifierTypeFlag_SupportsMapping flag is set. If the layers did not exist before, it is + * assumed that the output mesh does not have a mapping to the original mesh. */ + Mesh &mesh = *geometry_set.get_mesh_for_write(); + if (use_orig_index_verts) { + CustomData_add_layer(&mesh.vdata, CD_ORIGINDEX, CD_DEFAULT, nullptr, mesh.totvert); + } + if (use_orig_index_edges) { + CustomData_add_layer(&mesh.edata, CD_ORIGINDEX, CD_DEFAULT, nullptr, mesh.totedge); + } + if (use_orig_index_polys) { + CustomData_add_layer(&mesh.pdata, CD_ORIGINDEX, CD_DEFAULT, nullptr, mesh.totpoly); + } + } } static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) -- cgit v1.2.3