[Bf-blender-cvs] [2cdec6cbf43] geometry-nodes-curve-support: Geometry Nodes Curves: Generate faces in Curve to Mesh node
Hans Goudey
noreply at git.blender.org
Tue Apr 6 06:59:39 CEST 2021
Commit: 2cdec6cbf4357b00434cae16a738cbc385655586
Author: Hans Goudey
Date: Mon Apr 5 23:59:33 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rB2cdec6cbf4357b00434cae16a738cbc385655586
Geometry Nodes Curves: Generate faces in Curve to Mesh node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
index 9cd94a50ef1..8da52116c24 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
@@ -94,29 +94,76 @@ static void spline_extrude_to_mesh_data(const Spline &spline,
return;
}
- /* TODO: Decide whether to unroll the is_cyclic checks instead of using the mod operator on every
- * iteration. */
+ /* TODO: Decide whether to unroll the is_cyclic checks instead of using the mod operator for
+ * every iteration. */
+ /* TODO: All of this could probably be generalized to something like:
+ * GEO_mesh_grid_topology(vert_offset,
+ * spline_vert_len,
+ * profile_vert_len,
+ * spline.is_cyclic,
+ * profile_spline.is_cyclic,
+ * edges,
+ * loops,
+ * polys,
+ * edge_offset,
+ * poly_offset);
+ */
/* Add the edges running along the length of the curve, starting at each profile vertex. */
+ const int spline_edges_start = edge_offset;
for (const int i_ring : IndexRange(spline_edge_len)) {
- const int ring_offset = vert_offset + profile_vert_len * i_ring;
- const int next_ring_offset = vert_offset + profile_vert_len * ((i_ring + 1) % spline_vert_len);
+ const int ring_vert_offset = vert_offset + profile_vert_len * i_ring;
+ const int next_ring_vert_offset = vert_offset +
+ profile_vert_len * ((i_ring + 1) % spline_vert_len);
for (const int i_profile : IndexRange(profile_vert_len)) {
MEdge &edge = edges[edge_offset++];
- edge.v1 = ring_offset + i_profile;
- edge.v2 = next_ring_offset + i_profile;
- edge.flag = ME_LOOSEEDGE | ME_EDGEDRAW | ME_EDGERENDER;
+ edge.v1 = ring_vert_offset + i_profile;
+ edge.v2 = next_ring_vert_offset + i_profile;
+ edge.flag = ME_EDGEDRAW | ME_EDGERENDER;
}
}
/* Add the edges running along each profile ring. */
+ const int profile_edges_start = edge_offset;
for (const int i_ring : IndexRange(spline_vert_len)) {
- const int ring_offset = vert_offset + profile_vert_len * i_ring;
+ const int ring_vert_offset = vert_offset + profile_vert_len * i_ring;
for (const int i_profile : IndexRange(profile_edge_len)) {
MEdge &edge = edges[edge_offset++];
- edge.v1 = ring_offset + i_profile;
- edge.v2 = ring_offset + (i_profile + 1) % profile_vert_len;
- edge.flag = ME_LOOSEEDGE | ME_EDGEDRAW | ME_EDGERENDER;
+ edge.v1 = ring_vert_offset + i_profile;
+ edge.v2 = ring_vert_offset + (i_profile + 1) % profile_vert_len;
+ edge.flag = ME_EDGEDRAW | ME_EDGERENDER;
+ }
+ }
+
+ /* Calculate poly and face indices. */
+ for (const int i_ring : IndexRange(spline_edge_len)) {
+ const int ring_vert_offset = vert_offset + profile_vert_len * i_ring;
+ const int next_ring_vert_offset = vert_offset +
+ profile_vert_len * ((i_ring + 1) % spline_vert_len);
+ const int ring_edge_start = profile_edges_start + profile_edge_len * i_ring;
+ const int next_ring_edge_offset = profile_edges_start +
+ profile_edge_len * ((i_ring + 1) % spline_vert_len);
+ for (const int i_profile : IndexRange(profile_edge_len)) {
+ const int spline_edge_offset = spline_edges_start + profile_vert_len * i_ring;
+ MPoly &poly = polys[poly_offset++];
+ poly.loopstart = loop_offset;
+ poly.totloop = 4;
+
+ MLoop &loop_a = loops[loop_offset++];
+ loop_a.v = ring_vert_offset + i_profile;
+ loop_a.e = ring_edge_start + i_profile;
+ MLoop &loop_b = loops[loop_offset++];
+ loop_b.v = ring_vert_offset + (i_profile + 1) % profile_vert_len;
+ loop_b.e = spline_edge_offset + (i_profile + 1) % profile_vert_len;
+ MLoop &loop_c = loops[loop_offset++];
+ loop_c.v = next_ring_vert_offset + (i_profile + 1) % profile_vert_len;
+ loop_c.e = next_ring_edge_offset + i_profile;
+ MLoop &loop_d = loops[loop_offset++];
+ loop_d.v = next_ring_vert_offset + i_profile;
+ loop_d.e = spline_edge_offset + i_profile;
+
+ int dummy = i_profile + 1;
+ dummy++;
}
}
@@ -169,8 +216,7 @@ static Mesh *curve_to_mesh_calculate(const DCurve &curve, const DCurve &profile_
return nullptr;
}
- // Mesh *mesh = BKE_mesh_new_nomain(vert_total, edge_total, 0, corner_total, poly_total);
- Mesh *mesh = BKE_mesh_new_nomain(vert_total, edge_total, 0, 0, 0);
+ Mesh *mesh = BKE_mesh_new_nomain(vert_total, edge_total, 0, corner_total, poly_total);
MutableSpan<MVert> verts{mesh->mvert, mesh->totvert};
MutableSpan<MEdge> edges{mesh->medge, mesh->totedge};
MutableSpan<MLoop> loops{mesh->mloop, mesh->totloop};
More information about the Bf-blender-cvs
mailing list