Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
AmbientLightBuffer.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "entity/Entity.hpp"
8#include <glm/gtc/type_ptr.hpp>
9
12 private:
13 static inline std::string prefix = "AmbientLightBuffer_";
15 glm::vec3 color;
16
17 explicit AmbientLightTransfer(const Object::Component::AmbientLight &ambientLight) : color(ambientLight.color)
18 {
19 }
20
21 static uint32_t CPUSize() { return sizeof(AmbientLightTransfer); }
22 static uint32_t GPUSize() { return sizeof(AmbientLightTransfer) + sizeof(float) /*padding*/; }
23 };
24
25 static_assert(sizeof(AmbientLightTransfer) == (sizeof(float) * 3),
26 "AmbientLightTransfer struct size does not match GPU requirements.");
27
28 public:
30
32
33 ~AmbientLightBuffer() override { Destroy(); }
34 void Create(Engine::Core &core) override
35 {
36 const auto &context = core.GetResource<Graphic::Resource::Context>();
37
38 _buffer = _CreateBuffer(context.deviceContext);
39 _isCreated = true;
40 };
41 void Destroy(Engine::Core &core) override { Destroy(); };
42
43 void Destroy()
44 {
45 if (_isCreated)
46 {
47 _isCreated = false;
48 _buffer.release();
49 }
50 }
51
52 bool IsCreated(Engine::Core &core) const override { return _isCreated; };
53 void Update(Engine::Core &core) override
54 {
55 if (!_entity.has_value() || _entity->IsAlive() == false)
56 {
57 return;
58 }
59 const auto &ambientLight = _entity->GetComponents<Object::Component::AmbientLight>();
60 SetValue(core, ambientLight);
61 };
62
64 {
65 _entity = entity;
67 }
68
69 void SetValue(const Engine::Core &core, const Object::Component::AmbientLight &ambientLight)
70 {
71 if (!_isCreated)
72 {
74 "Cannot update a GPU ambient light buffer that is not created.");
75 }
76
77 const auto &context = core.GetResource<Graphic::Resource::Context>();
78 _UpdateBuffer(context, ambientLight);
79 }
80
81 const wgpu::Buffer &GetBuffer() const override { return _buffer; };
82
83 std::string_view GetDebugName() const { return _debugName; }
84
85 private:
86 inline void _UpdateDebugName()
87 {
88 if (_entity.has_value())
89 {
90 _debugName = fmt::format("{}{}", prefix, *_entity);
91 }
92 else
93 {
94 _debugName = fmt::format("{}{}", prefix, "<no_entity>");
95 }
96 }
97
99 {
100 wgpu::BufferDescriptor bufferDesc(wgpu::Default);
101 bufferDesc.usage = wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::Uniform;
102 bufferDesc.size = AmbientLightTransfer::GPUSize();
103 bufferDesc.label = wgpu::StringView(_debugName);
104
105 return context.GetDevice()->createBuffer(bufferDesc);
106 }
107
109 const Object::Component::AmbientLight &ambientLightComponent)
110 {
111 AmbientLightTransfer ambientLightTransfer(ambientLightComponent);
112 context.queue->writeBuffer(_buffer, 0, std::addressof(ambientLightTransfer), AmbientLightTransfer::CPUSize());
113 }
114
115 wgpu::Buffer _buffer;
116 bool _isCreated = false;
117 std::optional<Engine::Entity> _entity;
118 std::string _debugName;
119};
120} // namespace DefaultPipeline::Resource
~AmbientLightBuffer() override
Definition AmbientLightBuffer.hpp:33
void _UpdateDebugName()
Definition AmbientLightBuffer.hpp:86
wgpu::Buffer _buffer
Definition AmbientLightBuffer.hpp:115
wgpu::Buffer _CreateBuffer(const Graphic::Resource::DeviceContext &context)
Definition AmbientLightBuffer.hpp:98
void Destroy()
Definition AmbientLightBuffer.hpp:43
void Update(Engine::Core &core) override
Definition AmbientLightBuffer.hpp:53
std::string _debugName
Definition AmbientLightBuffer.hpp:118
std::optional< Engine::Entity > _entity
Definition AmbientLightBuffer.hpp:117
bool IsCreated(Engine::Core &core) const override
Definition AmbientLightBuffer.hpp:52
void Create(Engine::Core &core) override
Definition AmbientLightBuffer.hpp:34
void SetEntity(Engine::Entity entity)
Definition AmbientLightBuffer.hpp:63
AmbientLightBuffer(Engine::Entity entity)
Definition AmbientLightBuffer.hpp:29
bool _isCreated
Definition AmbientLightBuffer.hpp:116
static std::string prefix
Definition AmbientLightBuffer.hpp:13
const wgpu::Buffer & GetBuffer() const override
Definition AmbientLightBuffer.hpp:81
void _UpdateBuffer(const Graphic::Resource::Context &context, const Object::Component::AmbientLight &ambientLightComponent)
Definition AmbientLightBuffer.hpp:108
std::string_view GetDebugName() const
Definition AmbientLightBuffer.hpp:83
AmbientLightBuffer(void)
Definition AmbientLightBuffer.hpp:31
void Destroy(Engine::Core &core) override
Definition AmbientLightBuffer.hpp:41
void SetValue(const Engine::Core &core, const Object::Component::AmbientLight &ambientLight)
Definition AmbientLightBuffer.hpp:69
The core is the place where all the data of the engine is stored. It contains the registry (entities)...
Definition Core.hpp:33
TResource & GetResource()
Get a reference of a resource.
Definition Core.inl:14
Wrapper class providing a convenient interface for entity manipulation with the Core....
Definition Entity.hpp:20
Definition UpdateBufferError.hpp:7
Definition AGPUBuffer.hpp:7
Definition Context.hpp:8
std::optional< wgpu::Queue > queue
Definition Context.hpp:44
Definition AmbientLight.cpp:6
constexpr DefaultFlag Default
Definition webgpu.hpp:78
StringView(const std::string_view &cpp)
Definition webgpu.hpp:618
static uint32_t GPUSize()
Definition AmbientLightBuffer.hpp:22
AmbientLightTransfer(const Object::Component::AmbientLight &ambientLight)
Definition AmbientLightBuffer.hpp:17
static uint32_t CPUSize()
Definition AmbientLightBuffer.hpp:21
glm::vec3 color
Definition AmbientLightBuffer.hpp:15
Definition DeviceContext.hpp:7
auto & GetDevice()
Definition DeviceContext.hpp:13
Definition AmbientLight.hpp:7