NAP
triangleiterator.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 #include <utility/dllexport.h>
8 #include <vertexattribute.h>
9 #include <mesh.h>
10 #include <glm/glm.hpp>
11 #include <array>
12 
13 namespace nap
14 {
15  class MeshInstance;
16  class MeshShape;
17 
22  template<class T>
24  {
25  public:
26  TriangleData(const T& first, const T& second, const T& third) :
27  mData({{first, second, third }} )
28  { }
29 
30  TriangleData() = default;
31 
35  inline const T& first() const { return mData[0]; }
36 
41  inline void setFirst(const T& data) { mData[0] = data; }
42 
46  inline const T& second() const { return mData[1]; }
47 
52  inline void setSecond(const T& data) { mData[1] = data; }
53 
57  inline const T& third() const { return mData[2]; }
58 
63  inline void setThird(const T& data) const { mData[2] = data; }
64 
70  T& operator[](std::size_t index) { return mData[index]; }
71 
77  const T& operator[](std::size_t index) const { return mData[index]; }
78 
79  private:
80  std::array<T, 3> mData;
81  };
82 
83 
88  {
89  public:
90  using IndexArray = std::array<int, 3>;
91 
92  ShapeTriangle(int triangleIndex, int index0, int index1, int index2);
93 
97  int getTriangleIndex() const { return mTriangleIndex; }
98 
102  IndexArray indices() const { return mIndices; }
103 
107  int firstIndex() const { return mIndices[0]; }
108 
112  int secondIndex() const { return mIndices[1]; }
113 
117  int thirdIndex() const { return mIndices[2]; }
118 
122  int operator[](std::size_t index) const { return mIndices[index]; }
123 
124  IndexArray::const_iterator begin() { return mIndices.begin(); }
125  IndexArray::const_iterator end() { return mIndices.end(); }
126 
132  template<class T>
134  {
135  return TriangleData<T>(attribute[mIndices[0]], attribute[mIndices[1]], attribute[mIndices[2]]);
136  }
137 
145  template<class T>
146  void setVertexData(VertexAttribute<T>& attribute, const T& firstValue, const T& secondValue, const T& thirdValue)
147  {
148  attribute[mIndices[0]] = firstValue;
149  attribute[mIndices[1]] = secondValue;
150  attribute[mIndices[2]] = thirdValue;
151  }
152 
157  template<class T>
158  void setVertexData(VertexAttribute<T>& attribute, const T& value)
159  {
160  setVertexData(attribute, value, value, value);
161  }
162 
167  template<class T>
168  void setVertexData(VertexAttribute<T>& attribute, const TriangleData<T>& value)
169  {
170  setVertexData(value[0], value[1], value[2]);
171  }
172 
173  private:
174  IndexArray mIndices;
175  int mTriangleIndex;
176  };
177 
178 
183  class Triangle : public ShapeTriangle
184  {
185  public:
189  int getShapeIndex() const { return mShapeIndex; }
190 
191  private:
192  friend class TriangleIterator;
193 
194  Triangle(int shapeIndex, const ShapeTriangle& shapeTriangle);
195 
196  private:
197  int mShapeIndex;
198  };
199 
200 
206  {
207  public:
208  ShapeTriangleIterator(const MeshShape& shape, int startIndex);
210 
215  bool isDone() const { return mCurrentIndex >= mIndexEnd; }
216 
221  virtual const ShapeTriangle next() = 0;
222 
223  protected:
225  int mCurrentTriangle = 0;
226 
227  private:
228  const uint32* mIndexEnd;
229  };
230 
231 
236  {
237  public:
238  ShapeTriangleListIterator(const MeshShape& shape);
239 
244  virtual const ShapeTriangle next() override;
245  };
246 
247 
252  {
253  public:
254  ShapeTriangleFanIterator(const MeshShape& shape);
255 
260  virtual const ShapeTriangle next() override;
261 
262  private:
263  uint32 mFanStartIndex;
264  };
265 
266 
271  {
272  public:
274 
279  virtual const ShapeTriangle next() override;
280  };
281 
289  class NAPAPI TriangleIterator final
290  {
291  public:
292  TriangleIterator(const MeshInstance& meshInstance);
293  ~TriangleIterator();
294 
299  bool isDone() const { return mCurIterator == nullptr; }
300 
305  const Triangle next();
306 
307  private:
311  void advanceToNextShape();
312 
313  private:
314  const MeshInstance* mMeshInstance;
315  ShapeTriangleIterator* mCurIterator;
316  int mCurShapeIndex;
317  };
318 }
nap::ShapeTriangleIterator::isDone
bool isDone() const
Definition: triangleiterator.h:215
nap::TriangleData::setSecond
void setSecond(const T &data)
Definition: triangleiterator.h:52
nap::TriangleData::operator[]
const T & operator[](std::size_t index) const
Definition: triangleiterator.h:77
nap::TriangleData::third
const T & third() const
Definition: triangleiterator.h:57
nap::VertexAttribute
Definition: vertexattribute.h:65
nap::ShapeTriangleIterator::mCurrentIndex
const uint32 * mCurrentIndex
The current position in the index buffer of the shape that we're iterating through.
Definition: triangleiterator.h:224
nap::TriangleData::setThird
void setThird(const T &data) const
Definition: triangleiterator.h:63
nap::TriangleData::TriangleData
TriangleData(const T &first, const T &second, const T &third)
Definition: triangleiterator.h:26
nap::ShapeTriangle::operator[]
int operator[](std::size_t index) const
Definition: triangleiterator.h:122
nap::ShapeTriangle::end
IndexArray::const_iterator end()
Definition: triangleiterator.h:125
nap::ShapeTriangle::ShapeTriangle
ShapeTriangle(int triangleIndex, int index0, int index1, int index2)
nap::ShapeTriangle::firstIndex
int firstIndex() const
Definition: triangleiterator.h:107
nap::TriangleIterator::isDone
bool isDone() const
Definition: triangleiterator.h:299
nap::ShapeTriangle::begin
IndexArray::const_iterator begin()
Definition: triangleiterator.h:124
nap::uint32
uint32_t uint32
Definition: numeric.h:20
nap::ShapeTriangle::setVertexData
void setVertexData(VertexAttribute< T > &attribute, const T &firstValue, const T &secondValue, const T &thirdValue)
Definition: triangleiterator.h:146
nap::Triangle::getShapeIndex
int getShapeIndex() const
Definition: triangleiterator.h:189
nap::ShapeTriangleFanIterator
Definition: triangleiterator.h:251
nap::TriangleData
Definition: triangleiterator.h:23
nap::ShapeTriangle::thirdIndex
int thirdIndex() const
Definition: triangleiterator.h:117
nap::TriangleData::operator[]
T & operator[](std::size_t index)
Definition: triangleiterator.h:70
nap::ShapeTriangle::IndexArray
std::array< int, 3 > IndexArray
Definition: triangleiterator.h:90
nap::ShapeTriangle::indices
IndexArray indices() const
Definition: triangleiterator.h:102
nap::ShapeTriangleIterator
Definition: triangleiterator.h:205
nap::ShapeTriangleListIterator
Definition: triangleiterator.h:235
nap::MeshShape
Definition: mesh.h:71
nap::ShapeTriangle::getVertexData
TriangleData< T > getVertexData(const VertexAttribute< T > &attribute) const
Definition: triangleiterator.h:133
nap::TriangleData::setFirst
void setFirst(const T &data)
Definition: triangleiterator.h:41
nap::ShapeTriangle::setVertexData
void setVertexData(VertexAttribute< T > &attribute, const TriangleData< T > &value)
Definition: triangleiterator.h:168
nap::Triangle
Definition: triangleiterator.h:183
nap
Definition: templateapp.h:17
nap::ShapeTriangleStripIterator
Definition: triangleiterator.h:270
nap::TriangleData::first
const T & first() const
Definition: triangleiterator.h:35
nap::ShapeTriangle::getTriangleIndex
int getTriangleIndex() const
Definition: triangleiterator.h:97
nap::ShapeTriangle::setVertexData
void setVertexData(VertexAttribute< T > &attribute, const T &value)
Definition: triangleiterator.h:158
nap::MeshInstance
Definition: mesh.h:196
nap::TriangleData::second
const T & second() const
Definition: triangleiterator.h:46
nap::TriangleData::TriangleData
TriangleData()=default
nap::TriangleIterator
Definition: triangleiterator.h:289
nap::ShapeTriangle::secondIndex
int secondIndex() const
Definition: triangleiterator.h:112
nap::ShapeTriangleIterator::~ShapeTriangleIterator
virtual ~ShapeTriangleIterator()
Definition: triangleiterator.h:209
nap::ShapeTriangle
Definition: triangleiterator.h:87