wde_pbr/deferred/transform/
ssbo_transforms.rs

1use bevy::{ecs::system::SystemParamItem, prelude::*};
2use wde_camera::prelude::*;
3use wde_renderer::prelude::*;
4
5/// The maximum number of entity transforms in the ssbo.
6pub const SSBO_TRANSFORM_MAX_ENTITY: usize = 100_000;
7
8pub(crate) struct SsboTransformPlugin;
9impl Plugin for SsboTransformPlugin {
10    fn build(&self, app: &mut App) {
11        app.add_plugins(RenderDataRegisterPlugin::<PbrSsboTransform>::default());
12    }
13}
14
15/// Contains the transform data for the entities in the scene.
16/// See [crate::deferred] level documentation for more details on how this is used, and how it is updated.
17#[derive(Asset, Clone, TypePath, Default)]
18pub struct PbrSsboTransform;
19impl PbrSsboTransform {
20    pub const TRANSFORM_IDX: u32 = 0;
21    pub const TRANSFORM_STAGING_IDX: u32 = 1;
22}
23impl RenderData for PbrSsboTransform {
24    type Params = ();
25
26    fn describe(_params: &mut SystemParamItem<Self::Params>, builder: &mut RenderDataBuilder) {
27        builder
28            .add_buffer(
29                Self::TRANSFORM_IDX,
30                Buffer {
31                    label: "pbr-ssbo-transform-gpu".to_string(),
32                    size: std::mem::size_of::<TransformUniform>() * SSBO_TRANSFORM_MAX_ENTITY,
33                    usage: BufferUsage::STORAGE | BufferUsage::COPY_DST,
34                    content: None
35                }
36            )
37            .add_buffer(
38                Self::TRANSFORM_STAGING_IDX,
39                Buffer {
40                    label: "pbr-ssbo-transform-staging".to_string(),
41                    size: std::mem::size_of::<TransformUniform>() * SSBO_TRANSFORM_MAX_ENTITY,
42                    usage: BufferUsage::COPY_SRC | BufferUsage::COPY_DST,
43                    content: None
44                }
45            );
46    }
47}