Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
MaterialGPUBuffer.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "entity/Entity.hpp"
7#include <glm/gtc/type_ptr.hpp>
8
11 public:
12 static inline std::string prefix = "MaterialGPUBuffer_";
14 glm::vec4 ambient;
15 glm::vec4 diffuse;
16 glm::vec4 specular;
17 glm::vec4 transmittance;
18 glm::vec4 emission;
19 std::array<float, 3> _padding;
20 float shininess;
21
23 : ambient(material.ambient, 1.0f), diffuse(material.diffuse, 1.0f), specular(material.specular, 1.0f),
24 transmittance(material.transmittance, 1.0f), emission(material.emission, 1.0f),
25 shininess(material.shininess)
26 {
27 }
28
29 static uint32_t CPUSize() { return sizeof(MaterialTransfer); }
30 static uint32_t GPUSize() { return sizeof(MaterialTransfer); }
31 };
32
33 explicit MaterialGPUBuffer(Engine::Entity entity) : _entity(entity) { _UpdateDebugName(); }
34
35 explicit MaterialGPUBuffer(void) { _UpdateDebugName(); }
36
37 ~MaterialGPUBuffer() override { Destroy(); }
38 void Create(Engine::Core &core) override
39 {
40 const auto &context = core.GetResource<Graphic::Resource::Context>();
41
42 _buffer = _CreateBuffer(context.deviceContext);
43 _isCreated = true;
44 };
45 void Destroy(Engine::Core &core) override { Destroy(); };
46
47 void Destroy()
48 {
49 if (_isCreated)
50 {
51 _isCreated = false;
52 _buffer.release();
53 }
54 }
55
56 bool IsCreated(Engine::Core &core) const override { return _isCreated; };
57 void Update(Engine::Core &core) override
58 {
59 if (!_isCreated)
60 {
61 throw Graphic::Exception::UpdateBufferError("Cannot update a GPU material buffer that is not created.");
62 }
63
64 if (!_entity.has_value())
65 {
66 return;
67 }
68
69 const auto &materialComponent = _entity->GetComponents<Object::Component::Material>();
70 const auto &context = core.GetResource<Graphic::Resource::Context>();
71 _UpdateBuffer(materialComponent, context);
72 };
73
74 void SetMaterial(const Engine::Core &core, const Object::Component::Material &material)
75 {
76 if (!_isCreated)
77 {
78 throw Graphic::Exception::UpdateBufferError("Cannot update a GPU material buffer that is not created.");
79 }
80
81 const auto &context = core.GetResource<Graphic::Resource::Context>();
82 _UpdateBuffer(material, context);
83 }
84
85 const wgpu::Buffer &GetBuffer() const override { return _buffer; };
86
87 std::string_view GetDebugName() const { return _debugName; }
88
89 private:
91 {
92 if (_entity.has_value())
93 _debugName = fmt::format("{}{}", prefix, *_entity);
94 else
95 _debugName = fmt::format("{}{}", prefix, "Default");
96 }
97
99 {
100 wgpu::BufferDescriptor bufferDesc(wgpu::Default);
101 bufferDesc.usage = wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::Uniform;
102 bufferDesc.size = MaterialTransfer::GPUSize();
103 bufferDesc.label = wgpu::StringView(_debugName);
104
105 return context.GetDevice()->createBuffer(bufferDesc);
106 }
107
108 void _UpdateBuffer(const Object::Component::Material &materialComponent, const Graphic::Resource::Context &context)
109 {
110 MaterialTransfer materialTransfer(materialComponent);
111 context.queue->writeBuffer(_buffer, 0, std::addressof(materialTransfer), MaterialTransfer::CPUSize());
112 }
113
114 wgpu::Buffer _buffer;
115 bool _isCreated = false;
116 std::optional<Engine::Entity> _entity;
117 std::string _debugName;
118};
119} // namespace DefaultPipeline::Resource
std::optional< Engine::Entity > _entity
Definition MaterialGPUBuffer.hpp:116
MaterialGPUBuffer(Engine::Entity entity)
Definition MaterialGPUBuffer.hpp:33
static std::string prefix
Definition MaterialGPUBuffer.hpp:12
wgpu::Buffer _buffer
Definition MaterialGPUBuffer.hpp:114
std::string_view GetDebugName() const
Definition MaterialGPUBuffer.hpp:87
wgpu::Buffer _CreateBuffer(const Graphic::Resource::DeviceContext &context)
Definition MaterialGPUBuffer.hpp:98
const wgpu::Buffer & GetBuffer() const override
Definition MaterialGPUBuffer.hpp:85
void _UpdateBuffer(const Object::Component::Material &materialComponent, const Graphic::Resource::Context &context)
Definition MaterialGPUBuffer.hpp:108
MaterialGPUBuffer(void)
Definition MaterialGPUBuffer.hpp:35
bool _isCreated
Definition MaterialGPUBuffer.hpp:115
void SetMaterial(const Engine::Core &core, const Object::Component::Material &material)
Definition MaterialGPUBuffer.hpp:74
void Destroy()
Definition MaterialGPUBuffer.hpp:47
void _UpdateDebugName()
Definition MaterialGPUBuffer.hpp:90
std::string _debugName
Definition MaterialGPUBuffer.hpp:117
void Update(Engine::Core &core) override
Definition MaterialGPUBuffer.hpp:57
~MaterialGPUBuffer() override
Definition MaterialGPUBuffer.hpp:37
bool IsCreated(Engine::Core &core) const override
Definition MaterialGPUBuffer.hpp:56
void Destroy(Engine::Core &core) override
Definition MaterialGPUBuffer.hpp:45
void Create(Engine::Core &core) override
Definition MaterialGPUBuffer.hpp:38
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
glm::vec4 transmittance
Definition MaterialGPUBuffer.hpp:17
glm::vec4 specular
Definition MaterialGPUBuffer.hpp:16
glm::vec4 emission
Definition MaterialGPUBuffer.hpp:18
std::array< float, 3 > _padding
Definition MaterialGPUBuffer.hpp:19
glm::vec4 diffuse
Definition MaterialGPUBuffer.hpp:15
static uint32_t GPUSize()
Definition MaterialGPUBuffer.hpp:30
MaterialTransfer(const Object::Component::Material &material)
Definition MaterialGPUBuffer.hpp:22
float shininess
Definition MaterialGPUBuffer.hpp:20
static uint32_t CPUSize()
Definition MaterialGPUBuffer.hpp:29
glm::vec4 ambient
Definition MaterialGPUBuffer.hpp:14
Definition DeviceContext.hpp:7
auto & GetDevice()
Definition DeviceContext.hpp:13
Material structure.
Definition Material.hpp:41