[Bf-blender-cvs] [f81d1d4ad65] soc-2021-adaptive-cloth: adaptive_cloth: AdaptiveMesh: get_flippable_edge_indices_set()
ishbosamiya
noreply at git.blender.org
Mon Jul 26 08:17:43 CEST 2021
Commit: f81d1d4ad65e620bca68ead25a5004701c47aa72
Author: ishbosamiya
Date: Thu Jul 22 17:37:31 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rBf81d1d4ad65e620bca68ead25a5004701c47aa72
adaptive_cloth: AdaptiveMesh: get_flippable_edge_indices_set()
Similar to get_splittable_edge_indices_set() it checks for
flippability of the `AdaptiveEdge` instead of the "size" of the
`AdaptiveEdge`.
===================================================================
M source/blender/blenkernel/intern/cloth_remesh.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/cloth_remesh.cc b/source/blender/blenkernel/intern/cloth_remesh.cc
index dc69c65709a..47bb922152e 100644
--- a/source/blender/blenkernel/intern/cloth_remesh.cc
+++ b/source/blender/blenkernel/intern/cloth_remesh.cc
@@ -215,6 +215,7 @@ class Sizing {
enum VertFlags {
VERT_NONE = 0,
VERT_SELECTED_FOR_SPLIT = 1 << 0,
+ VERT_SELECTED_FOR_FLIP = 1 << 1,
};
class VertData {
@@ -462,6 +463,61 @@ class AdaptiveMesh : public Mesh<NodeData<END>, VertData, EdgeData, internal::Em
float2::dot(u_jk, m_avg * u_ik) * cross_2d(u_il, u_jl) <
0.0;
}
+
+ /**
+ * Gets the maximal independent set of flippable edge indices in
+ * `active_faces`.
+ *
+ * Reference [1]
+ */
+ blender::Vector<EdgeIndex> get_flippable_edge_indices_set(
+ const blender::Vector<FaceIndex> &active_faces)
+ {
+ /* Deselect all verts of `active_faces` for flips */
+ for (const auto &face_index : active_faces) {
+ const auto &face = this->get_checked_face(face_index);
+
+ for (const auto &vert_index : face.get_verts()) {
+ auto &vert = this->get_checked_vert(vert_index);
+
+ auto &vert_data = vert.get_checked_extra_data_mut();
+ auto &flag = vert_data.get_flag_mut();
+ flag &= ~VERT_SELECTED_FOR_FLIP;
+ }
+ }
+
+ /* TODO(ish): Need to store a set of the edge indices and use
+ * those because it is most likely that the `active_face` have
+ * overlapping edges */
+
+ blender::Vector<EdgeIndex> flippable_edge_indices;
+ for (const auto &face_index : active_faces) {
+ const auto &face = this->get_checked_face(face_index);
+
+ const auto edge_indices = this->get_edge_indices_of_face(face);
+ for (const auto &edge_index : edge_indices) {
+ const auto &edge = this->get_checked_edge(edge_index);
+ auto [v1, v2] = this->get_checked_verts_of_edge(edge, false);
+ if (v1.get_checked_extra_data().get_flag() & VERT_SELECTED_FOR_FLIP ||
+ v2.get_checked_extra_data().get_flag() & VERT_SELECTED_FOR_FLIP) {
+ continue;
+ }
+
+ if (this->is_edge_flippable_anisotropic_aware(edge)) {
+ flippable_edge_indices.append(edge.get_self_index());
+
+ auto &v1_data = v1.get_checked_extra_data_mut();
+ auto &v1_flag = v1_data.get_flag_mut();
+ v1_flag |= VERT_SELECTED_FOR_FLIP;
+ auto &v2_data = v2.get_checked_extra_data_mut();
+ auto &v2_flag = v2_data.get_flag_mut();
+ v2_flag |= VERT_SELECTED_FOR_FLIP;
+ }
+ }
+ }
+
+ return flippable_edge_indices;
+ }
};
} // namespace blender::bke::internal
More information about the Bf-blender-cvs
mailing list