wde_renderer/utils/
ssbo_mesh.rs1use bevy::{ecs::system::SystemParamItem, prelude::*};
2use wde_wgpu::{buffer::BufferUsage, utils::Vertex};
3
4use crate::prelude::*;
5
6const MAX_VERTICES: usize = 1_000_000;
8const MAX_INDICES: usize = 3_000_000;
10
11#[derive(Resource, Default)]
13pub struct SsboMeshDescriptor {
14 pub vertex_buffer_offset: u32,
16 pub index_buffer_offset: u32
17}
18
19#[derive(Asset, Clone, TypePath, Default)]
23pub struct SsboMesh;
24impl SsboMesh {
25 pub const VERTEX_BUFFER_ID: u32 = 0;
26 pub const INDEX_BUFFER_ID: u32 = 1;
27}
28impl RenderData for SsboMesh {
29 type Params = ();
30
31 fn describe(_params: &mut SystemParamItem<Self::Params>, builder: &mut RenderDataBuilder) {
32 builder.add_buffer(
33 Self::VERTEX_BUFFER_ID,
34 Buffer {
35 label: "ssbo-mesh-vertex-buffer-gpu".to_string(),
36 size: std::mem::size_of::<Vertex>() * MAX_VERTICES,
37 usage: BufferUsage::STORAGE | BufferUsage::COPY_DST,
38 content: None
39 }
40 );
41 builder.add_buffer(
42 Self::INDEX_BUFFER_ID,
43 Buffer {
44 label: "ssbo-mesh-index-buffer-gpu".to_string(),
45 size: std::mem::size_of::<u32>() * MAX_INDICES,
46 usage: BufferUsage::STORAGE | BufferUsage::COPY_DST,
47 content: None
48 }
49 );
50 }
51}
52
53#[derive(Asset, Clone, TypePath, Default)]
54pub struct SsboMeshBinding;
55impl RenderBinding for SsboMeshBinding {
56 type Params = SRenderData<SsboMesh>;
57
58 fn describe(
59 &mut self,
60 render_binding: &SystemParamItem<Self::Params>,
61 builder: &mut RenderBindingBuilder
62 ) {
63 builder.add_buffer(render_binding, SsboMesh::VERTEX_BUFFER_ID);
64 builder.add_buffer(render_binding, SsboMesh::INDEX_BUFFER_ID);
65 }
66
67 fn label(&self) -> &'static str {
68 "ssbo_mesh_binding"
69 }
70}