14#include <lagrange/Logger.h>
15#include <lagrange/MeshTrait.h>
16#include <lagrange/legacy/inline.h>
18#include <openvdb/openvdb.h>
19#include <openvdb/tools/MeshToVolume.h>
30template <
typename MeshType>
33 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
42 MeshAdapter(
const MeshType& mesh,
const openvdb::math::Transform& transform)
44 , m_transform(transform)
48 size_t polygonCount()
const {
return static_cast<size_t>(m_mesh.get_num_facets()); }
51 size_t pointCount()
const {
return static_cast<size_t>(m_mesh.get_num_vertices()); }
56 return static_cast<size_t>(m_mesh.get_vertex_per_facet());
68 Eigen::RowVector3d p =
69 m_mesh.get_vertices().row(m_mesh.get_facets()(f, lv)).template
cast<double>();
70 pos = openvdb::Vec3d(p.x(), p.y(), p.z());
71 pos = m_transform.worldToIndex(pos);
75 const MeshType& m_mesh;
76 const openvdb::math::Transform& m_transform;
91template <
typename MeshType,
typename Gr
idType = openvdb::FloatGr
id>
92auto mesh_to_volume(
const MeshType& mesh,
double voxel_size) ->
typename GridType::Ptr
94 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
96 openvdb::initialize();
98 const openvdb::Vec3d offset(voxel_size / 2.0, voxel_size / 2.0, voxel_size / 2.0);
99 auto transform = openvdb::math::Transform::createLinearTransform(voxel_size);
100 transform->postTranslate(offset);
102 MeshAdapter<MeshType> adapter(mesh, *transform);
104 return openvdb::tools::meshToVolume<GridType, MeshAdapter<MeshType>>(adapter, *transform);
105 }
catch (openvdb::ArithmeticError&) {
106 logger().error(
"Voxel size too small: {}", voxel_size);
size_t vertexCount(size_t) const
Number of vertices for a given facet.
Definition mesh_to_volume.h:54
size_t polygonCount() const
Number of mesh facets.
Definition mesh_to_volume.h:48
size_t pointCount() const
Number of mesh vertices.
Definition mesh_to_volume.h:51
MeshAdapter(const MeshType &mesh, const openvdb::math::Transform &transform)
Constructs a new instance.
Definition mesh_to_volume.h:42
void getIndexSpacePoint(size_t f, size_t lv, openvdb::Vec3d &pos) const
Return a vertex position in the grid index space.
Definition mesh_to_volume.h:66
LA_CORE_API spdlog::logger & logger()
Retrieves the current logger.
Definition Logger.cpp:40
SurfaceMesh< ToScalar, ToIndex > cast(const SurfaceMesh< FromScalar, FromIndex > &source_mesh, const AttributeFilter &convertible_attributes={}, std::vector< std::string > *converted_attributes_names=nullptr)
Cast a mesh to a mesh of different scalar and/or index type.
Main namespace for Lagrange.