Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
CameraGPUBuffer.hpp
Go to the documentation of this file.
1#pragma once
2
6#include "entity/Entity.hpp"
9#include <glm/gtc/type_ptr.hpp>
10
12
14
15 public:
19 glm::vec3 position;
20
22 : viewProjectionMatrix(camera.viewProjection), invViewProjectionMatrix(camera.inverseViewProjection),
23 position(transform.GetPosition())
24 {
25 }
26
27 static uint32_t CPUSize() { return sizeof(CameraTransfer); }
28 static uint32_t GPUSize() { return sizeof(CameraTransfer) + sizeof(float); }
29 };
30
31 explicit CameraGPUBuffer(Engine::Entity entity) : _entity(entity) {}
32 ~CameraGPUBuffer() override { Destroy(); }
33
34 void Create(Engine::Core &core) override
35 {
36 const auto &camera = _entity.GetComponents<Object::Component::Camera>();
37 const auto &transform = _entity.GetComponents<Object::Component::Transform>();
38 const auto &deviceContext = core.GetResource<Graphic::Resource::DeviceContext>();
39 const auto &queue = core.GetResource<Graphic::Resource::Queue>();
40
41 _buffer = _CreateBuffer(deviceContext);
42 _UpdateBuffer(camera, transform, queue);
43 _isCreated = true;
44 }
45
46 void Destroy(Engine::Core &) override { Destroy(); }
47
48 void Destroy()
49 {
50 if (_isCreated)
51 {
52 _isCreated = false;
53 _buffer.release();
54 }
55 }
56
57 bool IsCreated(Engine::Core &) const override { return _isCreated; }
58
59 void Update(Engine::Core &core) override
60 {
61 if (!_isCreated)
62 {
63 throw Graphic::Exception::UpdateBufferError("Cannot update a GPU camera buffer that is not created.");
64 }
65 const auto &cameraComponent = _entity.GetComponents<Object::Component::Camera>();
66 const auto &transform = _entity.GetComponents<Object::Component::Transform>();
67 const auto &queue = core.GetResource<Graphic::Resource::Queue>();
68 _UpdateBuffer(cameraComponent, transform, queue);
69 }
70
71 const wgpu::Buffer &GetBuffer() const override { return _buffer; }
72
73 private:
75 {
76 wgpu::BufferDescriptor bufferDesc(wgpu::Default);
77 std::string label = fmt::format("CameraUniformBuffer_{}", _entity);
78 bufferDesc.label = wgpu::StringView(label);
79 bufferDesc.usage = wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::Uniform;
80 bufferDesc.size = CameraTransfer::GPUSize();
81
82 return context.GetDevice()->createBuffer(bufferDesc);
83 }
84
86 const Graphic::Resource::Queue &queue)
87 {
88 const CameraTransfer cameraTransfer(camera, transform);
89 queue->writeBuffer(_buffer, 0, std::addressof(cameraTransfer), CameraTransfer::CPUSize());
90 }
91
93 bool _isCreated = false;
94 wgpu::Buffer _buffer;
95};
96} // namespace DefaultPipeline::Resource
void Update(Engine::Core &core) override
Definition CameraGPUBuffer.hpp:59
void _UpdateBuffer(const Object::Component::Camera &camera, const Object::Component::Transform &transform, const Graphic::Resource::Queue &queue)
Definition CameraGPUBuffer.hpp:85
~CameraGPUBuffer() override
Definition CameraGPUBuffer.hpp:32
void Create(Engine::Core &core) override
Definition CameraGPUBuffer.hpp:34
wgpu::Buffer _buffer
Definition CameraGPUBuffer.hpp:94
bool _isCreated
Definition CameraGPUBuffer.hpp:93
CameraGPUBuffer(Engine::Entity entity)
Definition CameraGPUBuffer.hpp:31
const wgpu::Buffer & GetBuffer() const override
Definition CameraGPUBuffer.hpp:71
wgpu::Buffer _CreateBuffer(const Graphic::Resource::DeviceContext &context)
Definition CameraGPUBuffer.hpp:74
Engine::Entity _entity
Definition CameraGPUBuffer.hpp:92
void Destroy()
Definition CameraGPUBuffer.hpp:48
void Destroy(Engine::Core &) override
Definition CameraGPUBuffer.hpp:46
bool IsCreated(Engine::Core &) const override
Definition CameraGPUBuffer.hpp:57
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.ipp: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 Queue.hpp:6
Definition AmbientLight.cpp:6
constexpr DefaultFlag Default
Definition webgpu.hpp:78
StringView(const std::string_view &cpp)
Definition webgpu.hpp:618
glm::vec3 position
Definition CameraGPUBuffer.hpp:19
glm::mat4 invViewProjectionMatrix
Definition CameraGPUBuffer.hpp:18
CameraTransfer(const Object::Component::Camera &camera, const Object::Component::Transform &transform)
Definition CameraGPUBuffer.hpp:21
glm::mat4 viewProjectionMatrix
Definition CameraGPUBuffer.hpp:17
static uint32_t CPUSize()
Definition CameraGPUBuffer.hpp:27
static uint32_t GPUSize()
Definition CameraGPUBuffer.hpp:28
Definition DeviceContext.hpp:7
auto & GetDevice()
Definition DeviceContext.hpp:19
Definition Camera.hpp:10
Definition Transform.hpp:18