KarmaEngine
Game Engine for practical learning and research purposes
Loading...
Searching...
No Matches
Buffer.h
Go to the documentation of this file.
1
10#pragma once
11
12#include "glm/gtc/type_ptr.hpp"
13#include "stb_image.h"
14
15namespace Karma
16{
20 enum class ShaderDataType
21 {
22 None = 0,
23 Float,
24 Float2,
25 Float3,
26 Float4,
27 Mat3,
28 Mat4,
29 Int,
30 Int2,
31 Int3,
32 Int4,
33 Bool
34 };
35
45 static uint32_t ShaderDataTypeSize(ShaderDataType type)
46 {
47 switch (type)
48 {
49 case ShaderDataType::Float:
50 return 4;
51 case ShaderDataType::Float2:
52 return 4 * 2;
53 case ShaderDataType::Float3:
54 return 4 * 3;
55 case ShaderDataType::Float4:
56 return 4 * 4;
57 case ShaderDataType::Mat3:
58 return 4 * 3 * 3;
59 case ShaderDataType::Mat4:
60 return 4 * 4 * 4;
61 case ShaderDataType::Int:
62 return 4;
63 case ShaderDataType::Int2:
64 return 4 * 2;
65 case ShaderDataType::Int3:
66 return 4 * 3;
67 case ShaderDataType::Int4:
68 return 4 * 4;
69 case ShaderDataType::Bool:
70 return 4;
71 case ShaderDataType::None:
72 KR_CORE_WARN("ShaderDataType is none. Size shall be considered 0.");
73 return 0;
74 }
75
76 KR_CORE_ASSERT(false, "Unknown ShaderDataType");
77 return 0;
78 }
79
84 {
91 std::string Name;
92
99 uint64_t Offset;
100
109 uint32_t Size;
110
117 bool Normalized;
118
130 BufferElement(ShaderDataType type, const std::string& name, bool normalized = false, uint64_t offset = 0)
131 : Name(name), Type(type), Size(ShaderDataTypeSize(type)), Offset(offset), Normalized(normalized)
132 {
133 }
134
140 uint32_t GetComponentCount() const
141 {
142 switch (Type)
143 {
144 case Karma::ShaderDataType::None:
145 return 0;
146 case Karma::ShaderDataType::Float:
147 return 1;
148 case Karma::ShaderDataType::Float2:
149 return 2;
150 case Karma::ShaderDataType::Float3:
151 return 3;
152 case Karma::ShaderDataType::Float4:
153 return 4;
154 case Karma::ShaderDataType::Mat3:
155 return 3 * 3;
156 case Karma::ShaderDataType::Mat4:
157 return 4 * 4;
158 case Karma::ShaderDataType::Int:
159 return 1;
160 case Karma::ShaderDataType::Int2:
161 return 2;
162 case Karma::ShaderDataType::Int3:
163 return 3;
164 case Karma::ShaderDataType::Int4:
165 return 4;
166 case Karma::ShaderDataType::Bool:
167 return 1;
168 }
169
170 KR_CORE_ASSERT(false, "Unknown ShaderDataType!");
171 return 0;
172 }
173 };
174
181 {
182 public:
190 {
191 }
192
202 BufferLayout(const std::initializer_list<BufferElement>& elements)
203 : m_Elements(elements)
204 {
205 CalculateOffsetsAndStride();
206 }
207
213 inline uint32_t GetStride() const { return m_Stride; }
214
220 inline const std::vector<BufferElement>& GetElements() const { return m_Elements; }
221
227 inline void PushElement(const BufferElement& element) { m_Elements.push_back(element); CalculateOffsetsAndStride(); }
228
234 std::vector<BufferElement>::iterator begin()
235 {
236 return m_Elements.begin();
237 }
238
244 std::vector<BufferElement>::iterator end()
245 {
246 return m_Elements.end();
247 }
248
254 std::vector<BufferElement>::const_iterator begin() const
255 {
256 return m_Elements.begin();
257 }
258
264 std::vector<BufferElement>::const_iterator end() const
265 {
266 return m_Elements.end();
267 }
268
269 private:
275 void CalculateOffsetsAndStride()
276 {
277 uint32_t offset = 0;
278 m_Stride = 0;
279 for (auto& element : m_Elements)
280 {
281 element.Offset = offset;
282 offset += element.Size;
283 m_Stride += element.Size;
284 }
285 }
286
287 private:
288 std::vector<BufferElement> m_Elements;
289 uint32_t m_Stride = 0;
290 };
291
296 {
297 public:
298 virtual ~VertexBuffer() = default;
299
300 virtual void Bind() const = 0;
301 virtual void UnBind() const = 0;
302
303 virtual const BufferLayout& GetLayout() const = 0;
304 virtual void SetLayout(const BufferLayout& layout) = 0;
305
306 static VertexBuffer* Create(float* vertices, uint32_t size);
307 };
308
313 {
314 public:
315 virtual ~IndexBuffer() = default;
316
317 virtual void Bind() const = 0;
318 virtual void UnBind() const = 0;
319
320 virtual uint32_t GetCount() const = 0;
321
322 static IndexBuffer* Create(uint32_t* vertices, uint32_t size);
323 };
324
329 {
330 public:
331 static ImageBuffer* Create(const char* filename);
332 uint32_t GetBindingPointIndex() const
333 {
334 return m_BindingPoint;
335 }
336 protected:
337 uint32_t m_BindingPoint;
338 };
339
344 {
345 public:
352 UBODataPointer(const void* data) : m_DataPointer(data)
353 {}
354
360 const void* GetDataPointer() const
361 {
362 return m_DataPointer;
363 }
364 private:
365 const void* m_DataPointer;
366 };
367
376 {
384 static UniformBufferObject* Create(std::vector<ShaderDataType> dataTypes, uint32_t bindingPointIndex);
385
394 UniformBufferObject(std::vector<ShaderDataType> dataTypes, uint32_t bindingPointIndex);
395
401 virtual ~UniformBufferObject() = default;
402
409 template<typename... T>
410 void UpdateUniforms(T&&... uniforms)
411 {
412 m_UniformList = { uniforms... };
413 }
414
415 virtual void UpdateCameraUniform() = 0;
416
426 virtual void UploadUniformBuffer(size_t frameIndex = 0) = 0;
427
428 uint32_t GetBufferSize() const
429 {
430 return m_BufferSize;
431 }
432
433 const std::vector<UBODataPointer>& GetUniformList() const
434 {
435 return m_UniformList;
436 }
437
438 const std::vector<ShaderDataType>& GetUniformDataType() const
439 {
440 return m_UniformDataType;
441 }
442
443 const std::vector<uint32_t>& GetAlignedOffsets() const
444 {
445 return m_UniformAlignedOffsets;
446 }
447
448 const std::vector<uint32_t>& GetUniformSize() const
449 {
450 return m_UniformSizes;
451 }
452
453 uint32_t GetBindingPointIndex() const
454 {
455 return m_BindingPoint;
456 }
457
458 protected:
467 void CalculateOffsetsAndBufferSize();
468
469 protected:
475 uint32_t m_BufferSize;
476
483
489 std::vector<UBODataPointer> m_UniformList;
490
496 std::vector<ShaderDataType> m_UniformDataType;
497
503 std::vector<uint32_t> m_UniformAlignedOffsets;
504
510 std::vector<uint32_t> m_UniformSizes;
511
512 private:
518 uint32_t ComputeBaseAlignment(ShaderDataType dataType);
519 };
520}
ShaderDataType
A C++ data structure for shader language (GLSL or HLSL) data, like uniforms for instance and datatype...
Definition Buffer.h:21
#define KARMA_API
Defining Karma's API macro for storage class information.
Definition Core.h:41
@ None
Events of the unknown category.
Definition Event.h:35
#define KR_CORE_WARN(...)
A macro for logging warning in Core part.
Definition Log.h:79
A format for vertex buffer say.
Definition Buffer.h:181
BufferLayout(const std::initializer_list< BufferElement > &elements)
Constructor with specified buffer data format.
Definition Buffer.h:202
uint32_t GetStride() const
A getter for m_Stride.
Definition Buffer.h:213
const std::vector< BufferElement > & GetElements() const
A getter for m_Elements.
Definition Buffer.h:220
std::vector< BufferElement >::iterator end()
Getter for iterator end.
Definition Buffer.h:244
std::vector< BufferElement >::const_iterator begin() const
Getter for const_iterator begin.
Definition Buffer.h:254
BufferLayout()
A default constructor.
Definition Buffer.h:189
std::vector< BufferElement >::const_iterator end() const
Getter for const_iterator end.
Definition Buffer.h:264
void PushElement(const BufferElement &element)
For modifying the list of elements and set paremeters accordingly.
Definition Buffer.h:227
std::vector< BufferElement >::iterator begin()
Getter for iterator begin.
Definition Buffer.h:234
Abstract class for image buffer.
Definition Buffer.h:329
An abstract class for index buffer.
Definition Buffer.h:313
UBODataPointer(const void *data)
A constructor.
Definition Buffer.h:352
const void * GetDataPointer() const
Getter for UBO data.
Definition Buffer.h:360
An abstract class for vertex buffer.
Definition Buffer.h:296
A datastructure for creating interleaved data for Mesh with a specifc format (BufferLayout).
Definition Buffer.h:84
ShaderDataType Type
The type of the attribute.
Definition Buffer.h:116
std::string Name
A name for vertex data, created by interleaving of various attributes.
Definition Buffer.h:91
uint32_t Size
The size of this element.
Definition Buffer.h:109
uint32_t GetComponentCount() const
Routine to compute number of components of this element.
Definition Buffer.h:140
uint64_t Offset
The location (offset) of this element in the vertex or index data set.
Definition Buffer.h:99
BufferElement(ShaderDataType type, const std::string &name, bool normalized=false, uint64_t offset=0)
A constructor.
Definition Buffer.h:130
void UpdateUniforms(T &&... uniforms)
Set the m_UniformList with latest supplied uniforms.
Definition Buffer.h:410
uint32_t m_BufferSize
Total size of the buffer in bytes.
Definition Buffer.h:475
static UniformBufferObject * Create(std::vector< ShaderDataType > dataTypes, uint32_t bindingPointIndex)
A function for appropriate initialization of UBO based on programmer selected rendered (Vulkan or Ope...
Definition Buffer.cpp:60
std::vector< uint32_t > m_UniformSizes
List of individual uniform sizes.
Definition Buffer.h:510
virtual void UploadUniformBuffer(size_t frameIndex=0)=0
An overridable function to upload the uniform buffer.
virtual ~UniformBufferObject()=default
Pure virtual destructor and sub class should have appropriate implementation.
std::vector< uint32_t > m_UniformAlignedOffsets
List of individual uniform boundary aligned (with multiple of individual uniform size) offsets.
Definition Buffer.h:503
UniformBufferObject(std::vector< ShaderDataType > dataTypes, uint32_t bindingPointIndex)
An agnostic constructor provided for precomputation of offset and buffer size.
Definition Buffer.cpp:77
uint32_t m_BindingPoint
The binding point prescribed in vertex shader for instance https://github.com/ravimohan1991/KarmaEngi...
Definition Buffer.h:482
std::vector< ShaderDataType > m_UniformDataType
List of data types (ShaderDataType) for the m_UniformList.
Definition Buffer.h:496
std::vector< UBODataPointer > m_UniformList
List of uniforms to be uploaded.
Definition Buffer.h:489