[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