[Bf-blender-cvs] [9f16e5ea3f9] geometry-nodes-mesh-primitives: Replace sphere with BMesh version

Hans Goudey noreply at git.blender.org
Tue Mar 16 00:12:41 CET 2021


Commit: 9f16e5ea3f9b29cd6dad7815ace7801b775037a1
Author: Hans Goudey
Date:   Mon Mar 15 17:37:53 2021 -0400
Branches: geometry-nodes-mesh-primitives
https://developer.blender.org/rB9f16e5ea3f9b29cd6dad7815ace7801b775037a1

Replace sphere with BMesh version

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

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 1fd9ab21a40..62a472d03da 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
@@ -22,6 +22,10 @@
 #include "UI_interface.h"
 #include "UI_resources.h"
 
+#include "BKE_lib_id.h"
+#include "BLI_timeit.hh"
+#include "bmesh.h"
+
 #include "node_geometry_util.hh"
 
 static bNodeSocketTemplate geo_node_mesh_primitive_uv_sphere_in[] = {
@@ -64,219 +68,34 @@ static int sphere_face_total(const int segments, const int rings)
   return quads + triangles;
 }
 
-static void calculate_sphere_vertex_data(MutableSpan<MVert> verts,
+static Mesh *create_uv_sphere_mesh_bmesh(const float3 location,
+                                         const float3 rotation,
                                          const float radius,
                                          const int segments,
                                          const int rings)
 {
-  const float delta_theta = M_PI / rings;
-  const float delta_phi = (2 * M_PI) / segments;
-
-  copy_v3_v3(verts[0].co, float3(0.0f, 0.0f, radius));
-  normal_float_to_short_v3(verts[0].no, float3(0.0f, 0.0f, 1.0f));
-
-  int vert_index = 1;
-  float theta = delta_theta;
-  for (const int UNUSED(ring) : IndexRange(rings - 1)) {
-    float phi = 0.0f;
-    const float z = cosf(theta);
-    for (const int UNUSED(segment) : IndexRange(segments)) {
-      const float x = sinf(theta) * cosf(phi);
-      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));
-      phi += delta_phi;
-      vert_index++;
-    }
-    theta += delta_theta;
-  }
-
-  copy_v3_v3(verts.last().co, float3(0.0f, 0.0f, -radius));
-  normal_float_to_short_v3(verts.last().no, float3(0.0f, 0.0f, -1.0f));
-}
-
-static void calculate_sphere_edge_indices(MutableSpan<MEdge> edges,
-                                          const int segments,
-                                          const int rings)
-{
-  int edge_index = 0;
-
-  /* Add the edges connecting the top vertex to the first ring. */
-  const int first_vert_ring_index_start = 1;
-  for (const int segment : IndexRange(segments)) {
-    MEdge &edge = edges[edge_index++];
-    edge.v1 = 0;
-    edge.v2 = first_vert_ring_index_start + segment;
-  }
-
-  int ring_vert_index_start = 1;
-  for (const int ring : IndexRange(rings - 1)) {
-    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.v1 = ring_vert_index_start + segment;
-      edge_in_ring.v2 = ring_vert_index_start + ((segment + 1) % segments);
-    }
-
-    /* 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.v1 = ring_vert_index_start + segment;
-        edge_to_next_ring.v2 = next_ring_vert_index_start + segment;
-      }
-    }
-    ring_vert_index_start += segments;
-  }
-
-  /* Add the edges connecting the last ring to the bottom vertex. */
-  const int last_vert_index = sphere_vert_total(segments, rings) - 1;
-  const int last_vert_ring_start = last_vert_index - segments;
-  for (const int segment : IndexRange(segments)) {
-    MEdge &edge = edges[edge_index++];
-    edge.v1 = last_vert_index;
-    edge.v2 = last_vert_ring_start + segment;
-  }
-}
-
-static void calculate_sphere_faces(MutableSpan<MLoop> loops,
-                                   MutableSpan<MPoly> polys,
-                                   const int segments,
-                                   const int rings)
-{
-  int loop_index = 0;
-  int poly_index = 0;
-
-  /* Add the triangles conntected to the top vertex. */
-  const int first_vert_ring_index_start = 1;
-  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 = 0;
-    loop_a.e = segment;
-    MLoop &loop_b = loops[loop_index++];
-    loop_b.v = first_vert_ring_index_start + segment;
-    loop_b.e = segments + segment;
-    MLoop &loop_c = loops[loop_index++];
-    loop_c.v = first_vert_ring_index_start + (segment + 1) % segments;
-    loop_c.e = (segment + 1) % segments;
-  }
-
-  int ring_vert_index_start = 1;
-  int ring_edge_index_start = segments;
-  for (const int UNUSED(ring) : IndexRange(1, rings - 2)) {
-    const int next_ring_vert_index_start = ring_vert_index_start + segments;
-    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_vertical_edge_index_start + segment;
-      MLoop &loop_b = loops[loop_index++];
-      loop_b.v = next_ring_vert_index_start + segment;
-      loop_b.e = next_ring_edge_index_start + segment;
-      MLoop &loop_c = loops[loop_index++];
-      loop_c.v = next_ring_vert_index_start + (segment + 1) % segments;
-      loop_c.e = ring_vertical_edge_index_start + (segment + 1) % segments;
-      MLoop &loop_d = loops[loop_index++];
-      loop_d.v = ring_vert_index_start + (segment + 1) % segments;
-      loop_d.e = ring_edge_index_start + segment;
-    }
-    ring_vert_index_start += segments;
-    ring_edge_index_start += segments * 2;
-  }
-
-  /* Add the triangles connected to the bottom vertex. */
-  const int last_edge_ring_start = segments * (rings - 2) * 2 + segments;
-  const int bottom_edge_fan_start = last_edge_ring_start + segments;
-  const int last_vert_index = sphere_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 = bottom_edge_fan_start + (segment + 1) % segments;
-    MLoop &loop_b = loops[loop_index++];
-    loop_b.v = last_vert_ring_start + (segment + 1) % segments;
-    loop_b.e = last_edge_ring_start + segment;
-    MLoop &loop_c = loops[loop_index++];
-    loop_c.v = last_vert_ring_start + segment;
-    loop_c.e = bottom_edge_fan_start + segment;
-  }
-}
-
-static void calculate_uvs(Mesh *mesh, const float segments, const float rings)
-{
-  MeshComponent mesh_component;
-  mesh_component.replace(mesh, GeometryOwnershipType::Editable);
-  OutputAttributePtr uv_attribute = mesh_component.attribute_try_get_for_output(
-      "uv", ATTR_DOMAIN_CORNER, CD_PROP_FLOAT2, nullptr);
-  MutableSpan<float2> uvs = uv_attribute->get_span_for_write_only<float2>();
-
-  int loop_index = 0;
-  const float dy = 1.0f / rings;
-
-  for (const int i_segment : IndexRange(segments)) {
-    const float segment = static_cast<float>(i_segment);
-    uvs[loop_index++] = float2((segment + 0.5f) / segments, 0.0f);
-    uvs[loop_index++] = float2((segment + 1.0f) / segments, dy);
-    uvs[loop_index++] = float2(segment / segments, dy);
-  }
-
-  for (const int i_ring : IndexRange(1, rings - 2)) {
-    const float ring = static_cast<float>(i_ring);
-    for (const int i_segment : IndexRange(segments)) {
-      const float segment = static_cast<float>(i_segment);
-      uvs[loop_index++] = float2(segment / segments, ring / rings);
-      uvs[loop_index++] = float2((segment + 1.0f) / segments, ring / rings);
-      uvs[loop_index++] = float2((segment + 1.0f) / segments, (ring + 1.0f) / rings);
-      uvs[loop_index++] = float2(segment / segments, (ring + 1.0f) / rings);
-    }
-  }
-
-  for (const int i_segment : IndexRange(segments)) {
-    const float segment = static_cast<float>(i_segment);
-    uvs[loop_index++] = float2((segment + 0.5f) / segments, 1.0f);
-    uvs[loop_index++] = float2((segment + 1.0f) / segments, 1.0f - dy);
-    uvs[loop_index++] = float2(segment / segments, 1.0f - dy);
-  }
-
-  uv_attribute.apply_span_and_save();
-}
-
-static Mesh *create_uv_sphere_mesh(const float radius, const int segments, const int rings)
-{
-  Mesh *mesh = BKE_mesh_new_nomain(sphere_vert_total(segments, rings),
-                                   sphere_edge_total(segments, rings),
-                                   0,
-                                   sphere_corner_total(segments, rings),
-                                   sphere_face_total(segments, rings));
-  MutableSpan<MVert> verts = MutableSpan<MVert>(mesh->mvert, mesh->totvert);
-  MutableSpan<MEdge> edges = MutableSpan<MEdge>(mesh->medge, mesh->totedge);
-  MutableSpan<MLoop> loops = MutableSpan<MLoop>(mesh->mloop, mesh->totloop);
-  MutableSpan<MPoly> polys = MutableSpan<MPoly>(mesh->mpoly, mesh->totpoly);
-
-  calculate_sphere_vertex_data(verts, radius, segments, rings);
-
-  calculate_sphere_edge_indices(edges, segments, rings);
-
-  calculate_sphere_faces(loops, polys, segments, rings);
-
-  calculate_uvs(mesh, segments, rings);
-
-  BLI_assert(BKE_mesh_is_valid(mesh));
+  float4x4 transform;
+  loc_eul_size_to_mat4(transform.values, location, rotation, float3(radius));
+
+  const BMeshCreateParams bmcp = {true};
+  const BMAllocTemplate allocsize = {sphere_vert_total(segments, rings),
+                                     sphere_edge_total(segments, rings),
+                                     sphere_corner_total(segments, rings),
+                                     sphere_face_total(segments, rings)};
+  BMesh *bm = BM_mesh_create(&allocsize, &bmcp);
+
+  BMO_op_callf(bm,
+               BMO_FLAG_DEFAULTS,
+               "create_uvsphere u_segments=%i v_segmen

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list