PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
UniformHandler.hpp
1#pragma once
2
3#include "PixelBullet/Graphics/Buffers/UniformBuffer.hpp"
4
5#include <cstring>
6
7namespace PixelBullet
8{
13 {
14 public:
15 explicit UniformHandler(bool multipipeline = false);
16 explicit UniformHandler(const Shader::UniformBlock& uniformBlock, bool multipipeline = false);
17
18 template <typename T>
19 void Push(const T& object, std::size_t offset, std::size_t size)
20 {
21 if (!m_UniformBlock || !m_UniformBuffer)
22 {
23 return;
24 }
25
26 if (!m_Bound)
27 {
28 m_UniformBuffer->MapMemory(&this->m_Data);
29 m_Bound = true;
30 }
31
32 // If the buffer is already changed we can skip a memory comparison and just copy.
33 if (m_HandlerStatus == Buffer::Status::Changed ||
34 std::memcmp(static_cast<char*>(this->m_Data), &object, size) != 0)
35 {
36 std::memcpy(static_cast<char*>(this->m_Data) + offset, &object, size);
37 m_HandlerStatus = Buffer::Status::Changed;
38 }
39 }
40
41 template <typename T>
42 void Push(const std::string& uniformName, const T& object, std::size_t size = 0)
43 {
44 if (!m_UniformBlock || !m_UniformBuffer)
45 {
46 return;
47 }
48
49 auto uniform = m_UniformBlock->GetUniform(uniformName);
50 if (!uniform)
51 {
52 return;
53 }
54
55 auto realSize = size;
56 if (realSize == 0)
57 {
58 realSize = std::min(sizeof(object), static_cast<std::size_t>(uniform->GetSize()));
59 }
60
61 Push(object, static_cast<std::size_t>(uniform->GetOffset()), realSize);
62 }
63
64 bool Update(const std::optional<Shader::UniformBlock>& uniformBlock);
65
66 const UniformBuffer* GetUniformBuffer() const
67 {
68 return m_UniformBuffer.get();
69 }
70
71 private:
72 bool m_Multipipeline;
73 std::optional<Shader::UniformBlock> m_UniformBlock;
74 uint32_t m_Size = 0;
75 void* m_Data = nullptr;
76 bool m_Bound = false;
77 std::unique_ptr<UniformBuffer> m_UniformBuffer;
78 Buffer::Status m_HandlerStatus;
79 };
80} // namespace PixelBullet
Definition Shader.hpp:162
Definition UniformBuffer.hpp:9
Class that handles a uniform buffer.
Definition UniformHandler.hpp:13