[Bf-blender-cvs] [9a6d526dbb2] temp-geometry-nodes-extrude-mesh: Start of mesh extrude mode
Hans Goudey
noreply at git.blender.org
Sun Dec 26 23:13:08 CET 2021
Commit: 9a6d526dbb22673395e13c3f30538ef69b0acffe
Author: Hans Goudey
Date: Sun Dec 26 16:12:38 2021 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rB9a6d526dbb22673395e13c3f30538ef69b0acffe
Start of mesh extrude mode
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 436a9afa520..51095475769 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -86,10 +86,11 @@ static void extrude_mesh_vertices(MeshComponent &component,
MutableSpan<MVert> new_verts = verts.take_back(selection.size());
MutableSpan<MEdge> new_edges = edges.take_back(selection.size());
- for (const int i : selection.index_range()) {
- new_edges[i].v1 = selection[i];
- new_edges[i].v2 = orig_vert_size + i;
- new_edges[i].flag |= ME_LOOSEEDGE;
+ for (const int i_selection : selection.index_range()) {
+ MEdge &edge = new_edges[i_selection];
+ edge.v1 = selection[i_selection];
+ edge.v2 = orig_vert_size + i_selection;
+ edge.flag |= ME_LOOSEEDGE;
}
component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
@@ -125,6 +126,90 @@ static void extrude_mesh_vertices(MeshComponent &component,
BKE_mesh_normals_tag_dirty(&mesh);
}
+// Array<Vector<int>> selected_edges_of_verts(mesh.totvert);
+// for (const int i : selection) {
+// const MEdge &edge = mesh.medge[i];
+// selected_edges_of_verts[edge.v1].append(i);
+// selected_edges_of_verts[edge.v2].append(i);
+// }
+
+struct CopiedVert {
+ int orig_index;
+ // int new_index;
+};
+
+static void extrude_mesh_edges(MeshComponent &component,
+ const Field<bool> &selection_field,
+ const Field<float3> &offset_field)
+{
+ Mesh &mesh = *component.get_for_write();
+ const int orig_vert_size = mesh.totvert;
+ const int orig_edge_size = mesh.totedge;
+ const int orig_loop_size = mesh.totloop;
+
+ GeometryComponentFieldContext context{component, ATTR_DOMAIN_EDGE};
+ FieldEvaluator evaluator{context, mesh.totvert};
+ evaluator.add(offset_field);
+ evaluator.set_selection(selection_field);
+ evaluator.evaluate();
+ const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
+ const VArray<float3> offsets = evaluator.get_evaluated<float3>(0);
+
+ Array<int> extrude_vert_indices(mesh.totvert, -1);
+ Vector<CopiedVert> extrude_vert_orig_indices;
+ extrude_vert_orig_indices.reserve(selection.size());
+ for (const int i_edge : selection) {
+ const MEdge &edge = mesh.medge[i_edge];
+
+ if (extrude_vert_indices[edge.v1] == -1) {
+ extrude_vert_indices[edge.v1] = orig_vert_size + extrude_vert_orig_indices.size();
+ extrude_vert_orig_indices.append({int(edge.v1)});
+ }
+
+ if (extrude_vert_indices[edge.v2] == -1) {
+ extrude_vert_indices[edge.v2] = orig_vert_size + extrude_vert_orig_indices.size();
+ extrude_vert_orig_indices.append({int(edge.v2)});
+ }
+ }
+
+ const int extrude_vert_size = extrude_vert_orig_indices.size();
+ const int extrude_edge_size = extrude_vert_size;
+ const int duplicate_edge_size = selection.size();
+ const int new_edge_size = extrude_edge_size + duplicate_edge_size;
+
+ mesh.totvert += extrude_vert_size;
+ mesh.totedge += new_edge_size;
+ // mesh.totpoly += selection.size();
+ // mesh.totloop += selection.size() * 4;
+ CustomData_realloc(&mesh.vdata, mesh.totvert);
+ CustomData_realloc(&mesh.edata, mesh.totedge);
+ // CustomData_realloc(&mesh.pdata, mesh.totpoly);
+ // CustomData_realloc(&mesh.ldata, mesh.totloop);
+
+ MutableSpan<MEdge> edges{mesh.medge, mesh.totedge};
+ MutableSpan<MEdge> new_edges = edges.take_back(new_edge_size);
+ MutableSpan<MEdge> extrude_edges = new_edges.take_front(extrude_edge_size);
+ MutableSpan<MEdge> duplicate_edges = new_edges.take_back(duplicate_edge_size);
+
+ for (const int i : extrude_edges.index_range()) {
+ MEdge &edge = extrude_edges[i];
+ edge.v1 = extrude_vert_orig_indices[i].orig_index;
+ edge.v2 = orig_vert_size + i;
+ edge.flag |= (ME_EDGEDRAW | ME_EDGERENDER);
+ }
+
+ for (const int i : duplicate_edges.index_range()) {
+ const MEdge &orig_edge = mesh.medge[selection[i]];
+ MEdge &edge = extrude_edges[i];
+ edge.v1 = extrude_vert_indices[orig_edge.v1];
+ edge.v2 = extrude_vert_indices[orig_edge.v2];
+ edge.flag |= (ME_EDGEDRAW | ME_EDGERENDER);
+ }
+
+ BKE_mesh_runtime_clear_cache(&mesh);
+ BKE_mesh_normals_tag_dirty(&mesh);
+}
+
static void extrude_mesh(MeshComponent &component,
GeometryNodeExtrudeMeshMode mode,
const Field<bool> &selection,
@@ -135,10 +220,12 @@ static void extrude_mesh(MeshComponent &component,
extrude_mesh_vertices(component, selection, offset);
break;
case GEO_NODE_EXTRUDE_MESH_EDGES:
+ extrude_mesh_edges(component, selection, offset);
break;
case GEO_NODE_EXTRUDE_MESH_FACES:
break;
}
+ BLI_assert(BKE_mesh_is_valid(component.get_for_write()));
}
static void node_geo_exec(GeoNodeExecParams params)
More information about the Bf-blender-cvs
mailing list