diff options
author | Hans Goudey <h.goudey@me.com> | 2022-03-02 18:55:21 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-03-02 18:55:21 +0300 |
commit | d86f80f42ad8bb40aeb154980e5e0e2fa77412e2 (patch) | |
tree | 29b4fe08845fecfce794441838170ed0e0c6b73d /source/blender/modifiers | |
parent | 1e1d1f15e8750642c29e4d04e09462cc4e4d2baa (diff) | |
parent | 216a215ba58ac67af5e7bfa334bbcef4e812ea3f (diff) |
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 210a7edac54..13ffc8e921d 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -1246,8 +1246,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) |