twgpu_tools/
sprite_renderer.rs1use 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}