[Bf-blender-cvs] [cae7778db79] bevelv2: Added start of a class for a delta to a mesh.

Howard Trickey noreply at git.blender.org
Tue Jul 5 21:58:37 CEST 2022


Commit: cae7778db79cf08f7139002d8c018f204bd23312
Author: Howard Trickey
Date:   Tue Jul 5 15:58:03 2022 -0400
Branches: bevelv2
https://developer.blender.org/rBcae7778db79cf08f7139002d8c018f204bd23312

Added start of a class for a delta to a mesh.

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

M	source/blender/nodes/geometry/nodes/node_geo_bevel_mesh.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_bevel_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_bevel_mesh.cc
index 838c67097d4..7de1138760c 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_bevel_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_bevel_mesh.cc
@@ -660,6 +660,144 @@ void BevelData::calculate_vertex_bevels(const IndexMask to_bevel, VArray<float>
   setup_vert_map();
 }
 
+/* IndexAlloc allocates sequential integers, starting from a given start value. */
+class IndexAlloc {
+  int start_;
+  int first_free_;
+
+ public:
+  IndexAlloc(int start) : start_(start), first_free_(start)
+  {
+  }
+
+  int alloc()
+  {
+    return first_free_++;
+  }
+  int start() const
+  {
+    return start_;
+  }
+  int allocated_size() const
+  {
+    return first_free_ - start_;
+  }
+};
+
+/* MeshDelta represents a delta to a Mesh: additions and deletions
+ * of Mesh elements.
+ */
+class MeshDelta {
+  Mesh &mesh_;
+  IndexAlloc vert_alloc_;
+  IndexAlloc edge_alloc_;
+  IndexAlloc poly_alloc_;
+  IndexAlloc loop_alloc_;
+  Set<int> vert_deletes_;
+  Set<int> edge_deletes_;
+  Set<int> poly_deletes_;
+  Set<int> loop_deletes_;
+  Vector<MVert> new_verts_;
+  Vector<MEdge> new_edges_;
+  Vector<MPoly> new_polys_;
+  Vector<MLoop> new_loops_;
+
+ public:
+  MeshDelta(Mesh &mesh);
+
+  /* TODO: provide arguments or methods to set the attributes. */
+  int new_vert(const float3 &co);
+  int new_edge(int v1, int v2);
+  int new_loop(int v, int e);
+  int new_face(int loopstart, int totloop);
+
+  void delete_vert(int v)
+  {
+    vert_deletes_.add(v);
+  }
+  void delete_edge(int e)
+  {
+    edge_deletes_.add(e);
+  }
+  void delete_face(int f);
+
+  /* Change Mesh in place to delete and add what is required, closing up the
+   * gaps in the index spaces. */
+  void apply_delta_to_mesh();
+};
+
+MeshDelta::MeshDelta(Mesh &mesh)
+    : mesh_(mesh),
+      vert_alloc_(mesh_.totvert),
+      edge_alloc_(mesh_.totedge),
+      poly_alloc_(mesh_.totpoly),
+      loop_alloc_(mesh_.totloop)
+{
+}
+
+int MeshDelta::new_vert(const float3 &co)
+{
+  int v = vert_alloc_.alloc();
+  MVert mvert;
+  copy_v3_v3(mvert.co, co);
+  mvert.flag = 0;
+  mvert.bweight = 0;
+  new_verts_.append(mvert);
+  BLI_assert(v == new_verts_.size() - 1);
+  return v;
+}
+
+int MeshDelta::new_edge(int v1, int v2)
+{
+  int e = edge_alloc_.alloc();
+  MEdge medge;
+  medge.v1 = v1;
+  medge.v2 = v2;
+  medge.crease = 0;
+  medge.bweight = 0;
+  medge.flag = ME_EDGEDRAW;
+  new_edges_.append(medge);
+  BLI_assert(e == new_edges_.size() - 1);
+  return e;
+}
+
+int MeshDelta::new_loop(int v, int e)
+{
+  int l = loop_alloc_.alloc();
+  MLoop mloop;
+  mloop.v = v;
+  mloop.e = e;
+  new_loops_.append(mloop);
+  BLI_assert(l == new_loops_.size() - 1);
+  return l;
+}
+
+int MeshDelta::new_face(int loopstart, int totloop)
+{
+  int f = poly_alloc_.alloc();
+  MPoly mpoly;
+  mpoly.loopstart = loopstart;
+  mpoly.totloop = totloop;
+  mpoly.mat_nr = 0;
+  mpoly.flag = 0;
+  new_polys_.append(mpoly);
+  BLI_assert(f = new_polys_.size() - 1);
+  return f;
+}
+
+/* Delete the MPoly and the loops.
+ * The edges and vertices need to be deleted elsewhere, if necessary
+ */
+void MeshDelta::delete_face(int f)
+{
+  poly_deletes_.add(f);
+  BLI_assert(f >= 0 && f < mesh_.totpoly);
+  const MPoly &mpoly = mesh_.mpoly[f];
+  for (int l = mpoly.loopstart; l < mpoly.loopstart + mpoly.totloop; l++) {
+    loop_deletes_.add(l);
+  }
+}
+
 static void bevel_mesh_vertices(MeshComponent &component,
                                 const Field<bool> &selection_field,
                                 const Field<float> &amount_field)



More information about the Bf-blender-cvs mailing list