Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_nodes.cc
| Show First 20 Lines • Show All 1,221 Lines • ▼ Show 20 Lines | static void modifyGeometry(ModifierData *md, | ||||
| const InputSocketRef *first_output_socket = group_outputs[0]; | const InputSocketRef *first_output_socket = group_outputs[0]; | ||||
| if (first_output_socket->idname() != "NodeSocketGeometry") { | if (first_output_socket->idname() != "NodeSocketGeometry") { | ||||
| BKE_modifier_set_error(ctx->object, md, "Node group's first output must be a geometry"); | BKE_modifier_set_error(ctx->object, md, "Node group's first output must be a geometry"); | ||||
| geometry_set.clear(); | geometry_set.clear(); | ||||
| return; | 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( | geometry_set = compute_geometry( | ||||
| tree, input_nodes, output_node, std::move(geometry_set), nmd, ctx); | 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) | static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) | ||||
| { | { | ||||
| GeometrySet geometry_set = GeometrySet::create_with_mesh(mesh, GeometryOwnershipType::Editable); | GeometrySet geometry_set = GeometrySet::create_with_mesh(mesh, GeometryOwnershipType::Editable); | ||||
| modifyGeometry(md, ctx, geometry_set); | modifyGeometry(md, ctx, geometry_set); | ||||
| ▲ Show 20 Lines • Show All 475 Lines • Show Last 20 Lines | |||||