NAP
meshutils.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "mesh.h"
9 #include "box.h"
10 #include "triangleiterator.h"
11 #include "renderglobals.h"
12 
13 // External Includes
14 #include <box.h>
15 
16 namespace nap
17 {
18  namespace utility
19  {
20  // Binds all the points to a set of triangular faces
21  using MeshConnectivityMap = std::vector<std::vector<Triangle>>;
22 
28  bool NAPAPI isTriangleMesh(const nap::MeshInstance& meshInstance);
29 
35  int NAPAPI getTriangleCount(const MeshInstance& meshInstance);
36 
43  glm::vec3 NAPAPI computeTriangleNormal(const TriangleData<glm::vec3>& vertices);
44 
55  void NAPAPI setTriangleIndices(nap::MeshShape& mesh, EDrawMode drawMode, int number, const std::array<int, 3>& indices);
56 
65  template<typename T>
66  void computeBoundingBox(const MeshInstance& mesh, math::Box& outBox);
67 
76  template<typename T>
78 
87  template<typename T>
88  void computeBoundingBox(const nap::MeshInstance& mesh, const nap::MeshShape& shape, math::Box& outBox);
89 
98  template<typename T>
100 
106  float NAPAPI computeBoundingSphere(const math::Box& box);
107 
116  void NAPAPI computeNormals(const nap::MeshInstance& mesh, const nap::VertexAttribute<glm::vec3>& vertices, nap::VertexAttribute<glm::vec3>& outNormals);
117 
125  void NAPAPI reverseWindingOrder(nap::MeshInstance& mesh);
126 
134  void NAPAPI generateIndices(nap::MeshShape& shape, int vertexCount, bool loop = false, int offset = 0);
135 
145  void NAPAPI computeConnectivity(const nap::MeshInstance& mesh, MeshConnectivityMap& outConnectivityMap);
146 
151  float NAPAPI computeTriangleArea(const TriangleData<glm::vec3>& vertices);
152 
161  float NAPAPI computeArea(nap::MeshInstance& mesh, const nap::VertexAttribute<glm::vec3>& vertices, std::vector<float>& outList);
162 
173  bool NAPAPI intersect(const glm::vec3& rayOrigin, const glm::vec3& rayDirection, const TriangleData<glm::vec3>& vertices, glm::vec3& outCoordinates);
174 
180  glm::vec3 NAPAPI computeBarycentric(const glm::vec3& point, const TriangleData<glm::vec3>& triangle);
181 
188  float NAPAPI computeCameraDistance(const glm::vec2& planeDimensions, float cameraFOV);
189 
196  float NAPAPI computeCameraDistance(float radius, float cameraFOV);
197 
204  template<typename T>
205  T interpolateVertexAttr(const TriangleData<T>& vertexValues, const glm::vec3& barycentricCoordinates);
206 
207 
209  // Template Definitions
211 
212  template<typename T>
213  T interpolateVertexAttr(const TriangleData<T>& vertexValues, const glm::vec3& coords)
214  {
215  return (vertexValues.first() * (1.0f - coords.x - coords.y)) + (vertexValues.second() * coords.x) + (vertexValues.third() * coords.y);
216  }
217 
218  template<typename T>
219  void computeBoundingBox(const MeshInstance& mesh, math::Box& outBox)
220  {
221  glm::vec3 min(math::max<float>());
222  glm::vec3 max(math::min<float>());
223 
224  const nap::VertexAttribute<T>& positions = mesh.getAttribute<T>(vertexid::position);
225  for (const auto& point : positions.getData())
226  {
227  if (point.x < min.x) { min.x = point.x; }
228  if (point.x > max.x) { max.x = point.x; }
229  if (point.y < min.y) { min.y = point.y; }
230  if (point.y > max.y) { max.y = point.y; }
231  if (point.z < min.z) { min.z = point.z; }
232  if (point.z > max.z) { max.z = point.z; }
233  }
234  outBox.mMinCoordinates = min;
235  outBox.mMaxCoordinates = max;
236  }
237 
238  template<typename T>
240  {
241  math::Box mesh_bounds;
242  computeBoundingBox<T>(mesh, mesh_bounds);
243  return mesh_bounds;
244  }
245 
246  template<typename T>
247  void computeBoundingBox(const nap::MeshInstance& mesh, const nap::MeshShape& shape, math::Box& outBox)
248  {
249  glm::vec3 min(math::max<float>());
250  glm::vec3 max(math::min<float>());
251 
252  const nap::VertexAttribute<T>& positions = mesh.getAttribute<T>(vertexid::position);
253  for (unsigned int i : shape.getIndices())
254  {
255  const auto& point = positions[i];
256  if (point.x < min.x) { min.x = point.x; }
257  if (point.x > max.x) { max.x = point.x; }
258  if (point.y < min.y) { min.y = point.y; }
259  if (point.y > max.y) { max.y = point.y; }
260  if (point.z < min.z) { min.z = point.z; }
261  if (point.z > max.z) { max.z = point.z; }
262  }
263  outBox.mMinCoordinates = min;
264  outBox.mMaxCoordinates = max;
265  }
266 
267  template<typename T>
269  {
270  math::Box box;
271  computeBoundingBox<T>(mesh, shape);
272  return box;
273  }
274  }
275 }
nap::math::Box::mMinCoordinates
glm::vec3 mMinCoordinates
Box min coordinates.
Definition: box.h:104
nap::utility::computeTriangleArea
float NAPAPI computeTriangleArea(const TriangleData< glm::vec3 > &vertices)
nap::utility::intersect
bool NAPAPI intersect(const glm::vec3 &rayOrigin, const glm::vec3 &rayDirection, const TriangleData< glm::vec3 > &vertices, glm::vec3 &outCoordinates)
nap::TriangleData::third
const T & third() const
Definition: triangleiterator.h:57
nap::MeshShape::getIndices
const std::vector< uint32 > & getIndices() const
Definition: mesh.h:101
nap::math::Box
Definition: box.h:20
nap::VertexAttribute< glm::vec3 >
nap::utility::computeConnectivity
void NAPAPI computeConnectivity(const nap::MeshInstance &mesh, MeshConnectivityMap &outConnectivityMap)
nap::utility::MeshConnectivityMap
std::vector< std::vector< Triangle > > MeshConnectivityMap
Definition: meshutils.h:21
nap::vertexid::position
constexpr const char * position
Default mesh position vertex attribute name.
Definition: renderglobals.h:75
nap::utility::setTriangleIndices
void NAPAPI setTriangleIndices(nap::MeshShape &mesh, EDrawMode drawMode, int number, const std::array< int, 3 > &indices)
nap::utility::computeBoundingSphere
float NAPAPI computeBoundingSphere(const math::Box &box)
nap::utility::computeArea
float NAPAPI computeArea(nap::MeshInstance &mesh, const nap::VertexAttribute< glm::vec3 > &vertices, std::vector< float > &outList)
nap::utility::computeBoundingBox
void computeBoundingBox(const MeshInstance &mesh, math::Box &outBox)
Definition: meshutils.h:219
nap::utility::computeTriangleNormal
glm::vec3 NAPAPI computeTriangleNormal(const TriangleData< glm::vec3 > &vertices)
nap::utility::interpolateVertexAttr
T interpolateVertexAttr(const TriangleData< T > &vertexValues, const glm::vec3 &barycentricCoordinates)
Definition: meshutils.h:213
nap::utility::isTriangleMesh
bool NAPAPI isTriangleMesh(const nap::MeshInstance &meshInstance)
nap::utility::computeCameraDistance
float NAPAPI computeCameraDistance(const glm::vec2 &planeDimensions, float cameraFOV)
nap::MeshInstance::getAttribute
VertexAttribute< T > & getAttribute(const std::string &id)
nap::TriangleData
Definition: triangleiterator.h:23
nap::utility::reverseWindingOrder
void NAPAPI reverseWindingOrder(nap::MeshInstance &mesh)
nap::VertexAttribute::getData
const std::vector< ELEMENTTYPE > & getData() const
Definition: vertexattribute.h:107
nap::MeshShape
Definition: mesh.h:71
nap::math::Box::mMaxCoordinates
glm::vec3 mMaxCoordinates
Box max coordinates.
Definition: box.h:105
nap
Definition: templateapp.h:17
nap::TriangleData::first
const T & first() const
Definition: triangleiterator.h:35
nap::utility::computeBarycentric
glm::vec3 NAPAPI computeBarycentric(const glm::vec3 &point, const TriangleData< glm::vec3 > &triangle)
nap::MeshInstance
Definition: mesh.h:196
nap::utility::getTriangleCount
int NAPAPI getTriangleCount(const MeshInstance &meshInstance)
nap::utility::generateIndices
void NAPAPI generateIndices(nap::MeshShape &shape, int vertexCount, bool loop=false, int offset=0)
nap::utility::computeNormals
void NAPAPI computeNormals(const nap::MeshInstance &mesh, const nap::VertexAttribute< glm::vec3 > &vertices, nap::VertexAttribute< glm::vec3 > &outNormals)
nap::TriangleData::second
const T & second() const
Definition: triangleiterator.h:46
nap::EDrawMode
EDrawMode
Definition: mesh.h:28