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 <utility/dllexport.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>
77  void computeBoundingBox(const nap::MeshInstance& mesh, const nap::MeshShape& shape, math::Box& outBox);
78 
87  void NAPAPI computeNormals(const nap::MeshInstance& mesh, const nap::VertexAttribute<glm::vec3>& vertices, nap::VertexAttribute<glm::vec3>& outNormals);
88 
96  void NAPAPI reverseWindingOrder(nap::MeshInstance& mesh);
97 
105  void NAPAPI generateIndices(nap::MeshShape& shape, int vertexCount, bool loop = false, int offset = 0);
106 
116  void NAPAPI computeConnectivity(const nap::MeshInstance& mesh, MeshConnectivityMap& outConnectivityMap);
117 
122  float NAPAPI computeTriangleArea(const TriangleData<glm::vec3>& vertices);
123 
132  float NAPAPI computeArea(nap::MeshInstance& mesh, const nap::VertexAttribute<glm::vec3>& vertices, std::vector<float>& outList);
133 
144  bool NAPAPI intersect(const glm::vec3& rayOrigin, const glm::vec3& rayDirection, const TriangleData<glm::vec3>& vertices, glm::vec3& outCoordinates);
145 
151  glm::vec3 NAPAPI computeBarycentric(const glm::vec3& point, const TriangleData<glm::vec3>& triangle);
152 
159  template<typename T>
160  T interpolateVertexAttr(const TriangleData<T>& vertexValues, const glm::vec3& barycentricCoordinates);
161 
162 
164  // Template Definitions
166 
167  template<typename T>
168  T interpolateVertexAttr(const TriangleData<T>& vertexValues, const glm::vec3& coords)
169  {
170  return (vertexValues.first() * (1.0f - coords.x - coords.y)) + (vertexValues.second() * coords.x) + (vertexValues.third() * coords.y);
171  }
172 
173  template <typename T>
174  void computeBoundingBox(const MeshInstance& mesh, math::Box& outBox)
175  {
176  glm::vec3 min(math::max<float>());
177  glm::vec3 max(math::min<float>());
178 
179  const nap::VertexAttribute<T>& positions = mesh.getAttribute<T>(vertexid::position);
180  for (const auto& point : positions.getData())
181  {
182  if (point.x < min.x) { min.x = point.x; }
183  if (point.x > max.x) { max.x = point.x; }
184  if (point.y < min.y) { min.y = point.y; }
185  if (point.y > max.y) { max.y = point.y; }
186  if (point.z < min.z) { min.z = point.z; }
187  if (point.z > max.z) { max.z = point.z; }
188  }
189  outBox.mMinCoordinates = min;
190  outBox.mMaxCoordinates = max;
191  }
192 
193  template <typename T>
194  void computeBoundingBox(const nap::MeshInstance& mesh, const nap::MeshShape& shape, math::Box& outBox)
195  {
196  glm::vec3 min(math::max<float>());
197  glm::vec3 max(math::min<float>());
198 
199  const nap::VertexAttribute<T>& positions = mesh.getAttribute<T>(vertexid::position);
200  for (unsigned int i : shape.getIndices())
201  {
202  const auto& point = positions[i];
203  if (point.x < min.x) { min.x = point.x; }
204  if (point.x > max.x) { max.x = point.x; }
205  if (point.y < min.y) { min.y = point.y; }
206  if (point.y > max.y) { max.y = point.y; }
207  if (point.z < min.z) { min.z = point.z; }
208  if (point.z > max.z) { max.z = point.z; }
209  }
210  outBox.mMinCoordinates = min;
211  outBox.mMaxCoordinates = max;
212  }
213  }
214 }
nap::math::Box::mMinCoordinates
glm::vec3 mMinCoordinates
Box min coordinates.
Definition: box.h:98
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::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:174
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:168
nap::utility::isTriangleMesh
bool NAPAPI isTriangleMesh(const nap::MeshInstance &meshInstance)
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:95
nap::MeshShape
Definition: mesh.h:71
nap::math::Box::mMaxCoordinates
glm::vec3 mMaxCoordinates
Box max coordinates.
Definition: box.h:99
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