Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2022-03-02 18:10:42 +0300
committerJacques Lucke <jacques@blender.org>2022-03-02 18:10:42 +0300
commit7935d3668a937ec5046558f9ff885a42a87b3384 (patch)
tree46c1d249991f4691eb45ac044a010689f2945d68
parent6883c47bb5930be5a95d1c2e8e06fce2d3b68681 (diff)
Fix T95479: geometry nodes crash with cage display
Differential Revision: https://developer.blender.org/D14225
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc26
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 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)