// 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]; }