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 "krpch.h"
13
14#include "glm/gtc/type_ptr.hpp"
15#include "stb_image.h"
16
17namespace Karma
18{
22 enum class ShaderDataType
23 {
24 None = 0,
25 Float,
26 Float2,
27 Float3,
28 Float4,
29 Mat3,
30 Mat4,
31 Int,
32 Int2,
33 Int3,
34 Int4,
35 Bool
36 };
37
47 static uint32_t ShaderDataTypeSize(ShaderDataType type)
48 {
49 switch (type)
50 {
51 case ShaderDataType::Float:
52 return 4;
53 case ShaderDataType::Float2:
54 return 4 * 2;
55 case ShaderDataType::Float3:
56 return 4 * 3;
57 case ShaderDataType::Float4:
58 return 4 * 4;
59 case ShaderDataType::Mat3:
60 return 4 * 3 * 3;
61 case ShaderDataType::Mat4:
62 return 4 * 4 * 4;
63 case ShaderDataType::Int:
64 return 4;
65 case ShaderDataType::Int2:
66 return 4 * 2;
67 case ShaderDataType::Int3:
68 return 4 * 3;
69 case ShaderDataType::Int4:
70 return 4 * 4;
71 case ShaderDataType::Bool:
72 return 4;
73 case ShaderDataType::None:
74 KR_CORE_WARN("ShaderDataType is none. Size shall be considered 0.");
75 return 0;
76 }
77
78 KR_CORE_ASSERT(false, "Unknown ShaderDataType");
79 return 0;
80 }
81
86 {
93 std::string Name;
94
101 uint64_t Offset;
102
111 uint32_t Size;
112
119 bool Normalized;
120
132 BufferElement(ShaderDataType type, const std::string& name, bool normalized = false, uint64_t offset = 0)
133 : Name(name), Type(type), Size(ShaderDataTypeSize(type)), Offset(offset), Normalized(normalized)
134 {
135 }
136
142 uint32_t GetComponentCount() const
143 {
144 switch (Type)
145 {
146 case Karma::ShaderDataType::None:
147 return 0;
148 case Karma::ShaderDataType::Float:
149 return 1;
150 case Karma::ShaderDataType::Float2:
151 return 2;
152 case Karma::ShaderDataType::Float3:
153 return 3;
154 case Karma::ShaderDataType::Float4:
155 return 4;
156 case Karma::ShaderDataType::Mat3:
157 return 3 * 3;
158 case Karma::ShaderDataType::Mat4:
159 return 4 * 4;
160 case Karma::ShaderDataType::Int:
161 return 1;
162 case Karma::ShaderDataType::Int2:
163 return 2;
164 case Karma::ShaderDataType::Int3:
165 return 3;
166 case Karma::ShaderDataType::Int4:
167 return 4;
168 case Karma::ShaderDataType::Bool:
169 return 1;
170 }
171
172 KR_CORE_ASSERT(false, "Unknown ShaderDataType!");
173 return 0;
174 }
175 };
176
183 {
184 public:
192 {
193 }
194
204 BufferLayout(const std::initializer_list<BufferElement>& elements)
205 : m_Elements(elements)
206 {
207 CalculateOffsetsAndStride();
208 }
209
215 inline uint32_t GetStride() const { return m_Stride; }
216
222 inline const std::vector<BufferElement>& GetElements() const { return m_Elements; }
223
229 inline void PushElement(const BufferElement& element) { m_Elements.push_back(element); CalculateOffsetsAndStride(); }
230
236 std::vector<BufferElement>::iterator begin()
237 {
238 return m_Elements.begin();
239 }
240
246 std::vector<BufferElement>::iterator end()
247 {
248 return m_Elements.end();
249 }
250
256 std::vector<BufferElement>::const_iterator begin() const
257 {
258 return m_Elements.begin();
259 }
260
266 std::vector<BufferElement>::const_iterator end() const
267 {
268 return m_Elements.end();
269 }
270
271 private:
277 void CalculateOffsetsAndStride()
278 {
279 uint32_t offset = 0;
280 m_Stride = 0;
281 for (auto& element : m_Elements)
282 {
283 element.Offset = offset;
284 offset += element.Size;
285 m_Stride += element.Size;
286 }
287 }
288
289 private:
290 std::vector<BufferElement> m_Elements;
291 uint32_t m_Stride = 0;
292 };
293
298 {
299 public:
300 virtual ~VertexBuffer() = default;
301
302 virtual void Bind() const = 0;
303 virtual void UnBind() const = 0;
304
305 virtual const BufferLayout& GetLayout() const = 0;
306 virtual void SetLayout(const BufferLayout& layout) = 0;
307
308 static VertexBuffer* Create(float* vertices, uint32_t size);
309 };
310
315 {
316 public:
317 virtual ~IndexBuffer() = default;
318
319 virtual void Bind() const = 0;
320 virtual void UnBind() const = 0;
321
322 virtual uint32_t GetCount() const = 0;
323
324 static IndexBuffer* Create(uint32_t* vertices, uint32_t size);
325 };
326
331 {
332 public:
333 static ImageBuffer* Create(const char* filename);
334 uint32_t GetBindingPointIndex() const
335 {
336 return m_BindingPoint;
337 }
338 protected:
339 uint32_t m_BindingPoint;
340 };
341
346 {
347 public:
354 UBODataPointer(const void* data) : m_DataPointer(data)
355 {}
356
362 const void* GetDataPointer() const
363 {
364 return m_DataPointer;
365 }
366 private:
367 const void* m_DataPointer;
368 };
369
378 {
386 static UniformBufferObject* Create(std::vector<ShaderDataType> dataTypes, uint32_t bindingPointIndex);
387
396 UniformBufferObject(std::vector<ShaderDataType> dataTypes, uint32_t bindingPointIndex);
397
403 virtual ~UniformBufferObject() = default;
404
411 template<typename... T>
412 void UpdateUniforms(T&&... uniforms)
413 {
414 m_UniformList = { uniforms... };
415 }
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:23
#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:37
#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:183
BufferLayout(const std::initializer_list< BufferElement > &elements)
Constructor with specified buffer data format.
Definition Buffer.h:204
uint32_t GetStride() const
A getter for m_Stride.
Definition Buffer.h:215
const std::vector< BufferElement > & GetElements() const
A getter for m_Elements.
Definition Buffer.h:222
std::vector< BufferElement >::iterator end()
Getter for iterator end.
Definition Buffer.h:246
std::vector< BufferElement >::const_iterator begin() const
Getter for const_iterator begin.
Definition Buffer.h:256
BufferLayout()
A default constructor.
Definition Buffer.h:191
std::vector< BufferElement >::const_iterator end() const
Getter for const_iterator end.
Definition Buffer.h:266
void PushElement(const BufferElement &element)
For modifying the list of elements and set paremeters accordingly.
Definition Buffer.h:229
std::vector< BufferElement >::iterator begin()
Getter for iterator begin.
Definition Buffer.h:236
Abstract class for image buffer.
Definition Buffer.h:331
An abstract class for index buffer.
Definition Buffer.h:315
UBODataPointer(const void *data)
A constructor.
Definition Buffer.h:354
const void * GetDataPointer() const
Getter for UBO data.
Definition Buffer.h:362
An abstract class for vertex buffer.
Definition Buffer.h:298
A datastructure for creating interleaved data for Mesh with a specifc format (BufferLayout)
Definition Buffer.h:86
ShaderDataType Type
The type of the attribute.
Definition Buffer.h:118
std::string Name
A name for vertex data, created by interleaving of various attributes.
Definition Buffer.h:93
uint32_t Size
The size of this element.
Definition Buffer.h:111
uint32_t GetComponentCount() const
Routine to compute number of components of this element.
Definition Buffer.h:142
uint64_t Offset
The location (offset) of this element in the vertex or index data set.
Definition Buffer.h:101
BufferElement(ShaderDataType type, const std::string &name, bool normalized=false, uint64_t offset=0)
A constructor.
Definition Buffer.h:132
void UpdateUniforms(T &&... uniforms)
Set the m_UniformList with latest supplied uniforms.
Definition Buffer.h:412
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:61
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:78
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