Saga3D API Documentation  1.0-RC4
IMeshBuffer.h
Go to the documentation of this file.
1 #ifndef __I_MESH_BUFFER_H_INCLUDED__
2 #define __I_MESH_BUFFER_H_INCLUDED__
3 
4 #include "aabbox3d.h"
5 #include "S3DVertex.h"
6 #include "EPrimitiveTypes.h"
7 #include "EIndexType.h"
8 #include "SPipeline.h"
9 #include "SIndirectBuffer.h"
10 #include <vector>
11 
12 namespace saga
13 {
14 
15 namespace video
16 {
17  class IVideoDriver;
18 }
19 
20 namespace scene
21 {
22  using MeshBufferID = std::uint32_t;
23 
25 
44  {
45  public:
46  virtual ~IMeshBuffer() {}
47 
48  virtual bool isGPUBuffer() const = 0;
49 
51 
52  virtual std::uint64_t getID() const = 0;
53 
55 
56  virtual void buildBuffer(video::IVideoDriver& driver, const video::PipelineHandle pipeline) = 0;
57 
59 
60  virtual const void* getData(const video::PipelineHandle pipeline) const = 0;
61 
63 
64  virtual std::size_t getSize(const video::PipelineHandle pipeline) const = 0;
65 
67 
69  virtual void* getVertices() = 0;
70 
72  virtual void setVertexCount(const size_t count) = 0;
73 
75 
76  virtual std::size_t getVertexCount() const = 0;
77 
79 
80  virtual const std::uint32_t* getIndices() const = 0;
81 
83 
84  virtual std::uint32_t* getIndices() = 0;
85 
87 
88  virtual std::uint32_t getIndexCount() const = 0;
89 
91  virtual void setIndexCount(const std::uint32_t count) = 0;
92 
94 
95  virtual const core::aabbox3df& getBoundingBox() const = 0;
96 
98 
100  virtual void setBoundingBox(const core::aabbox3df& box) = 0;
101 
103  virtual void recalculateBoundingBox() = 0;
104 
106  virtual const glm::vec3& getPosition(std::uint32_t i) const = 0;
107 
109  virtual const glm::vec3& getNormal(std::uint32_t i) const = 0;
110 
112  virtual const glm::vec2& getTCoords(std::uint32_t i) const = 0;
113 
115  virtual const glm::vec3& getTangent(std::uint32_t i) const = 0;
116 
118  virtual const glm::vec3& getBiTangent(std::uint32_t i) const = 0;
119 
121  virtual std::uint32_t getIndex(std::size_t offset) const = 0;
122 
124 
127  virtual void append(std::vector<S3DVertex>&& vertices, std::vector<uint32_t>&& indices) = 0;
128 
130 
132  virtual void append(const IMeshBuffer* const other) = 0;
133 
135 
139  virtual void appendAttribute(const char* buffer, const size_t size, const size_t stride) = 0;
140 
142 
147  {
148  PrimitiveType = type;
149  }
150 
153  {
154  return PrimitiveType;
155  }
156 
159  {
160  return IndexType;
161  }
162 
164  void setIndexType(const E_INDEX_TYPE type)
165  {
166  IndexType = type;
167  }
168 
170  void setInstanceCount(const size_t count)
171  {
172  InstanceCount = count;
173  }
174 
176  std::size_t getInstanceCount() const
177  {
178  return InstanceCount;
179  }
180 
182  void setBindingLocation(const int binding)
183  {
184  Binding = binding;
185  }
186 
188  int getBindingLocation() const
189  {
190  return Binding;
191  }
192 
193  void isNull(const bool null)
194  {
195  IsNull = null;
196  }
197 
198  bool isNull() const
199  {
200  return IsNull;
201  }
202 
204  virtual std::uint32_t getPrimitiveCount() const
205  {
206  std::uint32_t indexCount = getIndexCount();
207  switch (getPrimitiveType())
208  {
209  case scene::E_PRIMITIVE_TYPE::POINTS: return indexCount;
210  case scene::E_PRIMITIVE_TYPE::LINE_STRIP: return indexCount-1;
211  case scene::E_PRIMITIVE_TYPE::LINE_LOOP: return indexCount;
212  case scene::E_PRIMITIVE_TYPE::LINES: return indexCount/2;
213  case scene::E_PRIMITIVE_TYPE::TRIANGLE_STRIP: return (indexCount-2);
214  case scene::E_PRIMITIVE_TYPE::TRIANGLE_FAN: return (indexCount-2);
215  case scene::E_PRIMITIVE_TYPE::TRIANGLES: return indexCount/3;
216  case scene::E_PRIMITIVE_TYPE::QUAD_STRIP: return (indexCount-2)/2;
217  case scene::E_PRIMITIVE_TYPE::QUADS: return indexCount/4;
218  case scene::E_PRIMITIVE_TYPE::POLYGON: return indexCount; // (not really primitives, that would be 1, works like line_strip)
219  case scene::E_PRIMITIVE_TYPE::POINT_SPRITES: return indexCount;
220  }
221  return 0;
222  }
223 
224  bool useIndirectDraw() const
225  {
227  }
228 
229  auto indirectDrawBuffer() const
230  {
231  return IndirectDrawBuffer;
232  }
233 
235  {
236  IndirectDrawBuffer = buffer;
237  }
238 
240  {
242  }
243 
245  {
247  }
248 
250  {
251  IndexedIndirectDrawBuffer = buffer;
252  }
253 
254  protected:
257 
260 
262  std::size_t InstanceCount = 1;
263 
265  int Binding = 0;
266 
268  bool IsNull = false;
269 
272 
275 
277  };
278 
279 } // namespace scene
280 } // namespace saga
281 
282 #endif
saga::scene::IMeshBuffer::getBiTangent
virtual const glm::vec3 & getBiTangent(std::uint32_t i) const =0
returns bi-tangent of vertex i
saga::scene::IMeshBuffer::setPrimitiveType
void setPrimitiveType(scene::E_PRIMITIVE_TYPE type)
Describe what kind of primitive geometry is used by the meshbuffer.
Definition: IMeshBuffer.h:146
saga::scene::IMeshBuffer::setVertexCount
virtual void setVertexCount(const size_t count)=0
Set number of vertices.
saga::scene::E_PRIMITIVE_TYPE::POINTS
@ POINTS
All vertices are non-connected points.
saga::scene::E_PRIMITIVE_TYPE::LINE_LOOP
@ LINE_LOOP
Just as LINE_STRIP, but the last and the first vertex is also connected.
saga::video::NULL_GPU_RESOURCE_HANDLE
constexpr SGPUResource::HandleType NULL_GPU_RESOURCE_HANDLE
Definition: SGPUResource.h:17
saga::scene::IMeshBuffer::getData
virtual const void * getData(const video::PipelineHandle pipeline) const =0
Get pointer to GPU staging buffer.
saga::scene::E_PRIMITIVE_TYPE::TRIANGLES
@ TRIANGLES
Explicitly set all vertices for each triangle.
saga::scene::IMeshBuffer::getBoundingBox
virtual const core::aabbox3df & getBoundingBox() const =0
Get the axis aligned bounding box of this meshbuffer.
saga::scene::IMeshBuffer::IndexType
E_INDEX_TYPE IndexType
Definition: IMeshBuffer.h:276
saga::scene::IMeshBuffer::setIndexedIndirectDrawBuffer
void setIndexedIndirectDrawBuffer(const video::IndexedIndirectBufferHandle buffer)
Definition: IMeshBuffer.h:249
saga::scene::IMeshBuffer::setBindingLocation
void setBindingLocation(const int binding)
Set buffer binding location.
Definition: IMeshBuffer.h:182
EIndexType.h
saga::scene::IMeshBuffer::getIndices
virtual const std::uint32_t * getIndices() const =0
Get access to indices.
saga::scene::IMeshBuffer::isGPUBuffer
virtual bool isGPUBuffer() const =0
saga::scene::IMeshBuffer::PrimitiveType
scene::E_PRIMITIVE_TYPE PrimitiveType
Primitive type used for rendering (triangles, lines, ...)
Definition: IMeshBuffer.h:259
saga::video::PipelineHandle
SGPUResource::HandleType PipelineHandle
Definition: SPipeline.h:27
saga::scene::IMeshBuffer::appendAttribute
virtual void appendAttribute(const char *buffer, const size_t size, const size_t stride)=0
Append the custom attribute buffer to the current mesh buffer.
saga::scene::IMeshBuffer::getTangent
virtual const glm::vec3 & getTangent(std::uint32_t i) const =0
returns tangent of vertex i
saga::scene::IMeshBuffer::getBindingLocation
int getBindingLocation() const
Get buffer binding location.
Definition: IMeshBuffer.h:188
saga::scene::IMeshBuffer::isNull
void isNull(const bool null)
Definition: IMeshBuffer.h:193
saga::scene::E_PRIMITIVE_TYPE::POINT_SPRITES
@ POINT_SPRITES
The single vertices are expanded to quad billboards on the GPU.
saga::scene::IMeshBuffer::append
virtual void append(std::vector< S3DVertex > &&vertices, std::vector< uint32_t > &&indices)=0
Append the vertices and indices to the current buffer.
saga::scene::IMeshBuffer::useIndirectDraw
bool useIndirectDraw() const
Definition: IMeshBuffer.h:224
saga::video::IndirectBufferHandle
SGPUResource::HandleType IndirectBufferHandle
Definition: SIndirectBuffer.h:27
saga::scene::IMeshBuffer::getTCoords
virtual const glm::vec2 & getTCoords(std::uint32_t i) const =0
returns texture coord of vertex i
saga::scene::E_PRIMITIVE_TYPE::TRIANGLE_FAN
@ TRIANGLE_FAN
saga::scene::IMeshBuffer::~IMeshBuffer
virtual ~IMeshBuffer()
Definition: IMeshBuffer.h:46
saga::scene::IMeshBuffer::IndirectDrawBuffer
video::IndirectBufferHandle IndirectDrawBuffer
Indirect draw command buffer for this mesh buffer.
Definition: IMeshBuffer.h:271
saga::scene::IMeshBuffer::getIndexType
E_INDEX_TYPE getIndexType() const
Get index type.
Definition: IMeshBuffer.h:158
saga::scene::IMeshBuffer
Struct for holding a mesh with a single material.
Definition: IMeshBuffer.h:43
aabbox3d.h
saga::scene::E_PRIMITIVE_TYPE::QUADS
@ QUADS
saga::scene::IMeshBuffer::getID
virtual std::uint64_t getID() const =0
Returns internal ID to identify mesh buffer.
saga::video::IndexedIndirectBufferHandle
SGPUResource::HandleType IndexedIndirectBufferHandle
Definition: SIndirectBuffer.h:28
saga::scene::IMeshBuffer::buildBuffer
virtual void buildBuffer(video::IVideoDriver &driver, const video::PipelineHandle pipeline)=0
Generate GPU-compatible data.
saga::scene::IMeshBuffer::getInstanceCount
std::size_t getInstanceCount() const
Get buffer binding location.
Definition: IMeshBuffer.h:176
SIndirectBuffer.h
saga::scene::IMeshBuffer::setBoundingBox
virtual void setBoundingBox(const core::aabbox3df &box)=0
Set axis aligned bounding box.
saga::scene::IMeshBuffer::getVertices
virtual void * getVertices()=0
Get access to vertex data. The data is an array of vertices.
saga::scene::IMeshBuffer::setIndirectDrawBuffer
void setIndirectDrawBuffer(const video::IndirectBufferHandle buffer)
Definition: IMeshBuffer.h:234
saga::scene::IMeshBuffer::Binding
int Binding
Binding location.
Definition: IMeshBuffer.h:265
saga::scene::IMeshBuffer::useIndexedIndirectDraw
bool useIndexedIndirectDraw() const
Definition: IMeshBuffer.h:239
saga::video::IVideoDriver
Definition: IVideoDriver.h:68
saga::core::aabbox3d< float >
saga::scene::E_PRIMITIVE_TYPE::TRIANGLE_STRIP
@ TRIANGLE_STRIP
saga::scene::IMeshBuffer::setIndexCount
virtual void setIndexCount(const std::uint32_t count)=0
Set number of indices.
saga::scene::IMeshBuffer::getVertexCount
virtual std::size_t getVertexCount() const =0
Get amount of vertices in meshbuffer.
saga::scene::E_PRIMITIVE_TYPE::LINES
@ LINES
Every two vertices are connected creating n/2 lines.
S3DVertex.h
saga::scene::IMeshBuffer::recalculateBoundingBox
virtual void recalculateBoundingBox()=0
Recalculates the bounding box. Should be called if the mesh changed.
saga::scene::IMeshBuffer::getPrimitiveCount
virtual std::uint32_t getPrimitiveCount() const
Calculate how many geometric primitives are used by this meshbuffer.
Definition: IMeshBuffer.h:204
saga::scene::IMeshBuffer::IndexedIndirectDrawBuffer
video::IndexedIndirectBufferHandle IndexedIndirectDrawBuffer
Indexed indirect draw command buffer for this mesh buffer.
Definition: IMeshBuffer.h:274
saga::scene::IMeshBuffer::InstanceCount
std::size_t InstanceCount
Instance count for rendering multiple objects with this buffer.
Definition: IMeshBuffer.h:262
saga::scene::IMeshBuffer::IsNull
bool IsNull
Is a null buffer?
Definition: IMeshBuffer.h:268
saga::scene::E_PRIMITIVE_TYPE::LINE_STRIP
@ LINE_STRIP
All vertices form a single connected line.
saga::scene::IMeshBuffer::getPrimitiveType
scene::E_PRIMITIVE_TYPE getPrimitiveType() const
Get the kind of primitive geometry which is used by the meshbuffer.
Definition: IMeshBuffer.h:152
saga::scene::IMeshBuffer::getIndex
virtual std::uint32_t getIndex(std::size_t offset) const =0
returns vertex index at this offset
saga::scene::IMeshBuffer::getNormal
virtual const glm::vec3 & getNormal(std::uint32_t i) const =0
returns normal of vertex i
saga::scene::E_PRIMITIVE_TYPE::QUAD_STRIP
@ QUAD_STRIP
saga::scene::E_PRIMITIVE_TYPE::POLYGON
@ POLYGON
saga::scene::E_INDEX_TYPE::UINT32
@ UINT32
saga::scene::E_INDEX_TYPE
E_INDEX_TYPE
Definition: EIndexType.h:9
EPrimitiveTypes.h
saga::scene::IMeshBuffer::indirectDrawBuffer
auto indirectDrawBuffer() const
Definition: IMeshBuffer.h:229
SPipeline.h
saga::scene::IMeshBuffer::setInstanceCount
void setInstanceCount(const size_t count)
Set buffer binding location.
Definition: IMeshBuffer.h:170
saga::scene::IMeshBuffer::indexedIndirectDrawBuffer
auto indexedIndirectDrawBuffer() const
Definition: IMeshBuffer.h:244
saga::scene::IMeshBuffer::getIndexCount
virtual std::uint32_t getIndexCount() const =0
Get amount of indices in this meshbuffer.
saga::scene::E_PRIMITIVE_TYPE
E_PRIMITIVE_TYPE
Enumeration for all primitive types there are.
Definition: EPrimitiveTypes.h:14
saga::scene::IMeshBuffer::getSize
virtual std::size_t getSize(const video::PipelineHandle pipeline) const =0
Get size of GPU staging buffer.
saga::scene::MeshBufferID
std::uint32_t MeshBufferID
Definition: IMeshBuffer.h:22
saga::scene::IMeshBuffer::RootID
static MeshBufferID RootID
To set ID for mesh buffer when created.
Definition: IMeshBuffer.h:256
saga
Definition: aabbox3d.h:11
saga::scene::IMeshBuffer::setIndexType
void setIndexType(const E_INDEX_TYPE type)
Set index type.
Definition: IMeshBuffer.h:164
saga::scene::IMeshBuffer::getPosition
virtual const glm::vec3 & getPosition(std::uint32_t i) const =0
returns position of vertex i
saga::scene::IMeshBuffer::isNull
bool isNull() const
Definition: IMeshBuffer.h:198