[Bf-blender-cvs] [0084954adea] geometry-nodes-mesh-primitives: Working sphere polygons

Hans Goudey noreply at git.blender.org
Thu Mar 11 23:15:09 CET 2021


Commit: 0084954adeade2b006a7795fa67fcdd7d1dd8f4c
Author: Hans Goudey
Date:   Thu Feb 25 14:56:03 2021 -0600
Branches: geometry-nodes-mesh-primitives
https://developer.blender.org/rB0084954adeade2b006a7795fa67fcdd7d1dd8f4c

Working sphere polygons

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

M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
index 2cdcffd499a..0826d9359b5 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
@@ -88,8 +88,8 @@ static void calculate_vertex_coords_and_normals(MutableSpan<MVert> verts,
       const float y = sinf(theta) * sinf(phi);
       copy_v3_v3(verts[vert_index].co, float3(x, y, z) * radius);
       normal_float_to_short_v3(verts[vert_index].no, float3(x, y, z));
-      vert_index++;
       phi += delta_phi;
+      vert_index++;
     }
     theta += delta_theta;
   }
@@ -105,35 +105,29 @@ static void calculate_edge_indices(MutableSpan<MEdge> edges, const int segments,
   /* Add the edges connecting the top vertex to the first ring. */
   int vert_index = 1;
   for (const int UNUSED(segment) : IndexRange(segments)) {
-    MEdge &edge = edges[edge_index];
-    edge.flag |= ME_LOOSEEDGE;
+    MEdge &edge = edges[edge_index++];
     edge.v1 = 0;
     edge.v2 = vert_index;
     vert_index++;
-    edge_index++;
   }
 
   int ring_vert_index_start = 1;
   for (const int ring : IndexRange(rings - 1)) {
-    int next_ring_vert_index_start = ring_vert_index_start + segments;
+    const int next_ring_vert_index_start = ring_vert_index_start + segments;
 
     /* Add the edges running along each ring. */
     for (const int segment : IndexRange(segments)) {
-      MEdge &edge_in_ring = edges[edge_index];
-      edge_in_ring.flag |= ME_LOOSEEDGE;
+      MEdge &edge_in_ring = edges[edge_index++];
       edge_in_ring.v1 = ring_vert_index_start + segment;
       edge_in_ring.v2 = ring_vert_index_start + ((segment + 1) % segments);
-      edge_index++;
     }
 
     /* Add the edges connecting to the next ring. */
     if (ring < rings - 2) {
       for (const int segment : IndexRange(segments)) {
-        MEdge &edge_to_next_ring = edges[edge_index];
-        edge_to_next_ring.flag |= ME_LOOSEEDGE;
+        MEdge &edge_to_next_ring = edges[edge_index++];
         edge_to_next_ring.v1 = ring_vert_index_start + segment;
         edge_to_next_ring.v2 = next_ring_vert_index_start + segment;
-        edge_index++;
       }
     }
     ring_vert_index_start += segments;
@@ -143,12 +137,9 @@ static void calculate_edge_indices(MutableSpan<MEdge> edges, const int segments,
   vert_index = segments * (rings - 2) + 1;
   const int last_vert_index = vert_total(segments, rings) - 1;
   for (const int UNUSED(segment) : IndexRange(segments)) {
-    MEdge &edge = edges[edge_index];
-    edge.flag |= ME_LOOSEEDGE;
+    MEdge &edge = edges[edge_index++];
     edge.v1 = last_vert_index;
     edge.v2 = vert_index;
-    vert_index++;
-    edge_index++;
   }
 }
 
@@ -162,24 +153,77 @@ static void calculate_faces(MutableSpan<MLoop> loops,
 
   /* Add the triangles conntected to the top vertex. */
   for (const int segment : IndexRange(segments)) {
-    MPoly &poly = polys[poly_index];
+    MPoly &poly = polys[poly_index++];
     poly.loopstart = loop_index;
     poly.totloop = 3;
 
-    MLoop &loop_a = loops[loop_index];
-    loop_a.e = segment;
+    MLoop &loop_a = loops[loop_index++];
     loop_a.v = 0;
-    loop_index++;
+    loop_a.e = segment;
 
-    MLoop &loop_b = loops[loop_index];
-    loop_b.e = segments + segment;
+    MLoop &loop_b = loops[loop_index++];
     loop_b.v = 1 + segment;
-    loop_index++;
+    loop_b.e = segments + segment;
 
-    MLoop &loop_c = loops[loop_index];
-    loop_c.e = (segments + 1) % segments;
+    MLoop &loop_c = loops[loop_index++];
     loop_c.v = 1 + (segment + 1) % segments;
-    loop_index++;
+    loop_c.e = (segment + 1) % segments;
+  }
+
+  int ring_vert_index_start = 1;
+  for (const int ring : IndexRange(rings - 2)) {
+    const int next_ring_vert_index_start = ring_vert_index_start + segments;
+
+    const int ring_edge_index_start = ring * segments * 2;
+    const int next_ring_edge_index_start = ring_edge_index_start + segments * 2;
+
+    const int ring_vertical_edge_index_start = ring_edge_index_start + segments;
+
+    for (const int segment : IndexRange(segments)) {
+      MPoly &poly = polys[poly_index++];
+      poly.loopstart = loop_index;
+      poly.totloop = 4;
+
+      MLoop &loop_a = loops[loop_index++];
+      loop_a.v = ring_vert_index_start + segment;
+      loop_a.e = ring_edge_index_start + segment;
+
+      MLoop &loop_b = loops[loop_index++];
+      loop_b.v = ring_vert_index_start + ((segment + 1) % segments);
+      loop_b.e = ring_vertical_edge_index_start + ((segment + 1) % segments);
+
+      MLoop &loop_c = loops[loop_index++];
+      loop_c.v = next_ring_vert_index_start + ((segment + 1) % segments);
+      loop_c.e = next_ring_edge_index_start + segment;
+
+      MLoop &loop_d = loops[loop_index++];
+      loop_d.v = next_ring_vert_index_start + segment;
+      loop_d.e = ring_vertical_edge_index_start + segment;
+    }
+    ring_vert_index_start += segments;
+  }
+
+  /* Add the triangles connected to the bottom vertex. */
+  const int last_edge_ring_start = edge_total(segments, rings) - segments * 2 - 1;
+  const int bottom_edge_fan_start = last_edge_ring_start - segments;
+  const int last_vert_index = vert_total(segments, rings) - 1;
+  const int last_vert_ring_start = last_vert_index - segments;
+  for (const int segment : IndexRange(segments)) {
+    MPoly &poly = polys[poly_index++];
+    poly.loopstart = loop_index;
+    poly.totloop = 3;
+
+    MLoop &loop_a = loops[loop_index++];
+    loop_a.v = last_vert_index;
+    loop_a.e = last_edge_ring_start + segment;
+
+    MLoop &loop_b = loops[loop_index++];
+    loop_b.v = last_vert_ring_start + segment;
+    loop_b.e = bottom_edge_fan_start + segment;
+
+    MLoop &loop_c = loops[loop_index++];
+    loop_c.v = last_vert_ring_start + (segment + 1) % segments;
+    loop_c.e = bottom_edge_fan_start + ((segment + 1) % segments);
   }
 }
 
@@ -204,9 +248,9 @@ static Mesh *create_uv_sphere_mesh(const float3 location,
 
   calculate_vertex_coords_and_normals(verts, radius, segments, rings);
 
-  // calculate_edge_indices(edges, segments, rings);
+  calculate_edge_indices(edges, segments, rings);
 
-  // calculate_faces(loops, polys, segments, rings);
+  calculate_faces(loops, polys, segments, rings);
 
   // BLI_assert(BKE_mesh_is_valid(mesh));



More information about the Bf-blender-cvs mailing list