diff --git a/implicit_arrangements/include/arrangement_builder.hpp b/implicit_arrangements/include/arrangement_builder.hpp index d73e57e..88c1365 100644 --- a/implicit_arrangements/include/arrangement_builder.hpp +++ b/implicit_arrangements/include/arrangement_builder.hpp @@ -140,7 +140,6 @@ public: unique_plane_count++; } } - std::cout << "test" << std::endl; m_arrangement.arrangement = extract_arrangement(std::move(ia_complex)); m_arrangement.is_runtime_computed = true; diff --git a/implicit_arrangements/src/add_plane.cpp b/implicit_arrangements/src/add_plane.cpp index d721ec5..4211cf0 100644 --- a/implicit_arrangements/src/add_plane.cpp +++ b/implicit_arrangements/src/add_plane.cpp @@ -1,5 +1,4 @@ #include -#include #include "ia_cut_face.hpp" #include "robust_assert.hpp" @@ -17,7 +16,6 @@ inline void shrink(small_vector_mp& c, small_vector_mp& index_map, index_map[i] = active_count; active_count++; } - std::cout << "shrink: " << s << " -> " << active_count << std::endl; c.resize(active_count); } @@ -236,7 +234,6 @@ uint32_t add_plane(const PlaneGroup<3>& repo, IAComplex<3>& ia_complex, uint32_t // Step 7: remove unused geometries. remove_unused_geometry(ia_complex); - std::cout << "an add_plane() completed" << std::endl; return coplanar_plane; } \ No newline at end of file diff --git a/network_process/src/background_mesh.cpp b/network_process/src/background_mesh.cpp index 4fedc6c..3427b9a 100644 --- a/network_process/src/background_mesh.cpp +++ b/network_process/src/background_mesh.cpp @@ -31,7 +31,7 @@ tetrahedron_mesh_t generate_tetrahedron_background_mesh(uint32_t const auto v0 = i * N * N + j * N + k; mesh.vertices[v0] = {x, y, z}; - if (i < resolution - 1 && j < resolution - 1 && k < resolution - 1) { + if (i < resolution && j < resolution && k < resolution) { size_t idx = (i * resolution * resolution + j * resolution + k) * 5; const auto v1 = (i + 1) * N * N + j * N + k; const auto v2 = (i + 1) * N * N + (j + 1) * N + k; @@ -42,11 +42,17 @@ tetrahedron_mesh_t generate_tetrahedron_background_mesh(uint32_t const auto v7 = i * N * N + (j + 1) * N + k + 1; if ((i + j + k) % 2 == 0) - *(TetrahedronVertexIndexGroup*)(mesh.indices.data() + idx) = {v4, v6, v1, v3, v6, v3, v4, v7, v1, v3, - v0, v4, v3, v1, v2, v6, v4, v1, v6, v5}; + *(TetrahedronVertexIndexGroup*)(mesh.indices.data() + idx) = {v4, v6, v1, v3, // + v6, v3, v4, v7, // + v1, v3, v0, v4, // + v3, v1, v2, v6, // + v4, v1, v6, v5}; else - *(TetrahedronVertexIndexGroup*)(mesh.indices.data() + idx) = {v7, v0, v2, v5, v2, v3, v0, v7, v5, v7, - v0, v4, v7, v2, v6, v5, v0, v1, v2, v5}; + *(TetrahedronVertexIndexGroup*)(mesh.indices.data() + idx) = {v7, v0, v2, v5, // + v2, v3, v0, v7, // + v5, v7, v0, v4, // + v7, v2, v6, v5, // + v0, v1, v2, v5}; } }); } diff --git a/network_process/src/implicit_surface_network_processor.cpp b/network_process/src/implicit_surface_network_processor.cpp index af1878d..044ed33 100644 --- a/network_process/src/implicit_surface_network_processor.cpp +++ b/network_process/src/implicit_surface_network_processor.cpp @@ -15,15 +15,19 @@ bool ImplicitSurfaceNetworkProcessor::run(labelled_timers_manager& timers_manage const auto num_funcs = sdf_scalar_field.rows(); // compute function signs at vertices + // EDIT: we only need to identify the sdf value is inside or on surface/outside + // Eigen::Matrix scalar_field_signs(num_funcs, num_vert); auto scalar_field_sign = [](double x) -> int8_t { return (x > 0) ? 1 : ((x < 0) ? -1 : 0); }; - Eigen::MatrixXd scalar_field_signs(num_funcs, num_vert); + dynamic_bitset_mp<> is_positive_scalar_field_sign(num_funcs * num_vert, false); + dynamic_bitset_mp<> is_negative_scalar_field_sign(num_funcs * num_vert, false); dynamic_bitset_mp<> is_degenerate_vertex(num_vert, false); { timers_manager.push_timer("identify sdf signs"); for (size_t i = 0; i < sdf_scalar_field.size(); ++i) { - if ((*(scalar_field_signs.data() + i) = scalar_field_sign(*(sdf_scalar_field.data() + i))) == 0) { - is_degenerate_vertex.set(i); - } + const auto sign = scalar_field_sign(*(sdf_scalar_field.data() + i)); + is_positive_scalar_field_sign.set(i, sign > 0); + is_negative_scalar_field_sign.set(i, sign < 0); + if (sign == 0) { is_degenerate_vertex.set(i); } } timers_manager.pop_timer("identify sdf signs"); } @@ -41,11 +45,14 @@ bool ImplicitSurfaceNetworkProcessor::run(labelled_timers_manager& timers_manage for (Eigen::Index i = 0; i < num_tets; ++i) { const auto tet_ptr = &background_mesh.indices[i].v1; for (Eigen::Index j = 0; j < num_funcs; ++j) { - uint32_t pos_count{}; - for (uint32_t k = 0; k < 4; ++k) - if (scalar_field_signs(j, tet_ptr[k]) == 1) pos_count++; + uint32_t pos_count{}, neg_count{}; + for (uint32_t k = 0; k < 4; ++k) { + if (is_positive_scalar_field_sign[tet_ptr[k] * num_funcs + j]) pos_count++; + if (is_negative_scalar_field_sign[tet_ptr[k] * num_funcs + j]) neg_count++; + } + // if (scalar_field_signs(j, tet_ptr[k]) == 1) pos_count++; // tets[i].size() == 4, this means that the function is active in this tet - if (0 < pos_count && pos_count < 4) func_in_tet.emplace_back(j); + if (pos_count < 4 && neg_count < 4) func_in_tet.emplace_back(j); } if (func_in_tet.size() > start_index_of_tet.back()) { ++num_intersecting_tet; } start_index_of_tet.emplace_back(static_cast(func_in_tet.size())); @@ -114,7 +121,6 @@ bool ImplicitSurfaceNetworkProcessor::run(labelled_timers_manager& timers_manage } timers_manager.pop_timer("implicit arrangements calculation in total"); } - std::cout << "test" << std::endl; // extract arrangement mesh: combining results from all tets to produce a mesh stl_vector_mp iso_verts{}; @@ -287,16 +293,22 @@ bool ImplicitSurfaceNetworkProcessor::run(labelled_timers_manager& timers_manage } // fetching function labels (True, False) for each cell - small_dynamic_bitset_mp<> sample_function_label(num_funcs); - for (Eigen::Index i = 0; i < num_funcs; i++) { - sample_function_label.set(i, (scalar_field_signs(0, i) == 1) ? true : false); - } + small_dynamic_bitset_mp<> sample_function_label{}; + sample_function_label.reserve(num_funcs); + sample_function_label.append(is_positive_scalar_field_sign.data(), + is_positive_scalar_field_sign.data() + num_funcs / sizeof(size_t) + 1); + // for (size_t i = 0; i < num_funcs; i++) { + // // sample_function_label.set(i, (scalar_field_signs(i, size_t{0}) == 1) ? true : false); + // sample_function_label.set(i, scalar_field_signs[i]); + // } + std::cout << "test" << std::endl; cell_function_labels = sign_propagation(arrangement_cells, shell_of_half_patch, shells, patch_function_labels, num_funcs, sample_function_label); + std::cout << "test" << std::endl; // free Arranger3D runtime memory iff necessary for (uint32_t i = 0; i < cut_results.size(); ++i) {