twgpu_tools/
sprite_renderer.rs

1use twgpu::buffer::GpuDeviceExt as _;
2pub use twgpu::wgpu;
3
4pub enum SpriteRenderer {
5    Batched {
6        batcher: twgpu::sprites::BatchSpriteRender,
7        sprite_buffer: twgpu::buffer::GpuVecBuffer<[twgpu::sprites::SpriteVertex; 4]>,
8        texture_buffer: twgpu::buffer::GpuVecBuffer<twgpu::sprites::TextureToken>,
9    },
10    Compatibility {
11        stat: twgpu::sprites::SpritesStatic,
12        sprite_buffer: twgpu::buffer::GpuVecBuffer<[twgpu::sprites::SpriteVertex; 4]>,
13    },
14}
15
16impl SpriteRenderer {
17    pub fn new(compat: bool, format: wgpu::TextureFormat, device: &wgpu::Device) -> Self {
18        if compat {
19            let stat = twgpu::sprites::SpritesStatic::new(format, device);
20            let sprite_buffer = device.vec_buffer(None, wgpu::BufferUsages::VERTEX);
21            Self::Compatibility {
22                stat,
23                sprite_buffer,
24            }
25        } else {
26            let batcher = twgpu::sprites::BatchSpriteRender::new(format, device);
27            let sprite_buffer = device.vec_buffer(None, wgpu::BufferUsages::VERTEX);
28            let texture_buffer = device.vec_buffer(None, wgpu::BufferUsages::STORAGE);
29            Self::Batched {
30                batcher,
31                sprite_buffer,
32                texture_buffer,
33            }
34        }
35    }
36
37    #[allow(clippy::too_many_arguments)]
38    pub fn render_cache<'pass>(
39        &'pass mut self,
40        sprite_cache: &twgpu::sprites::SpriteCache,
41        camera_binding: wgpu::BufferBinding,
42        camera_index: usize,
43        textures: &'pass twgpu::sprites::SpriteTextures,
44        render_pass: &mut wgpu::RenderPass<'pass>,
45        device: &wgpu::Device,
46        queue: &wgpu::Queue,
47    ) {
48        self.render_cache_range(
49            sprite_cache,
50            0..sprite_cache.sprites().len(),
51            camera_binding,
52            camera_index,
53            textures,
54            render_pass,
55            device,
56            queue,
57        )
58    }
59
60    #[allow(clippy::too_many_arguments)]
61    pub fn render_cache_range<'pass>(
62        &'pass mut self,
63        sprite_cache: &twgpu::sprites::SpriteCache,
64        range: std::ops::Range<usize>,
65        camera_binding: wgpu::BufferBinding,
66        camera_index: usize,
67        textures: &'pass twgpu::sprites::SpriteTextures,
68        render_pass: &mut wgpu::RenderPass<'pass>,
69        device: &wgpu::Device,
70        queue: &wgpu::Queue,
71    ) {
72        match self {
73            SpriteRenderer::Batched {
74                batcher,
75                sprite_buffer,
76                texture_buffer,
77            } => {
78                sprite_buffer
79                    .upload(sprite_cache.sprites(), device, queue)
80                    .unwrap();
81                texture_buffer
82                    .upload(sprite_cache.textures(), device, queue)
83                    .unwrap();
84                batcher.render_range(
85                    range,
86                    camera_binding.clone(),
87                    camera_index,
88                    sprite_buffer,
89                    texture_buffer,
90                    textures,
91                    render_pass,
92                    device,
93                );
94            }
95            SpriteRenderer::Compatibility {
96                stat,
97                sprite_buffer,
98            } => {
99                sprite_buffer
100                    .upload(sprite_cache.sprites(), device, queue)
101                    .unwrap();
102                stat.render_range(
103                    range,
104                    camera_index,
105                    sprite_buffer,
106                    sprite_cache.textures(),
107                    textures,
108                    render_pass,
109                );
110            }
111        }
112    }
113}