[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