Wildmeshing Toolkit
Loading...
Searching...
No Matches
SurfaceMap.hpp
1#pragma once
2
3#include <wmtk/history/History.hpp>
4
5#include <Eigen/Core>
6
7#include <array>
8#include <cstdint>
9#include <set>
10#include <vector>
11
12namespace wmtk::components::tracking {
13
17{
18 uint64_t face;
19 Eigen::Vector3d bary;
20};
21
24{
26 size_t not_a_disk = 0;
30 size_t flat_triangle = 0;
32 size_t inverted = 0;
34 size_t merged_faces = 0;
37 size_t unlocated = 0;
40 size_t replaced = 0;
41
42 size_t total() const
43 {
45 }
46};
47
49enum class Smoothing {
52 barycentric,
57 flatten,
58};
59
62enum class Scaffold {
67 box,
71 ring,
72};
73
75enum class CollapsePatch {
78 both_stars,
85 removed_star,
86};
87
90{
91 Smoothing smoothing = Smoothing::flatten;
92 Scaffold scaffold = Scaffold::box;
93 CollapsePatch collapse_patch = CollapsePatch::both_stars;
94};
95
106{
107public:
108 explicit SurfaceMap(const history::SurfaceHistory& h, const SurfaceMapOptions& options = {});
109
112 std::vector<SurfacePoint> to_input(
113 std::vector<SurfacePoint> points,
114 MapWarnings* warnings = nullptr) const;
116 std::vector<SurfacePoint> to_output(
117 std::vector<SurfacePoint> points,
118 MapWarnings* warnings = nullptr) const;
119
121 const MapWarnings& build_warnings() const { return m_build_warnings; }
123 const std::vector<size_t>& warned_edits() const { return m_warned_edits; }
127 struct Face
128 {
129 uint64_t fid;
130 std::array<Eigen::Vector2d, 3> uv;
131 std::array<Eigen::Vector3d, 3> sub = {
132 {Eigen::Vector3d::UnitX(), Eigen::Vector3d::UnitY(), Eigen::Vector3d::UnitZ()}};
133 };
135 struct Cell
136 {
137 std::vector<Face> before, after;
138 };
142 std::vector<const Cell*> cells_of(size_t edit) const;
143
144
146 const std::vector<Eigen::Vector3d>& input_vertices() const { return m_in_vertices; }
147 const std::vector<std::array<uint64_t, 3>>& input_faces() const { return m_in_faces; }
148 const std::vector<uint8_t>& input_face_alive() const { return m_in_face_alive; }
149 const std::vector<Eigen::Vector3d>& output_vertices() const { return m_out_vertices; }
150 const std::vector<std::array<uint64_t, 3>>& output_faces() const { return m_out_faces; }
151 const std::vector<uint8_t>& output_face_alive() const { return m_out_face_alive; }
153 const std::set<std::array<uint64_t, 2>>& output_feature_edges() const { return m_out_features; }
154
156 const std::array<size_t, 16>& cells_by_kind() const { return m_cells_by_kind; }
160 size_t curve_collapses() const { return m_curve_collapses; }
163 size_t kept_moves() const { return m_kept_moves; }
166 size_t folded_cells() const { return m_folded_cells; }
167
168private:
172 {
173 std::vector<std::array<Eigen::Vector3d, 3>> before, after;
174 std::vector<std::vector<uint64_t>> to_after, to_before;
175 };
176 struct Step
177 {
179 std::vector<Cell> cells;
181 std::vector<uint64_t> old_to_new, new_to_old;
186 std::vector<uint64_t> dead;
189 std::vector<uint64_t> born;
191 size_t edit = 0;
192 };
193
194 std::vector<SurfacePoint>
195 map(std::vector<SurfacePoint> points, bool forward, MapWarnings* warnings) const;
196
197 std::vector<Step> m_steps;
198 MapWarnings m_build_warnings;
199 std::vector<size_t> m_warned_edits;
200 std::array<size_t, 16> m_cells_by_kind = {};
201 size_t m_curve_collapses = 0;
202 size_t m_kept_moves = 0;
203 size_t m_folded_cells = 0;
204
205 std::vector<Eigen::Vector3d> m_in_vertices, m_out_vertices;
206 std::vector<std::array<uint64_t, 3>> m_in_faces, m_out_faces;
207 std::vector<uint8_t> m_in_face_alive, m_out_face_alive;
208 std::set<std::array<uint64_t, 2>> m_out_features;
209};
210
211} // namespace wmtk::components::tracking
The map between the first and the last state of a SurfaceHistory.
Definition SurfaceMap.hpp:106
const MapWarnings & build_warnings() const
What building the map found.
Definition SurfaceMap.hpp:121
std::vector< SurfacePoint > to_output(std::vector< SurfacePoint > points, MapWarnings *warnings=nullptr) const
Points on the first state, mapped onto the last; see to_input.
Definition SurfaceMap.cpp:1092
const std::set< std::array< uint64_t, 2 > > & output_feature_edges() const
The feature edges at the end, smaller vertex id first.
Definition SurfaceMap.hpp:153
const std::array< size_t, 16 > & cells_by_kind() const
How many operations needed a local map, by kind (index: history::EditKind).
Definition SurfaceMap.hpp:156
const std::vector< Eigen::Vector3d > & input_vertices() const
The complex at the start and at the end, every slot, as the history holds them.
Definition SurfaceMap.hpp:146
size_t kept_moves() const
Definition SurfaceMap.hpp:163
std::vector< SurfacePoint > to_input(std::vector< SurfacePoint > points, MapWarnings *warnings=nullptr) const
Definition SurfaceMap.cpp:1085
std::vector< const Cell * > cells_of(size_t edit) const
Definition SurfaceMap.cpp:1252
size_t folded_cells() const
Definition SurfaceMap.hpp:166
const std::vector< size_t > & warned_edits() const
The edits (indices into the history) whose local map raised a build warning.
Definition SurfaceMap.hpp:123
size_t curve_collapses() const
Definition SurfaceMap.hpp:160
EditKind
The kinds of edit a complex goes through.
Definition History.hpp:27
Where a map stops being a bijection. Counted, never fatal: the map still answers.
Definition SurfaceMap.hpp:24
size_t not_a_disk
A collapse whose patch is not a disk; its faces are mapped by relabelling alone.
Definition SurfaceMap.hpp:26
size_t flat_triangle
Definition SurfaceMap.hpp:30
size_t merged_faces
A collapse that merged duplicate faces: two faces map onto one.
Definition SurfaceMap.hpp:34
size_t inverted
An atlas with a triangle that is not positively oriented.
Definition SurfaceMap.hpp:32
size_t unlocated
Definition SurfaceMap.hpp:37
size_t replaced
Definition SurfaceMap.hpp:40
One flattened patch: the faces it covers before and after an edit, in a shared domain.
Definition SurfaceMap.hpp:136
std::vector< uint64_t > born
Definition SurfaceMap.hpp:189
std::vector< uint64_t > dead
Definition SurfaceMap.hpp:186
size_t edit
The history edit this step maps.
Definition SurfaceMap.hpp:191
std::vector< uint64_t > old_to_new
consolidate (and relabel, which renumbers faces as one does): face renumbering.
Definition SurfaceMap.hpp:181
Embedding embedding
embed only.
Definition SurfaceMap.hpp:183
How a SurfaceMap is built.
Definition SurfaceMap.hpp:90
Definition SurfaceMap.hpp:17
A complex and the edits it went through, in commit order.
Definition History.hpp:101