[Bf-blender-cvs] [2871ad0f3ba] soc-2021-adaptive-cloth: adaptive_cloth: fix: Mesh: delete elements bunch of fixes

ishbosamiya noreply at git.blender.org
Mon Jul 12 08:23:48 CEST 2021


Commit: 2871ad0f3ba54ab6acd9ac4bae20c6a7427e40b2
Author: ishbosamiya
Date:   Wed Jul 7 19:19:22 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rB2871ad0f3ba54ab6acd9ac4bae20c6a7427e40b2

adaptive_cloth: fix: Mesh: delete elements bunch of fixes

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

M	source/blender/blenkernel/BKE_cloth_remesh.hh

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

diff --git a/source/blender/blenkernel/BKE_cloth_remesh.hh b/source/blender/blenkernel/BKE_cloth_remesh.hh
index cab4c2c93c8..adb4d3cff51 100644
--- a/source/blender/blenkernel/BKE_cloth_remesh.hh
+++ b/source/blender/blenkernel/BKE_cloth_remesh.hh
@@ -1459,7 +1459,7 @@ template<typename END, typename EVD, typename EED, typename EFD> class Mesh {
       vert.node = std::nullopt;
     }
 
-    return std::move(node);
+    return node;
   }
 
   /**
@@ -1477,9 +1477,7 @@ template<typename END, typename EVD, typename EED, typename EFD> class Mesh {
     /* Remove node's reference to this vert if the node hasn't been
      * deleted already */
     if (vert.node) {
-      auto op_node = this->nodes.get(vert.node);
-      BLI_assert(op_node);
-      auto &node = op_node.value().get();
+      auto &node = this->get_checked_node_of_vert(vert);
       node.verts.remove_first_occurrence_and_reorder(vert.self_index);
     }
 
@@ -1492,9 +1490,7 @@ template<typename END, typename EVD, typename EED, typename EFD> class Mesh {
       auto &edge = op_edge.value().get();
 
       for (const auto face_index : edge.faces) {
-        auto op_face = this->faces.get(face_index);
-        BLI_assert(op_face);
-        auto &face = op_face.value().get();
+        auto &face = this->get_checked_face(face_index);
 
         /* The ordering of the verts within the face matters, so need
          * to go for this more expensive method of removal */
@@ -1508,14 +1504,11 @@ template<typename END, typename EVD, typename EED, typename EFD> class Mesh {
       }
     }
 
-    return std::move(vert);
+    return vert;
   }
 
   /**
    * Delete the edge and update elements' that refer to this edge.
-   *
-   * This should be called only after the verts of this edge have been
-   * deleted using `delete_vert()`.
    */
   Edge<EED> delete_edge(EdgeIndex edge_index)
   {
@@ -1523,12 +1516,14 @@ template<typename END, typename EVD, typename EED, typename EFD> class Mesh {
     BLI_assert(op_edge);
     auto edge = op_edge.value();
 
-    /* The verts should have been deleted prior to calling this
-     * function otherwise, the link between the faces and verts is
-     * comprimised if not careful. */
-    BLI_assert(edge.verts.has_value() == false);
+    if (edge.verts) {
+      auto &vert_1 = this->get_checked_vert(std::get<0>(edge.verts.value()));
+      vert_1.edges.remove_first_occurrence_and_reorder(edge.self_index);
+      auto &vert_2 = this->get_checked_vert(std::get<1>(edge.verts.value()));
+      vert_2.edges.remove_first_occurrence_and_reorder(edge.self_index);
+    }
 
-    return std::move(edge);
+    return edge;
   }
 
   /**
@@ -1540,15 +1535,26 @@ template<typename END, typename EVD, typename EED, typename EFD> class Mesh {
     BLI_assert(op_face);
     auto face = op_face.value();
 
-    for (const auto &vert_index : face.verts) {
-      auto op_vert = this->verts.get(vert_index);
-      BLI_assert(op_vert);
-      auto vert = op_vert.value();
+    auto vert_1_index = face.verts[0];
+    auto vert_2_index = face.verts[1];
+    for (auto i = 1; i <= face.verts.size(); i++) {
+      vert_1_index = vert_2_index;
+      if (i == face.verts.size()) {
+        vert_2_index = face.verts[0];
+      }
+      else {
+        vert_2_index = face.verts[i];
+      }
+
+      auto op_edge_index = this->get_connecting_edge_index(vert_1_index, vert_2_index);
+      BLI_assert(op_edge_index);
+      auto edge_index = op_edge_index.value();
+      auto &edge = this->get_checked_edge(edge_index);
 
-      vert.faces.remove_first_occurrence_and_reorder(face.self_index);
+      edge.faces.remove_first_occurrence_and_reorder(face.self_index);
     }
 
-    return std::move(face);
+    return face;
   }
 
   /**



More information about the Bf-blender-cvs mailing list