[Bf-blender-cvs] [51b731d4792] geometry-nodes-mesh-primitives: Add primitive cube node
Hans Goudey
noreply at git.blender.org
Thu Mar 11 23:15:11 CET 2021
Commit: 51b731d4792f7ac7236d09684dabc42951f03bd4
Author: Hans Goudey
Date: Mon Mar 8 21:36:39 2021 -0500
Branches: geometry-nodes-mesh-primitives
https://developer.blender.org/rB51b731d4792f7ac7236d09684dabc42951f03bd4
Add primitive cube node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc
index c5189f3411a..ba19f0a70fe 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc
@@ -14,18 +14,17 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "BLI_map.hh"
-#include "BLI_math_matrix.h"
-
#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
+#include "BKE_lib_id.h"
#include "BKE_mesh.h"
+#include "bmesh.h"
+
#include "node_geometry_util.hh"
static bNodeSocketTemplate geo_node_mesh_primitive_cube_in[] = {
- {SOCK_FLOAT, N_("Size"), 0.0, 0.0, 0.0, 0.0, 0.0f, FLT_MAX, PROP_DISTANCE},
+ {SOCK_FLOAT, N_("Size"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX, PROP_DISTANCE},
{SOCK_VECTOR, N_("Translation"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_TRANSLATION},
{SOCK_VECTOR, N_("Rotation"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_EULER},
{-1, ""},
@@ -38,129 +37,37 @@ static bNodeSocketTemplate geo_node_mesh_primitive_cube_out[] = {
namespace blender::nodes {
-struct NewMesh {
- Mesh *mesh;
- MutableSpan<MVert> verts;
- MutableSpan<MEdge> edges;
- MutableSpan<MLoop> loops;
- MutableSpan<MPoly> polys;
-
- Map<std::pair<int, int>, int> edge_map;
- int edge_offset = 0;
- int loop_offset = 0;
- int poly_offset = 0;
-
- NewMesh(const int vert_len, const int edge_len, const int corner_len, const int poly_len)
- {
- mesh = BKE_mesh_new_nomain(vert_len, edge_len, 0, corner_len, poly_len);
- BKE_mesh_update_customdata_pointers(mesh, false);
- verts = MutableSpan<MVert>(mesh->mvert, vert_len);
- edges = MutableSpan<MEdge>(mesh->medge, edge_len);
- loops = MutableSpan<MLoop>(mesh->mloop, corner_len);
- polys = MutableSpan<MPoly>(mesh->mpoly, poly_len);
-
- edge_map.reserve(edge_len * 2);
- }
-
- int create_edge(const int vert_index_a, const int vert_index_b)
- {
- BLI_assert(vert_index_a < verts.size());
- BLI_assert(vert_index_b < verts.size());
- if (edge_map.contains({vert_index_a, vert_index_b})) {
- return edge_map.lookup({vert_index_a, vert_index_b});
- }
- if (edge_map.contains({vert_index_b, vert_index_a})) {
- return edge_map.lookup({vert_index_b, vert_index_a});
- }
- MEdge &edge = edges[edge_offset];
- edge.v1 = vert_index_a;
- edge.v2 = vert_index_b;
- edge_map.add({vert_index_a, vert_index_b}, edge_offset);
- edge_offset++;
- return edge_offset - 1;
- }
-
- void create_corner(const int vert_index, const int edge_index)
- {
- MLoop &loop = loops[loop_offset];
- loop.v = vert_index;
- loop.e = edge_index;
- loop_offset++;
- }
-
- void create_poly(const int loop_index_start, const int loops_len)
- {
- MPoly &poly = polys[poly_offset];
- poly.loopstart = loop_index_start;
- poly.totloop = loops_len;
- poly_offset++;
- }
-};
-
static Mesh *create_cube_mesh(const float3 location, const float3 rotation, const float size)
{
float4x4 transform;
loc_eul_size_to_mat4(transform.values, location, rotation, float3(size));
- NewMesh new_mesh = NewMesh(8, 12, 24, 6);
-
- const float3 positions[8] = {
- {-1.0f, -1.0f, -1.0f},
- {-1.0f, -1.0f, 1.0f},
- {-1.0f, 1.0f, -1.0f},
- {-1.0f, 1.0f, 1.0f},
- {1.0f, -1.0f, -1.0f},
- {1.0f, -1.0f, 1.0f},
- {1.0f, 1.0f, -1.0f},
- {1.0f, 1.0f, 1.0f},
- };
-
- for (const int i : new_mesh.verts.index_range()) {
- MVert &vert = new_mesh.verts[i];
- float3 transformed = transform * positions[i];
- copy_v3_v3(vert.co, transformed);
- }
-
- Map<std::pair<int, int>, int, 12> edge_map;
-
- const uint8_t face_vert_indices[6][4] = {
- {0, 1, 3, 2},
- {2, 3, 7, 6},
- {6, 7, 5, 4},
- {4, 5, 1, 0},
- {2, 6, 4, 0},
- {7, 3, 1, 5},
- };
-
- for (const int poly_index : new_mesh.polys.index_range()) {
- for (const int corner_index : IndexRange(4)) {
- const int corner_index_next = (corner_index + 1) % 4;
- const int edge_index = new_mesh.create_edge(
- face_vert_indices[poly_index][corner_index],
- face_vert_indices[poly_index][corner_index_next]);
- new_mesh.create_corner(edge_index, face_vert_indices[poly_index][corner_index]);
- }
- new_mesh.create_poly(poly_index * 4, 4);
- }
-
- BLI_assert(BKE_mesh_validate(new_mesh.mesh, true, false));
-
- BKE_mesh_calc_normals(new_mesh.mesh);
-
- return new_mesh.mesh;
+ const BMeshCreateParams bmcp = {true};
+ const BMAllocTemplate allocsize = {8, 12, 24, 6};
+ BMesh *bm = BM_mesh_create(&allocsize, &bmcp);
+
+ BMO_op_callf(bm,
+ BMO_FLAG_DEFAULTS,
+ "create_cube matrix=%m4 size=%f calc_uvs=%b",
+ transform.values,
+ size,
+ true);
+
+ Mesh *mesh = (Mesh *)BKE_id_new_nomain(ID_ME, NULL);
+ BM_mesh_bm_to_me_for_eval(bm, mesh, NULL);
+ BM_mesh_free(bm);
+
+ return mesh;
}
static void geo_node_mesh_primitive_cube_exec(GeoNodeExecParams params)
{
- GeometrySet geometry_set;
-
const float size = params.extract_input<float>("Size");
const float3 location = params.extract_input<float3>("Translation");
const float3 rotation = params.extract_input<float3>("Rotation");
- geometry_set.replace_mesh(create_cube_mesh(location, rotation, size));
-
- params.set_output("Geometry", geometry_set);
+ Mesh *mesh = create_cube_mesh(location, rotation, size);
+ params.set_output("Geometry", GeometrySet::create_with_mesh(mesh));
}
} // namespace blender::nodes
More information about the Bf-blender-cvs
mailing list