14#include <lagrange/Logger.h>
15#include <lagrange/MeshTrait.h>
16#include <lagrange/legacy/inline.h>
19#include <lagrange/utils/warnoff.h>
20#include <openvdb/openvdb.h>
21#include <openvdb/tools/MeshToVolume.h>
22#include <lagrange/utils/warnon.h>
35template <
typename MeshType>
38 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
47 MeshAdapter(
const MeshType& mesh,
const openvdb::math::Transform& transform)
49 , m_transform(transform)
53 size_t polygonCount()
const {
return static_cast<size_t>(m_mesh.get_num_facets()); }
56 size_t pointCount()
const {
return static_cast<size_t>(m_mesh.get_num_vertices()); }
61 return static_cast<size_t>(m_mesh.get_vertex_per_facet());
73 Eigen::RowVector3d p =
74 m_mesh.get_vertices().row(m_mesh.get_facets()(f, lv)).template
cast<double>();
75 pos = openvdb::Vec3d(p.x(), p.y(), p.z());
76 pos = m_transform.worldToIndex(pos);
80 const MeshType& m_mesh;
81 const openvdb::math::Transform& m_transform;
96template <
typename MeshType,
typename Gr
idType = openvdb::FloatGr
id>
97auto mesh_to_volume(
const MeshType& mesh,
double voxel_size) ->
typename GridType::Ptr
99 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
101 openvdb::initialize();
103 const openvdb::Vec3d offset(voxel_size / 2.0, voxel_size / 2.0, voxel_size / 2.0);
104 auto transform = openvdb::math::Transform::createLinearTransform(voxel_size);
105 transform->postTranslate(offset);
107 MeshAdapter<MeshType> adapter(mesh, *transform);
109 return openvdb::tools::meshToVolume<GridType, MeshAdapter<MeshType>>(adapter, *transform);
110 }
catch (openvdb::ArithmeticError&) {
111 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:59
size_t polygonCount() const
Number of mesh facets.
Definition mesh_to_volume.h:53
size_t pointCount() const
Number of mesh vertices.
Definition mesh_to_volume.h:56
MeshAdapter(const MeshType &mesh, const openvdb::math::Transform &transform)
Constructs a new instance.
Definition mesh_to_volume.h:47
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:71
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.