ascending_graphics/images/
render.rs1use crate::{
2 AtlasSet, GpuRenderer, GraphicsError, Image, ImageRenderPipeline,
3 ImageVertex, InstanceBuffer, OrderedIndex, StaticVertexBuffer, System,
4};
5
6#[derive(Debug)]
9pub struct ImageRenderer {
10 pub buffer: InstanceBuffer<ImageVertex>,
11}
12
13impl ImageRenderer {
14 pub fn new(renderer: &GpuRenderer) -> Result<Self, GraphicsError> {
17 Ok(Self {
18 buffer: InstanceBuffer::new(renderer.gpu_device(), 512),
19 })
20 }
21
22 pub fn add_buffer_store(
30 &mut self,
31 renderer: &GpuRenderer,
32 index: OrderedIndex,
33 buffer_layer: usize,
34 ) {
35 self.buffer.add_buffer_store(renderer, index, buffer_layer);
36 }
37
38 pub fn finalize(&mut self, renderer: &mut GpuRenderer) {
42 self.buffer.finalize(renderer)
43 }
44
45 pub fn update(
54 &mut self,
55 image: &mut Image,
56 renderer: &mut GpuRenderer,
57 atlas: &mut AtlasSet,
58 buffer_layer: usize,
59 ) {
60 let index = image.update(renderer, atlas);
61
62 self.add_buffer_store(renderer, index, buffer_layer);
63 }
64
65 pub fn use_clipping(&mut self) {
69 self.buffer.set_as_clipped();
70 }
71}
72
73pub trait RenderImage<'a, 'b, Controls>
75where
76 'b: 'a,
77 Controls: camera::controls::Controls,
78{
79 fn render_image(
82 &mut self,
83 renderer: &'b GpuRenderer,
84 buffer: &'b ImageRenderer,
85 atlas: &'b AtlasSet,
86 system: &'b System<Controls>,
87 buffer_layer: usize,
88 );
89}
90
91impl<'a, 'b, Controls> RenderImage<'a, 'b, Controls> for wgpu::RenderPass<'a>
92where
93 'b: 'a,
94 Controls: camera::controls::Controls,
95{
96 fn render_image(
97 &mut self,
98 renderer: &'b GpuRenderer,
99 buffer: &'b ImageRenderer,
100 atlas: &'b AtlasSet,
101 system: &'b System<Controls>,
102 buffer_layer: usize,
103 ) {
104 if buffer.buffer.is_clipped() {
105 if let Some(details) =
106 buffer.buffer.clipped_buffers.get(buffer_layer)
107 {
108 let mut scissor_is_default = true;
109
110 if buffer.buffer.count() > 0 {
111 self.set_bind_group(1, atlas.bind_group(), &[]);
112 self.set_vertex_buffer(1, buffer.buffer.instances(None));
113 self.set_pipeline(
114 renderer.get_pipelines(ImageRenderPipeline).unwrap(),
115 );
116 for (details, bounds, camera_type) in details {
117 if let Some(bounds) = bounds {
118 let bounds =
119 system.world_to_screen(*camera_type, bounds);
120
121 self.set_scissor_rect(
122 bounds.x as u32,
123 bounds.y as u32,
124 bounds.z as u32,
125 bounds.w as u32,
126 );
127 scissor_is_default = false;
128 }
129
130 self.draw_indexed(
131 0..StaticVertexBuffer::index_count(),
132 0,
133 details.start..details.end,
134 );
135
136 if !scissor_is_default {
137 self.set_scissor_rect(
138 0,
139 0,
140 system.screen_size[0] as u32,
141 system.screen_size[1] as u32,
142 );
143 scissor_is_default = true;
144 };
145 }
146 }
147 }
148 } else if let Some(Some(details)) =
149 buffer.buffer.buffers.get(buffer_layer)
150 {
151 if buffer.buffer.count() > 0 {
152 self.set_bind_group(1, atlas.bind_group(), &[]);
153 self.set_vertex_buffer(1, buffer.buffer.instances(None));
154 self.set_pipeline(
155 renderer.get_pipelines(ImageRenderPipeline).unwrap(),
156 );
157
158 self.draw_indexed(
159 0..StaticVertexBuffer::index_count(),
160 0,
161 details.start..details.end,
162 );
163 }
164 }
165 }
166}