From a4d06c5e6e8eb25bf4c71972e4c6bd27708b0fd6 Mon Sep 17 00:00:00 2001 From: mckay Date: Mon, 18 Aug 2025 15:07:39 +0800 Subject: [PATCH 1/6] fix: correct logical operations in filter_cells_by_boolean for cell signs --- network_process/src/post_topo/patch_propagation.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/network_process/src/post_topo/patch_propagation.cpp b/network_process/src/post_topo/patch_propagation.cpp index 81c71a5..8e229da 100644 --- a/network_process/src/post_topo/patch_propagation.cpp +++ b/network_process/src/post_topo/patch_propagation.cpp @@ -152,11 +152,11 @@ dynamic_bitset_mp<> filter_cells_by_boolean(const baked_blobtree_t& const auto& other_cell_sign = stacked_nodes.top().cell_signs; switch (iter->get_operation()) { - case internal::eNodeOperation::unionOp: temp_info.cell_signs |= other_cell_sign; break; - case internal::eNodeOperation::intersectionOp: temp_info.cell_signs &= other_cell_sign; break; + case internal::eNodeOperation::unionOp: temp_info.cell_signs &= other_cell_sign; break; + case internal::eNodeOperation::intersectionOp: temp_info.cell_signs |= other_cell_sign; break; case internal::eNodeOperation::differenceOp: // stacked nodes are always left childs - temp_info.cell_signs.flip() &= other_cell_sign; + temp_info.cell_signs.flip() |= other_cell_sign; break; default: throw std::runtime_error("ERROR: baked blobtree with unknown type operation node"); break; } @@ -171,5 +171,6 @@ dynamic_bitset_mp<> filter_cells_by_boolean(const baked_blobtree_t& assert(stacked_nodes.size() == 1); assert(stacked_nodes.top().parent_index == 0xFFFFFFFF); - return stacked_nodes.top().cell_signs; + // sign 0 in blobtree means inside, so we need to flip the sign + return stacked_nodes.top().cell_signs.flip(); } \ No newline at end of file From c45be410ca00ff22f17458a1877d726061a7c0ac Mon Sep 17 00:00:00 2001 From: mckay Date: Mon, 18 Aug 2025 15:08:36 +0800 Subject: [PATCH 2/6] fix: update filter_active_vertices function signature and logic for vertex processing --- .../include/post_topo/filter_polygon_faces.hpp | 4 +++- network_process/src/post_topo/filter_polygon_faces.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/network_process/include/post_topo/filter_polygon_faces.hpp b/network_process/include/post_topo/filter_polygon_faces.hpp index fb76e4e..f6a73ad 100644 --- a/network_process/include/post_topo/filter_polygon_faces.hpp +++ b/network_process/include/post_topo/filter_polygon_faces.hpp @@ -13,4 +13,6 @@ dynamic_bitset_mp<> filter_polygon_faces(const stl_vector_mp& stl_vector_mp& output_polygon_faces, stl_vector_mp& output_vertex_counts_of_face); -void filter_active_vertices(stl_vector_mp& vertices, stl_vector_mp& output_polygon_faces); \ No newline at end of file +void filter_active_vertices(stl_vector_mp& iso_pts, + stl_vector_mp& vertices, + stl_vector_mp& output_polygon_faces); \ No newline at end of file diff --git a/network_process/src/post_topo/filter_polygon_faces.cpp b/network_process/src/post_topo/filter_polygon_faces.cpp index 1e2c020..b84950e 100644 --- a/network_process/src/post_topo/filter_polygon_faces.cpp +++ b/network_process/src/post_topo/filter_polygon_faces.cpp @@ -82,10 +82,12 @@ dynamic_bitset_mp<> filter_polygon_faces(const stl_vector_mp& return active_face_label; } -void filter_active_vertices(stl_vector_mp& vertices, stl_vector_mp& output_polygon_faces) +void filter_active_vertices(stl_vector_mp& iso_pts, + stl_vector_mp& output_vertices, + stl_vector_mp& output_polygon_faces) { stl_vector_mp unique_vertex_indices{}; - dynamic_bitset_mp<> vertex_visited(vertices.size(), false); + dynamic_bitset_mp<> vertex_visited(iso_pts.size(), false); for (const auto& vertex_index : output_polygon_faces) { if (!vertex_visited[vertex_index]) { unique_vertex_indices.emplace_back(vertex_index); @@ -102,6 +104,6 @@ void filter_active_vertices(stl_vector_mp& vertices, stl_vector stl_vector_mp unique_vertices{}; unique_vertices.reserve(unique_vertex_indices.size()); - for (const auto& vertex_index : unique_vertex_indices) { unique_vertices.emplace_back(vertices[vertex_index]); } - std::swap(vertices, unique_vertices); + for (const auto& vertex_index : unique_vertex_indices) { unique_vertices.emplace_back(iso_pts[vertex_index]); } + std::swap(output_vertices, unique_vertices); } \ No newline at end of file From d8f058e3c4b280c4c51b997006f8f2cf0f414ccf Mon Sep 17 00:00:00 2001 From: mckay Date: Mon, 18 Aug 2025 15:28:26 +0800 Subject: [PATCH 3/6] fix: update filter_active_vertices call to use iso_pts for vertex processing after cherry-pick commit that updates filter_active_vertices() --- network_process/src/process.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network_process/src/process.cpp b/network_process/src/process.cpp index 22c6845..fa4ca85 100644 --- a/network_process/src/process.cpp +++ b/network_process/src/process.cpp @@ -159,7 +159,7 @@ ISNP_API void build_implicit_network_by_blobtree(const s_settings& active_cell_label, output_polygon_faces, output_vertex_counts_of_face); - filter_active_vertices(output_vertices, output_polygon_faces); + filter_active_vertices(iso_pts, output_vertices, output_polygon_faces); } } } \ No newline at end of file From 1c390339cf66f711f201c9ea6b3a3d66a3c3dcaa Mon Sep 17 00:00:00 2001 From: mckay Date: Mon, 18 Aug 2025 15:17:06 +0800 Subject: [PATCH 4/6] fix: correct memory allocation for faces in generate_polymesh function --- frontend/src/solve.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/solve.cpp b/frontend/src/solve.cpp index 904eade..60b4cbe 100644 --- a/frontend/src/solve.cpp +++ b/frontend/src/solve.cpp @@ -31,7 +31,7 @@ API primitive_generation_result_t generate_polymesh(implicit_network_solver* sol result.mesh.num_vertices = static_cast(output_vertices.size()); result.mesh.num_faces = static_cast(output_vertex_counts_of_face.size()); vector3d* vertices = (vector3d*)mi_malloc(sizeof(vector3d) * result.mesh.num_vertices); - uint32_t* faces = (uint32_t*)mi_malloc(sizeof(uint32_t) * result.mesh.num_faces); + uint32_t* faces = (uint32_t*)mi_malloc(sizeof(uint32_t) * output_polygon_faces.size()); uint32_t* vertex_counts = (uint32_t*)mi_malloc(sizeof(uint32_t) * result.mesh.num_faces); for (uint32_t i = 0; i < result.mesh.num_vertices; i++) { std::move(output_vertices[i].data(), output_vertices[i].data() + 3, &vertices[i].x); From 8065849bb26a1962cfe0efbce67ec22c2df9163f Mon Sep 17 00:00:00 2001 From: mckay Date: Sat, 16 Aug 2025 20:15:54 +0800 Subject: [PATCH 5/6] fix: update logic in judge_sign_by_subface_sign to use bitwise OR for combining signs --- primitive_process/src/base/primitive.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/primitive_process/src/base/primitive.cpp b/primitive_process/src/base/primitive.cpp index ef3078f..6d7c596 100644 --- a/primitive_process/src/base/primitive.cpp +++ b/primitive_process/src/base/primitive.cpp @@ -34,9 +34,9 @@ dynamic_bitset_mp<> primitive::judge_sign_by_subface_sign(stl_vector_mp res = subface_signs.front(); for (size_t i = 1; i < get_subface_count(); ++i) { if (!subfaces[i].is_marked()) - res &= subface_signs[i]; + res |= subface_signs[i]; else - res &= subface_signs[i].flip(); + res |= subface_signs[i].flip(); } return res; From 1c8095fd29bf68b3b9772a1c28100b2f2e7c8653 Mon Sep 17 00:00:00 2001 From: Zhicheng Wang <1627343141@qq.com> Date: Wed, 20 Aug 2025 21:45:59 +0800 Subject: [PATCH 6/6] fix error of transforming cylinder --- application/main.cpp | 1 + network_process/src/prim_gen/extract_vertex_infos.cpp | 5 +++-- primitive_process/src/primitive/simple/cylinder.cpp | 11 ++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/application/main.cpp b/application/main.cpp index 6437509..286ac37 100644 --- a/application/main.cpp +++ b/application/main.cpp @@ -10,6 +10,7 @@ int main() // auto sphere2 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_SPHERE); auto cylinder = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_translation(sphere1, {1.0, 0.0, 0.0}); + // primitive_apply_scale(cylinder, {1, 1, 2}); std::cout << "primitive created..." << std::endl; auto runtime_blobtree = create_blobtree(); diff --git a/network_process/src/prim_gen/extract_vertex_infos.cpp b/network_process/src/prim_gen/extract_vertex_infos.cpp index ec63527..fec3ce8 100644 --- a/network_process/src/prim_gen/extract_vertex_infos.cpp +++ b/network_process/src/prim_gen/extract_vertex_infos.cpp @@ -39,8 +39,9 @@ void extract_vertex_infos(const s_settings& settings, // compute the SDF values for each vertex for (uint32_t i = 0; i < tree.subfaces.size(); ++i) { - auto subface_vert_info = vertex_infos.col(i); - auto sdf_evaluator = tree.subfaces[i].object_ptr->fetch_sdf_evaluator(); + auto subface_vert_info = vertex_infos.col(i); + const auto& subface = tree.subfaces[i]; + auto sdf_evaluator = subface.object_ptr->fetch_sdf_evaluator(); for (uint32_t j = 0; j < subface_vert_info.size(); ++j) { auto pos = get_vert_pos(j, scene_bg_mesh_info); subface_vert_info[j] = sdf_evaluator(pos); diff --git a/primitive_process/src/primitive/simple/cylinder.cpp b/primitive_process/src/primitive/simple/cylinder.cpp index da6c6c5..20623a6 100644 --- a/primitive_process/src/primitive/simple/cylinder.cpp +++ b/primitive_process/src/primitive/simple/cylinder.cpp @@ -24,7 +24,7 @@ void cylinder_t::destroy() void cylinder_t::initialize(primitive_data_center_t &data_center, const std::vector> &new_model_matrices) { - std::array old_ptrs{bottom_plane.get_ptr(), cylinder_face.get_ptr(), top_plane.get_ptr()}; + std::array old_ptrs{cylinder_face.get_ptr(), bottom_plane.get_ptr(), top_plane.get_ptr()}; std::array old_model_matrices{nullptr, nullptr, nullptr}; for (size_t i = 0; i < 3; ++i) { if (old_ptrs[i] != nullptr) old_model_matrices[i] = old_ptrs[i]->model_matrices; @@ -52,8 +52,13 @@ void cylinder_t::initialize(primitive_data_center_t } // deferred release to avoid acquiring the same just-released subface - for (size_t i = 0; i < 3; ++i) { - if (old_ptrs[i] != nullptr) data_center.spheres.release(old_model_matrices[i]); + { + if (old_ptrs[0] != nullptr) + data_center.cylinders.release(cylinder_paired_model_matrix{old_model_matrices[0]}); + if (old_ptrs[1] != nullptr) + data_center.planes.release(plane_paired_model_matrix{old_model_matrices[1]}); + if (old_ptrs[2] != nullptr) + data_center.planes.release(plane_paired_model_matrix{old_model_matrices[2]}); } } } // namespace internal \ No newline at end of file