Lagrange
Loading...
Searching...
No Matches
mesh_to_volume.h
1/*
2 * Copyright 2021 Adobe. All rights reserved.
3 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License. You may obtain a copy
5 * of the License at http://www.apache.org/licenses/LICENSE-2.0
6 *
7 * Unless required by applicable law or agreed to in writing, software distributed under
8 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9 * OF ANY KIND, either express or implied. See the License for the specific language
10 * governing permissions and limitations under the License.
11 */
12#pragma once
13
14#include <lagrange/Logger.h>
15#include <lagrange/MeshTrait.h>
16#include <lagrange/legacy/inline.h>
17
18// clang-format off
19#include <lagrange/utils/warnoff.h>
20#include <openvdb/openvdb.h>
21#include <openvdb/tools/MeshToVolume.h>
22#include <lagrange/utils/warnon.h>
23// clang-format on
24
25#include <Eigen/Dense>
26
27namespace lagrange {
28namespace volume {
29LAGRANGE_LEGACY_INLINE
30namespace legacy {
31
35template <typename MeshType>
37{
38 static_assert(MeshTrait<MeshType>::is_mesh(), "Input type is not Mesh");
39
40public:
47 MeshAdapter(const MeshType& mesh, const openvdb::math::Transform& transform)
48 : m_mesh(mesh)
49 , m_transform(transform)
50 {}
51
53 size_t polygonCount() const { return static_cast<size_t>(m_mesh.get_num_facets()); }
54
56 size_t pointCount() const { return static_cast<size_t>(m_mesh.get_num_vertices()); }
57
59 size_t vertexCount(size_t /*f*/) const
60 {
61 return static_cast<size_t>(m_mesh.get_vertex_per_facet());
62 }
63
71 void getIndexSpacePoint(size_t f, size_t lv, openvdb::Vec3d& pos) const
72 {
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);
77 }
78
79protected:
80 const MeshType& m_mesh;
81 const openvdb::math::Transform& m_transform;
82};
83
96template <typename MeshType, typename GridType = openvdb::FloatGrid>
97auto mesh_to_volume(const MeshType& mesh, double voxel_size) -> typename GridType::Ptr
98{
99 static_assert(MeshTrait<MeshType>::is_mesh(), "Input type is not Mesh");
100
101 openvdb::initialize();
102
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);
106
107 MeshAdapter<MeshType> adapter(mesh, *transform);
108 try {
109 return openvdb::tools::meshToVolume<GridType, MeshAdapter<MeshType>>(adapter, *transform);
110 } catch (openvdb::ArithmeticError&) {
111 logger().error("Voxel size too small: {}", voxel_size);
112 throw;
113 }
114}
115
116} // namespace legacy
117} // namespace volume
118} // namespace lagrange
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.