[Bf-blender-cvs] [7935d3668a9] blender-v3.1-release: Fix T95479: geometry nodes crash with cage display

Jacques Lucke noreply at git.blender.org
Wed Mar 2 16:10:51 CET 2022


Commit: 7935d3668a937ec5046558f9ff885a42a87b3384
Author: Jacques Lucke
Date:   Wed Mar 2 16:10:42 2022 +0100
Branches: blender-v3.1-release
https://developer.blender.org/rB7935d3668a937ec5046558f9ff885a42a87b3384

Fix T95479: geometry nodes crash with cage display

Differential Revision: https://developer.blender.org/D14225

===================================================================

M	source/blender/modifiers/intern/MOD_nodes.cc

===================================================================

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)



More information about the Bf-blender-cvs mailing list