Lagrange
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Modules Pages
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#include <openvdb/openvdb.h>
19#include <openvdb/tools/MeshToVolume.h>
20#include <Eigen/Dense>
21
22namespace lagrange {
23namespace volume {
24LAGRANGE_LEGACY_INLINE
25namespace legacy {
26
30template <typename MeshType>
32{
33 static_assert(MeshTrait<MeshType>::is_mesh(), "Input type is not Mesh");
34
35public:
42 MeshAdapter(const MeshType& mesh, const openvdb::math::Transform& transform)
43 : m_mesh(mesh)
44 , m_transform(transform)
45 {}
46
48 size_t polygonCount() const { return static_cast<size_t>(m_mesh.get_num_facets()); }
49
51 size_t pointCount() const { return static_cast<size_t>(m_mesh.get_num_vertices()); }
52
54 size_t vertexCount(size_t /*f*/) const
55 {
56 return static_cast<size_t>(m_mesh.get_vertex_per_facet());
57 }
58
66 void getIndexSpacePoint(size_t f, size_t lv, openvdb::Vec3d& pos) const
67 {
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);
72 }
73
74protected:
75 const MeshType& m_mesh;
76 const openvdb::math::Transform& m_transform;
77};
78
91template <typename MeshType, typename GridType = openvdb::FloatGrid>
92auto mesh_to_volume(const MeshType& mesh, double voxel_size) -> typename GridType::Ptr
93{
94 static_assert(MeshTrait<MeshType>::is_mesh(), "Input type is not Mesh");
95
96 openvdb::initialize();
97
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);
101
102 MeshAdapter<MeshType> adapter(mesh, *transform);
103 try {
104 return openvdb::tools::meshToVolume<GridType, MeshAdapter<MeshType>>(adapter, *transform);
105 } catch (openvdb::ArithmeticError&) {
106 logger().error("Voxel size too small: {}", voxel_size);
107 throw;
108 }
109}
110
111} // namespace legacy
112} // namespace volume
113} // namespace lagrange
Definition: Mesh.h:48
Adapter class to interface a Lagrange mesh with OpenVDB functions.
Definition: mesh_to_volume.h:32
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
Main namespace for Lagrange.
Definition: AABBIGL.h:30
MeshTrait class provide compiler check for different mesh types.
Definition: MeshTrait.h:108