Hana
Loading...
Searching...
No Matches
Buffer.h
1#pragma once
2
3namespace Hana
4{
5 enum class ShaderDataType
6 {
7 None = 0, Float, Float2, Float3, Float4, Mat3, Mat4, Int, Int2, Int3, Int4, Bool
8 };
9
10 static uint32_t ShaderDataTypeSize(ShaderDataType type)
11 {
12 switch (type)
13 {
14 case ShaderDataType::Float: return 4;
15 case ShaderDataType::Float2: return 4 * 2;
16 case ShaderDataType::Float3: return 4 * 3;
17 case ShaderDataType::Float4: return 4 * 4;
18 case ShaderDataType::Mat3: return 4 * 3 * 3;
19 case ShaderDataType::Mat4: return 4 * 4 * 4;
20 case ShaderDataType::Int: return 4;
21 case ShaderDataType::Int2: return 4 * 2;
22 case ShaderDataType::Int3: return 4 * 3;
23 case ShaderDataType::Int4: return 4 * 4;
24 case ShaderDataType::Bool: return 1;
25 }
26
27 HN_CORE_ASSERT(false, "Unkonwn ShaderDataType!");
28 return 0;
29 }
30
31 struct BufferElement
32 {
33 std::string Name;
34 ShaderDataType Type = ShaderDataType::None;
35 uint32_t Size = 0;
36 size_t Offset = 0;
37 bool Normalized = false;
38
39 BufferElement() = default;
40
41 BufferElement(ShaderDataType type, const std::string& name, bool normalized = false)
42 : Name(name)
43 , Type(type)
44 , Size(ShaderDataTypeSize(type))
45 , Offset(0)
46 , Normalized(normalized)
47 {
48 }
49
50 uint32_t GetComponentCount() const
51 {
52 switch (Type)
53 {
54 case ShaderDataType::Float: return 1;
55 case ShaderDataType::Float2: return 2;
56 case ShaderDataType::Float3: return 3;
57 case ShaderDataType::Float4: return 4;
58 case ShaderDataType::Mat3: return 3 * 3;
59 case ShaderDataType::Mat4: return 4 * 4;
60 case ShaderDataType::Int: return 1;
61 case ShaderDataType::Int2: return 2;
62 case ShaderDataType::Int3: return 3;
63 case ShaderDataType::Int4: return 4;
64 case ShaderDataType::Bool: return 1;
65 }
66
67 HN_CORE_ASSERT(false, "Unkonwn ShaderDataType!");
68 return 0;
69 }
70 };
71
72 class BufferLayout
73 {
74 public:
75 BufferLayout() {}
76
77 BufferLayout(const std::initializer_list<BufferElement>& elements)
78 : m_Elements(elements)
79 {
80 CalculateOffsetsAndStride();
81 }
82
83 inline uint32_t GetStride() const { return m_Stride; }
84 inline const std::vector<BufferElement>& GetElements() const { return m_Elements; }
85
86 std::vector<BufferElement>::iterator begin() { return m_Elements.begin(); }
87 std::vector<BufferElement>::iterator end() { return m_Elements.end(); }
88 std::vector<BufferElement>::const_iterator begin() const { return m_Elements.begin(); }
89 std::vector<BufferElement>::const_iterator end() const { return m_Elements.end(); }
90 private:
91 void CalculateOffsetsAndStride()
92 {
93 size_t offset = 0;
94 m_Stride = 0;
95 for (BufferElement& element : m_Elements)
96 {
97 element.Offset = offset;
98 offset += element.Size;
99 m_Stride += element.Size;
100 }
101 }
102
103 std::vector<BufferElement> m_Elements;
104 uint32_t m_Stride = 0;
105 };
106
108 {
109 public:
110 virtual ~VertexBuffer() = default;
111
112 virtual void Bind() const = 0;
113 virtual void Unbind() const = 0;
114
115 virtual const BufferLayout& GetLayout() const = 0;
116 virtual void SetLayout(const BufferLayout& layout) = 0;
117
118 static Ref<VertexBuffer> Create(float* vertices, uint32_t size);
119 };
120
122 {
123 public:
124 virtual ~IndexBuffer() = default;
125
126 virtual void Bind() const = 0;
127 virtual void Unbind() const = 0;
128
129 virtual uint32_t GetCount() const = 0;
130
131 static Ref<IndexBuffer> Create(uint32_t* indices, uint32_t size);
132 };
133}
Definition Buffer.h:73
Definition Buffer.h:122
Definition Buffer.h:108
Definition Buffer.h:32