42SimplicialEmbedding::SimplicialEmbedding(
44 const std::vector<attribute::MeshAttributeHandle>& label_attributes,
46 const std::vector<attribute::MeshAttributeHandle>& pass_through_attributes)
48 , m_label_attributes(label_attributes)
50 , m_pass_through_attributes(pass_through_attributes)
53void SimplicialEmbedding::regularize_tags(
bool generate_simplicial_embedding)
55 using namespace operations;
57 std::vector<attribute::MeshAttributeHandle> todo_handles;
61 todo_handles.emplace_back(todo_handle);
64 std::deque<TagAttribute> tag_attributes;
66 tag_attributes.emplace_back(
74 for (
size_t i = 0; i < tag_attributes.size(); ++i) {
78 "the top simplex type up to vertex.");
84 for (
size_t attr_it = 0; attr_it < tag_attributes.size() - 1; ++attr_it) {
87 if (ta.m_accessor.const_scalar_attribute(t) != ta.m_val) {
100 face_ta.m_accessor.scalar_attribute(f) = face_ta.m_val;
105 if (!generate_simplicial_embedding) {
111 const auto pos_handle =
117 logger().error(
"Mesh is not inversion free BEFORE simplicial embedding!");
123 for (
size_t attr_it = 0; attr_it < tag_attributes.size() - 1;) {
129 int64_t count_todos = 0;
131 if (ta.m_accessor.const_scalar_attribute(t) == ta.m_val) {
142 const TagAttribute& face_ta = tag_attributes[attr_it + 1];
144 bool all_faces_are_tagged =
true;
147 if (face_ta.m_accessor.const_scalar_attribute(f) != face_ta.m_val) {
148 all_faces_are_tagged =
false;
153 if (all_faces_are_tagged) {
154 todo_acc.scalar_attribute(t) = 1;
161 int64_t count_done = 0;
162 switch (ta.m_ptype) {
173 SplitBasicStrategy::None,
174 SplitRibBasicStrategy::None);
180 SplitBasicStrategy::Copy,
181 SplitRibBasicStrategy::None);
188 logger().info(
"split {} edges", count_todos);
192 if (stats.number_of_successful_operations() == 0) {
209 SplitBasicStrategy::None,
210 SplitRibBasicStrategy::None);
217 SplitBasicStrategy::Copy,
218 SplitRibBasicStrategy::None);
226 CollapseBasicStrategy::None);
230 logger().info(
"split {} faces", count_todos);
234 if (stats.number_of_successful_operations() == 0) {
251 SplitBasicStrategy::None,
252 SplitRibBasicStrategy::None);
259 SplitBasicStrategy::Copy,
260 SplitRibBasicStrategy::None);
268 CollapseBasicStrategy::None);
271 logger().info(
"split {} tetrahedra", count_todos);
275 if (stats.number_of_successful_operations() == 0) {
285 if (count_done == count_todos) {
289 "{} remain. Regularize same primitive type once more.",
290 count_todos - count_done);
296 const auto pos_handle =
304 logger().error(
"Mesh is not inversion free after simplicial embedding!");
bool after(const std::vector< Tuple > &, const std::vector< Tuple > &top_dimension_tuples_after) const override
we assume with local vid order (v0,v1,v2,v3) has positive volume (orient3d(v0,v1,v2,...