LkEngine 0.1.2
 
Loading...
Searching...
No Matches
VertexBufferLayout.h
1#pragma once
2
4
5
6namespace LkEngine {
7
11 enum class EShaderDataType : uint8_t
12 {
13 Null = 0,
14 Float,
15 Float2,
16 Float3,
17 Float4,
18 Int,
19 Int2,
20 Int3,
21 Int4,
22 Mat3,
23 Mat4,
24 Bool,
25 };
26
27 namespace Enum
28 {
29 inline static const char* ToString(const EShaderDataType ShaderDataType)
30 {
31 switch (ShaderDataType)
32 {
33 case EShaderDataType::Null: return "Null";
34 case EShaderDataType::Bool: return "Bool";
35 case EShaderDataType::Int: return "Int";
36 case EShaderDataType::Int2: return "Int2";
37 case EShaderDataType::Int3: return "Int3";
38 case EShaderDataType::Int4: return "Int4";
39 case EShaderDataType::Float: return "Float";
40 case EShaderDataType::Float2: return "Float2";
41 case EShaderDataType::Float3: return "Float3";
42 case EShaderDataType::Float4: return "Float4";
43 case EShaderDataType::Mat3: return "Mat3";
44 case EShaderDataType::Mat4: return "Mat4";
45 }
46
47 LK_CORE_ASSERT(false, "Enum::ToString(const EShaderDataType) failed with {}", static_cast<int>(ShaderDataType));
48 return nullptr;
49 }
50 }
51
56 {
57 Null = 0,
58 Position,
59 Color
60 };
61
62 inline static constexpr uint32_t GetShaderDataTypeSize(const EShaderDataType DataType)
63 {
64 switch (DataType)
65 {
66 case EShaderDataType::Bool: return 1;
67 case EShaderDataType::Int: return 4;
68 case EShaderDataType::Int2: return 4 * 2;
69 case EShaderDataType::Int3: return 4 * 3;
70 case EShaderDataType::Int4: return 4 * 4;
71 case EShaderDataType::Float: return 4;
72 case EShaderDataType::Float2: return 4 * 2;
73 case EShaderDataType::Float3: return 4 * 3;
74 case EShaderDataType::Float4: return 4 * 4;
75 case EShaderDataType::Mat3: return 4 * 3 * 3;
76 case EShaderDataType::Mat4: return 4 * 4 * 4;
77 }
78 return 0;
79 }
80
82 {
83 std::string Name{};
84 EShaderDataType Type;
85 uint32_t Size = 0;
86 size_t Offset = 0;
87 unsigned char Normalized{};
88 unsigned int Count = 0;
89
90 FVertexBufferElement() = default;
91 FVertexBufferElement(const std::string& InName, const EShaderDataType InShaderDataType, const bool InNormalized = false)
92 : Type(InShaderDataType)
93 , Name(InName)
94 , Size(GetShaderDataTypeSize(InShaderDataType))
95 , Offset(0)
96 , Normalized(InNormalized)
97 , Count(0)
98 {
99 }
100
101 FORCEINLINE uint32_t GetComponentCount() const
102 {
103 switch (Type)
104 {
105 case EShaderDataType::Float: return 1;
106 case EShaderDataType::Float2: return 2;
107 case EShaderDataType::Float3: return 3;
108 case EShaderDataType::Float4: return 4;
109 case EShaderDataType::Mat3: return 3 * 3;
110 case EShaderDataType::Mat4: return 4 * 4;
111 case EShaderDataType::Int: return 1;
112 case EShaderDataType::Int2: return 2;
113 case EShaderDataType::Int3: return 3;
114 case EShaderDataType::Int4: return 4;
115 case EShaderDataType::Bool: return 1;
116 }
117
118 LK_CORE_ASSERT(false, "GetComponentCount failed");
119 return 0;
120 }
121 };
122
124 {
125 public:
126 FVertexBufferLayout() = default;
127 FVertexBufferLayout(const std::initializer_list<FVertexBufferElement>& InElements)
128 : Elements(InElements)
129 {
130 CalculateOffsetsAndStride();
131 }
132
133 FORCEINLINE uint32_t GetStride() const { return Stride; }
134
135 FORCEINLINE const std::vector<FVertexBufferElement>& GetElements() const
136 {
137 return Elements;
138 }
139
140 FORCEINLINE uint32_t GetElementCount() const
141 {
142 return static_cast<uint32_t>(Elements.size());
143 }
144
145 [[nodiscard]] std::vector<FVertexBufferElement>::iterator begin() { return Elements.begin(); }
146 [[nodiscard]] std::vector<FVertexBufferElement>::iterator end() { return Elements.end(); }
147 [[nodiscard]] std::vector<FVertexBufferElement>::const_iterator begin() const { return Elements.begin(); }
148 [[nodiscard]] std::vector<FVertexBufferElement>::const_iterator end() const { return Elements.end(); }
149
150 FORCEINLINE std::string ToString() const
151 {
152 std::string String{};
153 for (const FVertexBufferElement& Element : Elements)
154 {
155 String += LK_FMT_LIB::format("{}: {}\n", Element.Name, Enum::ToString(Element.Type));
156 }
157
158 return String;
159 }
160
161 private:
162 FORCEINLINE void CalculateOffsetsAndStride()
163 {
164 Stride = 0;
165 uint32_t Offset = 0;
166 for (FVertexBufferElement& Element : Elements)
167 {
168 Element.Offset = Offset;
169 Offset += Element.Size;
170 Stride += Element.Size;
171 }
172 }
173
174 std::vector<FVertexBufferElement> Elements{};
175 uint32_t Stride = 0;
176 };
177
178
179}
Core header.
Definition Asset.h:11
EShaderDataMember
Definition VertexBufferLayout.h:56
EShaderDataType
Definition VertexBufferLayout.h:12
Definition VertexBufferLayout.h:82
Definition VertexBufferLayout.h:124