Zen 0.3.0
Loading...
Searching...
No Matches
ZEN_Buffer.h
1#pragma once
2
3#include <zen/zen_pch.h>
4
5namespace Zen {
6
7 enum class ShaderDataType {
8 None = 0,
9 Float,
10 Float2,
11 Float3,
12 Float4,
13 Mat3,
14 Mat4,
15 Int,
16 Int2,
17 Int3,
18 Int4,
19 Bool
20 };
21
22 static uint32_t ShaderDataTypeSize(ShaderDataType type) {
23 switch (type) {
24 case ShaderDataType::Float:
25 return 4;
26 case ShaderDataType::Float2:
27 return 4 * 2;
28 case ShaderDataType::Float3:
29 return 4 * 3;
30 case ShaderDataType::Float4:
31 return 4 * 4;
32 case ShaderDataType::Mat3:
33 return 4 * 3 * 3;
34 case ShaderDataType::Mat4:
35 return 4 * 4 * 4;
36 case ShaderDataType::Int:
37 return 4;
38 case ShaderDataType::Int2:
39 return 4 * 2;
40 case ShaderDataType::Int3:
41 return 4 * 3;
42 case ShaderDataType::Int4:
43 return 4 * 4;
44 case ShaderDataType::Bool:
45 return 1;
46 }
47
48 ZEN_LOG_ERROR("Unknown ShaderDataType");
49 return 0;
50 }
51
52 struct BufferElement {
53 std::string name;
54 ShaderDataType type;
55 uint32_t size;
56 size_t offset;
57 bool isNormalized;
58
59 BufferElement() = default;
60
61 BufferElement(ShaderDataType type, const std::string &name, bool isNormalized = false)
62 : name(name), type(type), size(ShaderDataTypeSize(type)), offset(0),
63 isNormalized(isNormalized) {}
64
65 uint32_t GetComponentCount() const {
66 switch (type) {
67 case ShaderDataType::Float:
68 return 1;
69 case ShaderDataType::Float2:
70 return 2;
71 case ShaderDataType::Float3:
72 return 3;
73 case ShaderDataType::Float4:
74 return 4;
75 case ShaderDataType::Mat3:
76 return 3 * 3; // 3* float3
77 case ShaderDataType::Mat4:
78 return 4 * 3; // 4* float4
79 case ShaderDataType::Int:
80 return 1;
81 case ShaderDataType::Int2:
82 return 2;
83 case ShaderDataType::Int3:
84 return 3;
85 case ShaderDataType::Int4:
86 return 4;
87 case ShaderDataType::Bool:
88 return 1;
89 }
90
91 ZEN_LOG_ERROR("Unknown ShaderDataType");
92 return 0;
93 }
94 };
95
96 class BufferLayout {
97 public:
98 BufferLayout() {}
99
100 BufferLayout(const std::initializer_list<BufferElement> &elements) : m_elements(elements) {
101 _calculateOffsetAndStride();
102 }
103
104 uint32_t getStride() const { return m_stride; }
105 inline const std::vector<BufferElement> &getElements() const { return m_elements; }
106
107 std::vector<BufferElement>::iterator begin() { return m_elements.begin(); }
108 std::vector<BufferElement>::iterator end() { return m_elements.end(); }
109 std::vector<BufferElement>::const_iterator begin() const { return m_elements.begin(); }
110 std::vector<BufferElement>::const_iterator end() const { return m_elements.end(); }
111
112 private:
113 void _calculateOffsetAndStride() {
114 size_t offset = 0;
115 m_stride = 0;
116 for (auto &element : m_elements) {
117 element.offset = offset;
118 offset += element.size;
119 m_stride += element.size;
120 }
121 }
122
123 private:
124 std::vector<BufferElement> m_elements;
125 uint32_t m_stride = 0;
126 };
127
129 public:
130 virtual ~VertexBuffer() {}
131
132 virtual void bind() const = 0;
133 virtual void unbind() const = 0;
134
135 virtual void setData(const void *data, uint32_t size) = 0;
136
137 virtual const BufferLayout &getLayout() const = 0;
138 virtual void setLayout(const BufferLayout &layout) = 0;
139
140 static VertexBuffer *Create(float *vertices, uint32_t size);
141 };
142
144 public:
145 virtual ~IndexBuffer() {}
146
147 virtual void bind() const = 0;
148 virtual void unbind() const = 0;
149 virtual void setCount(uint32_t count) = 0;
150 virtual uint32_t getCount() const = 0;
151
152 static IndexBuffer *Create(uint32_t *indices, uint32_t count);
153 };
154
155}; // namespace Zen