You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
2.3 KiB

#include <solve.h>
#include <implicit_surface_network_solver.hpp>
EXTERN_C_BEGIN
API implicit_network_solver* create_solver(const baked_blobtree_t* tree, const s_settings settings) noexcept
{
void* res = mi_malloc(sizeof(implicit_network_solver));
::new (res) implicit_network_solver(tree, settings);
return (implicit_network_solver*)res;
}
API void destroy_solver(implicit_network_solver* solver) noexcept
{
if (solver == nullptr) return;
solver->~implicit_network_solver();
mi_free(solver);
}
API primitive_generation_result_t generate_polymesh(implicit_network_solver* solver)
{
primitive_generation_result_t result{};
if (solver == nullptr) return result;
// generate polymesh
stl_vector_mp<Eigen::Vector3d> output_vertices{};
stl_vector_mp<uint32_t> output_polygon_faces{};
stl_vector_mp<uint32_t> output_vertex_counts_of_face{};
solver->generate_polymesh(output_vertices, output_polygon_faces, output_vertex_counts_of_face);
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());
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* 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);
}
std::move(output_polygon_faces.begin(), output_polygon_faces.end(), faces);
std::move(output_vertex_counts_of_face.begin(), output_vertex_counts_of_face.end(), vertex_counts);
result.mesh.vertices = vertices;
result.mesh.faces = faces;
result.mesh.vertex_counts = vertex_counts;
// check success
result.success = (result.mesh.num_vertices > 0 && result.mesh.num_faces > 0);
return result;
}
API void print_statistics(const implicit_network_solver* solver)
{
if (solver == nullptr) return;
solver->m_timers.print();
}
API void clear_statistics(implicit_network_solver* solver)
{
if (solver == nullptr) return;
solver->m_timers.clear();
}
EXTERN_C_END