@@ -3,7 +3,12 @@ pub use instance_data::QuadInstance;
33
44use wgpu_jumpstart:: { wgpu, Gpu , Instances , Shape , TransformUniform , Uniform } ;
55
6- type QuadsLayer = Instances < QuadInstance > ;
6+ use crate :: utils:: Rect ;
7+
8+ pub struct QuadsLayer {
9+ scissor_rect : Rect ,
10+ quads : Instances < QuadInstance > ,
11+ }
712
813#[ derive( Clone ) ]
914pub struct QuadPipeline {
@@ -55,20 +60,23 @@ impl QuadPipeline {
5560 }
5661
5762 pub fn new_layer ( device : & wgpu:: Device , size : usize ) -> QuadsLayer {
58- Instances :: new ( device, size)
63+ QuadsLayer {
64+ scissor_rect : Rect :: zero ( ) ,
65+ quads : Instances :: new ( device, size) ,
66+ }
5967 }
6068
6169 #[ profiling:: function]
62- pub fn render < ' a > ( & ' a self , render_pass : & mut wgpu:: RenderPass < ' a > , instances : & QuadsLayer ) {
70+ pub fn render < ' a > ( & ' a self , render_pass : & mut wgpu:: RenderPass < ' a > , layer : & QuadsLayer ) {
6371 render_pass. set_pipeline ( & self . render_pipeline ) ;
6472 render_pass. set_bind_group ( 0 , & self . transform_uniform_bind_group , & [ ] ) ;
6573
6674 render_pass. set_vertex_buffer ( 0 , self . quad . vertex_buffer . slice ( ..) ) ;
67- render_pass. set_vertex_buffer ( 1 , instances . buffer . slice ( ..) ) ;
75+ render_pass. set_vertex_buffer ( 1 , layer . quads . buffer . slice ( ..) ) ;
6876
6977 render_pass. set_index_buffer ( self . quad . index_buffer . slice ( ..) , wgpu:: IndexFormat :: Uint16 ) ;
7078
71- render_pass. draw_indexed ( 0 ..self . quad . indices_len , 0 , 0 ..instances . len ( ) ) ;
79+ render_pass. draw_indexed ( 0 ..self . quad . indices_len , 0 , 0 ..layer . quads . len ( ) ) ;
7280 }
7381}
7482
@@ -89,34 +97,71 @@ impl<'a> QuadRenderer {
8997 }
9098 }
9199
100+ pub fn is_empty ( & self ) -> bool {
101+ self . len ( ) == 0
102+ }
103+
104+ pub fn len ( & self ) -> usize {
105+ self . layers . len ( )
106+ }
107+
108+ pub fn ensure_n_layers ( & mut self , count : usize ) {
109+ self . layers
110+ . resize_with ( count, || QuadPipeline :: new_layer ( & self . device , 100 ) ) ;
111+ }
112+
92113 pub fn init_layer ( & mut self , size : usize ) {
93114 self . layers
94115 . push ( QuadPipeline :: new_layer ( & self . device , size) ) ;
95116 }
96117
97118 #[ profiling:: function]
98- pub fn render ( & ' a self , layer_id : usize , render_pass : & mut wgpu:: RenderPass < ' a > ) {
99- self . pipeline . render ( render_pass, & self . layers [ layer_id] ) ;
119+ pub fn render ( & ' a self , layer_id : usize , render_pass : & mut wgpu_jumpstart:: RenderPass < ' a > ) {
120+ let layer = & self . layers [ layer_id] ;
121+
122+ let pass_size = render_pass. size ( ) ;
123+
124+ if layer. scissor_rect == Rect :: zero ( ) {
125+ render_pass. set_scissor_rect ( 0 , 0 , pass_size. width , pass_size. height ) ;
126+ } else {
127+ render_pass. set_scissor_rect (
128+ layer. scissor_rect . origin . x as u32 ,
129+ layer. scissor_rect . origin . y as u32 ,
130+ layer. scissor_rect . size . width as u32 ,
131+ layer. scissor_rect . size . height as u32 ,
132+ ) ;
133+ }
134+
135+ self . pipeline . render ( render_pass, layer) ;
136+
137+ // Revert
138+ if layer. scissor_rect != Rect :: zero ( ) {
139+ render_pass. set_scissor_rect ( 0 , 0 , pass_size. width , pass_size. height ) ;
140+ }
100141 }
101142
102143 pub fn clear ( & mut self ) {
103144 for layer in self . layers . iter_mut ( ) {
104- layer. data . clear ( ) ;
145+ layer. quads . data . clear ( ) ;
105146 }
106147 }
107148
108149 pub fn layer ( & mut self , layer_id : usize ) -> & mut Vec < QuadInstance > {
109- & mut self . layers [ layer_id] . data
150+ & mut self . layers [ layer_id] . quads . data
151+ }
152+
153+ pub fn set_scissor_rect ( & mut self , layer_id : usize , rect : Rect ) {
154+ self . layers [ layer_id] . scissor_rect = rect;
110155 }
111156
112157 pub fn push ( & mut self , layer_id : usize , quad : QuadInstance ) {
113- self . layers [ layer_id] . data . push ( quad)
158+ self . layers [ layer_id] . quads . data . push ( quad)
114159 }
115160
116161 #[ profiling:: function]
117162 pub fn prepare ( & mut self ) {
118163 for layer in self . layers . iter_mut ( ) {
119- layer. update ( & self . device , & self . queue ) ;
164+ layer. quads . update ( & self . device , & self . queue ) ;
120165 }
121166 }
122167}
0 commit comments