Skip to main content

ursus_core/assets/registry/
mesh.rs

1use crate::assets::mesh::CpuMesh;
2use crate::assets::upload::GpuUploadRequest;
3use crate::assets::upload_queue::UploadQueue;
4use ursus_ecs::components::mesh::MeshHandle;
5
6#[derive(Default)]
7struct MeshHandleAllocator {
8    next: u32,
9}
10
11impl MeshHandleAllocator {
12    fn alloc(&mut self) -> MeshHandle {
13        let id = self.next;
14        self.next += 1;
15        MeshHandle(id)
16    }
17}
18
19/// CPU-side mesh registration. Assigns stable handles and queues meshes
20/// for GPU upload; never touches Vulkan directly.
21#[derive(Default)]
22pub struct MeshRegistry {
23    handles: MeshHandleAllocator,
24    upload_queue: UploadQueue,
25}
26
27impl MeshRegistry {
28    pub fn upload(&mut self, mesh: CpuMesh) -> MeshHandle {
29        let handle = self.handles.alloc();
30        self.upload_queue.push(GpuUploadRequest::Mesh {
31            handle,
32            vertices: mesh.vertices,
33            indices: mesh.indices,
34            name: mesh.name,
35        });
36        handle
37    }
38
39    pub(crate) fn flush_uploads(&mut self, tx: &std::sync::mpsc::Sender<GpuUploadRequest>) {
40        self.upload_queue.drain_to(tx);
41    }
42}