[Bf-blender-cvs] [55fe91b83b9] geometry-nodes-mesh-primitives: Progress on cylinder node
Hans Goudey
noreply at git.blender.org
Thu Mar 11 23:15:11 CET 2021
Commit: 55fe91b83b932b8acf4395b33b3596521a6243e9
Author: Hans Goudey
Date: Mon Mar 8 22:12:26 2021 -0500
Branches: geometry-nodes-mesh-primitives
https://developer.blender.org/rB55fe91b83b932b8acf4395b33b3596521a6243e9
Progress on cylinder node
===================================================================
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
===================================================================
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index a001bf33bb6..6f222e8da1b 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -9215,12 +9215,7 @@ static void def_geo_mesh_cylinder(StructRNA *srna)
prop = RNA_def_property(srna, "fill_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, rna_node_geometry_mesh_circle_fill_type_items);
- RNA_def_property_ui_text(prop, "Fill Type Top", "");
- RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
-
- prop = RNA_def_property(srna, "fill_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, rna_node_geometry_mesh_circle_fill_type_items);
- RNA_def_property_ui_text(prop, "Fill Type Bottom", "");
+ RNA_def_property_ui_text(prop, "Fill Type", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
index b5b2485e66c..ebafb0c6aeb 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
@@ -131,18 +131,15 @@ static Mesh *create_circle_mesh(const float radius,
float angle = 0.0f;
const float angle_delta = 2.0f * M_PI / static_cast<float>(verts_num);
- for (const int i : IndexRange(verts_num)) {
- MVert &vert = verts[i];
- float3 co = float3(std::cos(angle) * radius, std::sin(angle) * radius, 0.0f);
-
- copy_v3_v3(vert.co, co);
+ for (MVert &vert : verts) {
+ copy_v3_v3(vert.co, float3(std::cos(angle) * radius, std::sin(angle) * radius, 0.0f));
angle += angle_delta;
}
if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) {
copy_v3_v3(verts.last().co, float3(0));
}
- /* Align all vertex normals to the input rotation. */
+ /* Point all vertex normals in the up direction. */
short up_normal[3] = {0, 0, SHRT_MAX};
for (MVert &vert : verts) {
copy_v3_v3_short(vert.no, up_normal);
@@ -172,7 +169,7 @@ static Mesh *create_circle_mesh(const float radius,
}
}
- /* Create corners. */
+ /* Create corners and faces. */
switch (fill_type) {
case GEO_NODE_MESH_CIRCLE_FILL_NONE:
break;
@@ -182,6 +179,9 @@ static Mesh *create_circle_mesh(const float radius,
loop.e = i;
loop.v = i;
}
+ MPoly &poly = polys[0];
+ poly.loopstart = 0;
+ poly.totloop = loops.size();
break;
}
case GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN: {
@@ -195,23 +195,7 @@ static Mesh *create_circle_mesh(const float radius,
MLoop &loop3 = loops[3 * i + 2];
loop3.e = verts_num + i;
loop3.v = verts_num;
- }
- break;
- }
- }
- /* Create face(s). */
- switch (fill_type) {
- case GEO_NODE_MESH_CIRCLE_FILL_NONE:
- break;
- case GEO_NODE_MESH_CIRCLE_FILL_NGON: {
- MPoly &poly = polys[0];
- poly.loopstart = 0;
- poly.totloop = loops.size();
- break;
- }
- case GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN: {
- for (const int i : IndexRange(verts_num)) {
MPoly &poly = polys[i];
poly.loopstart = 3 * i;
poly.totloop = 3;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
index 2c8d1ce75c7..094bb87c87f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
@@ -67,9 +67,9 @@ static int vert_total(const GeometryNodeMeshCircleFillType fill_type, const int
switch (fill_type) {
case GEO_NODE_MESH_CIRCLE_FILL_NONE:
case GEO_NODE_MESH_CIRCLE_FILL_NGON:
- return verts_num;
+ return verts_num * 2;
case GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN:
- return verts_num + 2;
+ return verts_num * 2 + 2;
}
BLI_assert(false);
return 0;
@@ -116,15 +116,11 @@ static int face_total(const GeometryNodeMeshCircleFillType fill_type, const int
return 0;
}
-static Mesh *create_cylinder_mesh(const float3 location,
- const float3 rotation,
- const float radius,
+static Mesh *create_cylinder_mesh(const float radius,
+ const float depth,
const int verts_num,
const GeometryNodeMeshCircleFillType fill_type)
{
- float4x4 transform;
- loc_eul_size_to_mat4(transform.values, location, rotation, float3(1.0f));
-
Mesh *mesh = BKE_mesh_new_nomain(vert_total(fill_type, verts_num),
edge_total(fill_type, verts_num),
0,
@@ -135,13 +131,125 @@ static Mesh *create_cylinder_mesh(const float3 location,
MutableSpan<MLoop> loops = MutableSpan<MLoop>(mesh->mloop, mesh->totloop);
MutableSpan<MPoly> polys = MutableSpan<MPoly>(mesh->mpoly, mesh->totpoly);
+ float angle = 0.0f;
+ const float angle_delta = 2.0f * M_PI / static_cast<float>(verts_num);
+ for (const int i : IndexRange(verts_num)) {
+ float x = std::cos(angle) * radius;
+ float y = std::sin(angle) * radius;
+
+ copy_v3_v3(verts[i].co, float3(x, y, depth));
+ copy_v3_v3(verts[verts_num + i].co, float3(x, y, -depth));
+ angle += angle_delta;
+ }
+ if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) {
+ copy_v3_v3(verts.last().co, float3(0.0f, 0.0f, depth));
+ copy_v3_v3(verts[verts.size() - 2].co, float3(0.0f, 0.0f, -depth));
+ }
+
+ /* Point all vertex normals in the up direction. */
+ short up_normal[3] = {0, 0, SHRT_MAX};
+ short down_normal[3] = {0, 0, SHRT_MIN};
+ for (const int i : IndexRange(verts_num)) {
+ copy_v3_v3_short(verts[i].no, up_normal);
+ copy_v3_v3_short(verts[verts_num + i].no, down_normal);
+ }
+
+ /* Create outer edges. */
+ for (const int i : IndexRange(verts_num)) {
+ MEdge &edge_top = edges[i];
+ edge_top.v1 = i;
+ edge_top.v2 = (i + 1) % verts_num;
+ MEdge &edge_bottom = edges[verts_num + i];
+ edge_top.v1 = verts_num + i;
+ edge_top.v2 = verts_num + (i + 1) % verts_num;
+ }
+
+ /* Create triangle fan edges. */
+ if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) {
+ for (const int i : IndexRange(verts_num)) {
+ MEdge &edge_top = edges[verts_num * 2 + i];
+ edge_top.v1 = verts.size() - 1;
+ edge_top.v2 = (i + 1) % verts_num;
+ MEdge &edge_bottom = edges[verts_num * 3 + i];
+ edge_top.v1 = verts.size() - 2;
+ edge_top.v2 = verts_num + i;
+ }
+ }
+
+ /* Create top corners and faces. */
+ switch (fill_type) {
+ case GEO_NODE_MESH_CIRCLE_FILL_NONE:
+ break;
+ case GEO_NODE_MESH_CIRCLE_FILL_NGON: {
+ for (const int i : IndexRange(verts_num)) {
+ MLoop &loop_top = loops[i];
+ loop_top.e = i;
+ loop_top.v = i;
+ MLoop &loop_bottom = loops[verts_num + i];
+ loop_bottom.e = verts_num + i;
+ loop_bottom.v = verts_num + i;
+ }
+ MPoly &poly_top = polys[0];
+ poly_top.loopstart = 0;
+ poly_top.totloop = verts_num * 3;
+ MPoly &poly_bottom = polys[0];
+ poly_bottom.loopstart = 0;
+ poly_bottom.totloop = verts_num * 3;
+
+ break;
+ }
+ case GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN: {
+ /* WRONG. */
+ for (const int i : IndexRange(verts_num)) {
+ MLoop &loop_top = loops[3 * i];
+ loop_top.e = i;
+ loop_top.v = i;
+ MLoop &loop2_top = loops[3 * i + 1];
+ loop2_top.e = verts_num * 2 + ((i + 1) % verts_num);
+ loop2_top.v = (i + 1) % verts_num;
+ MLoop &loop3_top = loops[3 * i + 2];
+ loop3_top.e = verts_num + i;
+ loop3_top.v = verts.size() - 1;
+
+ MPoly &poly_top = polys[i];
+ poly_top.loopstart = 3 * i;
+ poly_top.totloop = 3;
+
+ MLoop &loop_bottom = loops[3 * i];
+ loop_bottom.e = i;
+ loop_bottom.v = i;
+ MLoop &loop2_bottom = loops[3 * i + 1];
+ loop2_bottom.e = verts_num + ((i + 1) % verts_num);
+ loop2_bottom.v = (i + 1) % verts_num;
+ MLoop &loop3_bottom = loops[3 * i + 2];
+ loop3_bottom.e = verts_num + i;
+ loop3_bottom.v = verts.size() - 2;
+
+ MPoly &poly_bottom = polys[i];
+ poly_bottom.loopstart = 3 * i;
+ poly_bottom.totloop = 3;
+ }
+ break;
+ }
+ }
+
+ /* Create side corners and faces. */
+ const int side_corner_start = verts_num * 3;
+ for (const int i : IndexRange(verts_num)) {
+ /* NOT DONE. */
+ MLoop &loop1 = loops[side_corner_start + i];
+ loop1.v = i;
+ loop1.e = i;
+ MLoop &loop2 = loops[side_corner_start + i];
+ loop1.v = i;
+ loop1.e = i;
+ }
+
return mesh;
}
static void geo_node_mesh_primitive_cylinder_exec(GeoNodeExecParams params)
{
- GeometrySet geometry_set;
-
const bNode &node = params.node();
const NodeGeometryMeshCylinder &storage = *(const NodeGeometryMeshCylinder *)node.storage;
@@ -150,21 +258,24 @@ static void geo_node_mesh_primitive_cylinder_exec(GeoNodeExecParams params)
const int verts_num = params.extract_input<int>("Vertices");
if (verts_num < 3) {
- params.set_output("Geometry", geometry_set);
+ params.set_output("Geometry", GeometrySet());
return;
}
const float radius = params.extract_input<float>("Radius");
+ const float depth = params.extract_input<float>("Depth");
const float3 location = params.extract_input<float3>("Location");
const float3 rotation = params.extract_input<float3>("Rotation");
- const float3 rotation_normalized = rotation.length_squared() == 0.0f ? float3(0.0f, 0.0f, 1.0f) :
- rotation.normalized();
+ Mesh *mesh = create_cylinder_mesh(radius, depth, verts_num, fill_type);
+
+ if (!location.is_zero() || !rotation.is_zero()) {
+ transform_mesh(mesh, location, rotation, float3(1));
+ }
- geometry_set.replace_mesh(
- create_cyl
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list