Compare commits

...

4 Commits

  1. 2
      frontend/src/solve.cpp
  2. 4
      network_process/include/post_topo/filter_polygon_faces.hpp
  3. 10
      network_process/src/post_topo/filter_polygon_faces.cpp
  4. 9
      network_process/src/post_topo/patch_propagation.cpp
  5. 2
      network_process/src/process.cpp

2
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<uint32_t>(output_vertices.size()); result.mesh.num_vertices = static_cast<uint32_t>(output_vertices.size());
result.mesh.num_faces = static_cast<uint32_t>(output_vertex_counts_of_face.size()); result.mesh.num_faces = static_cast<uint32_t>(output_vertex_counts_of_face.size());
vector3d* vertices = (vector3d*)mi_malloc(sizeof(vector3d) * result.mesh.num_vertices); 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); 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++) { 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); std::move(output_vertices[i].data(), output_vertices[i].data() + 3, &vertices[i].x);

4
network_process/include/post_topo/filter_polygon_faces.hpp

@ -13,4 +13,6 @@ dynamic_bitset_mp<> filter_polygon_faces(const stl_vector_mp<polygon_face_t>&
stl_vector_mp<uint32_t>& output_polygon_faces, stl_vector_mp<uint32_t>& output_polygon_faces,
stl_vector_mp<uint32_t>& output_vertex_counts_of_face); stl_vector_mp<uint32_t>& output_vertex_counts_of_face);
void filter_active_vertices(stl_vector_mp<Eigen::Vector3d>& vertices, stl_vector_mp<uint32_t>& output_polygon_faces); void filter_active_vertices(stl_vector_mp<Eigen::Vector3d>& iso_pts,
stl_vector_mp<Eigen::Vector3d>& vertices,
stl_vector_mp<uint32_t>& output_polygon_faces);

10
network_process/src/post_topo/filter_polygon_faces.cpp

@ -82,10 +82,12 @@ dynamic_bitset_mp<> filter_polygon_faces(const stl_vector_mp<polygon_face_t>&
return active_face_label; return active_face_label;
} }
void filter_active_vertices(stl_vector_mp<Eigen::Vector3d>& vertices, stl_vector_mp<uint32_t>& output_polygon_faces) void filter_active_vertices(stl_vector_mp<Eigen::Vector3d>& iso_pts,
stl_vector_mp<Eigen::Vector3d>& output_vertices,
stl_vector_mp<uint32_t>& output_polygon_faces)
{ {
stl_vector_mp<uint32_t> unique_vertex_indices{}; stl_vector_mp<uint32_t> 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) { for (const auto& vertex_index : output_polygon_faces) {
if (!vertex_visited[vertex_index]) { if (!vertex_visited[vertex_index]) {
unique_vertex_indices.emplace_back(vertex_index); unique_vertex_indices.emplace_back(vertex_index);
@ -102,6 +104,6 @@ void filter_active_vertices(stl_vector_mp<Eigen::Vector3d>& vertices, stl_vector
stl_vector_mp<Eigen::Vector3d> unique_vertices{}; stl_vector_mp<Eigen::Vector3d> unique_vertices{};
unique_vertices.reserve(unique_vertex_indices.size()); unique_vertices.reserve(unique_vertex_indices.size());
for (const auto& vertex_index : unique_vertex_indices) { unique_vertices.emplace_back(vertices[vertex_index]); } for (const auto& vertex_index : unique_vertex_indices) { unique_vertices.emplace_back(iso_pts[vertex_index]); }
std::swap(vertices, unique_vertices); std::swap(output_vertices, unique_vertices);
} }

9
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; const auto& other_cell_sign = stacked_nodes.top().cell_signs;
switch (iter->get_operation()) { switch (iter->get_operation()) {
case internal::eNodeOperation::unionOp: 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::intersectionOp: temp_info.cell_signs |= other_cell_sign; break;
case internal::eNodeOperation::differenceOp: case internal::eNodeOperation::differenceOp:
// stacked nodes are always left childs // stacked nodes are always left childs
temp_info.cell_signs.flip() &= other_cell_sign; temp_info.cell_signs.flip() |= other_cell_sign;
break; break;
default: throw std::runtime_error("ERROR: baked blobtree with unknown type operation node"); 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.size() == 1);
assert(stacked_nodes.top().parent_index == 0xFFFFFFFF); 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();
} }

2
network_process/src/process.cpp

@ -159,7 +159,7 @@ ISNP_API void build_implicit_network_by_blobtree(const s_settings&
active_cell_label, active_cell_label,
output_polygon_faces, output_polygon_faces,
output_vertex_counts_of_face); output_vertex_counts_of_face);
filter_active_vertices(output_vertices, output_polygon_faces); filter_active_vertices(iso_pts, output_vertices, output_polygon_faces);
} }
} }
} }
Loading…
Cancel
Save