summaryrefslogtreecommitdiff
path: root/src/3d/renderer_resources.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/3d/renderer_resources.cc')
-rw-r--r--src/3d/renderer_resources.cc54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/3d/renderer_resources.cc b/src/3d/renderer_resources.cc
new file mode 100644
index 0000000..2b001aa
--- /dev/null
+++ b/src/3d/renderer_resources.cc
@@ -0,0 +1,54 @@
+// This file is part of the 64k demo project.
+// It implements the resource management logic for Renderer3D.
+
+#include "3d/renderer.h"
+#include "util/asset_manager_utils.h"
+
+void Renderer3D::create_default_resources() {
+ global_uniform_buffer_ =
+ gpu_create_buffer(device_, sizeof(GlobalUniforms),
+ WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst,
+ nullptr)
+ .buffer;
+ object_storage_buffer_ =
+ gpu_create_buffer(device_, sizeof(ObjectData) * kMaxObjects,
+ WGPUBufferUsage_Storage | WGPUBufferUsage_CopyDst,
+ nullptr)
+ .buffer;
+ bvh_storage_buffer_ =
+ gpu_create_buffer(
+ device_,
+ sizeof(BVHNode) * kMaxObjects * 2, // Capacity for a full tree
+ WGPUBufferUsage_Storage | WGPUBufferUsage_CopyDst, nullptr)
+ .buffer;
+}
+
+const Renderer3D::MeshGpuData*
+Renderer3D::get_or_create_mesh(AssetId asset_id) {
+ auto it = mesh_cache_.find(asset_id);
+ if (it != mesh_cache_.end()) {
+ return &it->second;
+ }
+
+ MeshAsset asset = GetMeshAsset(asset_id);
+ if (!asset.vertices || asset.num_vertices == 0) {
+ return nullptr;
+ }
+
+ MeshGpuData data;
+ data.num_indices = asset.num_indices;
+
+ data.vertex_buffer =
+ gpu_create_buffer(device_, asset.num_vertices * sizeof(MeshVertex),
+ WGPUBufferUsage_Vertex | WGPUBufferUsage_CopyDst,
+ asset.vertices)
+ .buffer;
+ data.index_buffer =
+ gpu_create_buffer(device_, asset.num_indices * sizeof(uint32_t),
+ WGPUBufferUsage_Index | WGPUBufferUsage_CopyDst,
+ asset.indices)
+ .buffer;
+
+ mesh_cache_[asset_id] = data;
+ return &mesh_cache_[asset_id];
+}