1111
1212use std:: cell:: RefCell ;
1313use std:: rc:: Rc ;
14- use vello_common:: kurbo:: { Affine , Vec2 } ;
15- use vello_hybrid_scenes:: AnyScene ;
14+ use vello_common:: {
15+ kurbo:: { Affine , Vec2 } ,
16+ paint:: ImageId ,
17+ } ;
18+ use vello_hybrid_scenes:: { AnyScene , SceneResources } ;
1619use wasm_bindgen:: prelude:: * ;
1720use web_sys:: { Event , HtmlCanvasElement , KeyboardEvent , MouseEvent , WheelEvent } ;
1821
@@ -41,6 +44,8 @@ struct AppState {
4144 renderer_wrapper : RendererWrapper ,
4245 need_render : bool ,
4346 canvas : HtmlCanvasElement ,
47+ scene_resources : SceneResources ,
48+ uploaded_images : Vec < ImageId > ,
4449}
4550
4651impl AppState {
@@ -62,6 +67,8 @@ impl AppState {
6267 renderer_wrapper,
6368 need_render : true ,
6469 canvas,
70+ scene_resources : SceneResources :: new ( ) ,
71+ uploaded_images : Vec :: new ( ) ,
6572 } ;
6673
6774 app_state. upload_images_to_atlas ( ) ;
@@ -77,7 +84,11 @@ impl AppState {
7784 self . scene . reset ( ) ;
7885
7986 // Render the current scene with transform
80- self . scenes [ self . current_scene ] . render ( & mut self . scene , self . transform ) ;
87+ self . scenes [ self . current_scene ] . render (
88+ & mut self . scene ,
89+ self . transform ,
90+ & self . scene_resources ,
91+ ) ;
8192
8293 let render_size = vello_hybrid:: RenderSize {
8394 width : self . width ,
@@ -118,8 +129,9 @@ impl AppState {
118129 self . need_render = true ;
119130 }
120131
121- fn reset_transform ( & mut self ) {
132+ fn reset_scene ( & mut self ) {
122133 self . transform = Affine :: IDENTITY ;
134+ self . upload_images_to_atlas ( ) ;
123135 self . need_render = true ;
124136 }
125137
@@ -180,14 +192,27 @@ impl AppState {
180192 fn upload_images_to_atlas ( & mut self ) {
181193 use vello_hybrid_scenes:: image:: ImageScene ;
182194
195+ self . scene_resources . images . clear ( ) ;
196+ self . uploaded_images . clear ( ) ;
197+
183198 // 1st example — uploading pixmap directly to WebGL atlas
184199 let pixmap1 = ImageScene :: read_flower_image ( ) ;
185- self . renderer_wrapper . renderer . upload_image ( & pixmap1) ;
200+ let image_id1 = self . renderer_wrapper . renderer . upload_image ( & pixmap1) ;
186201
187202 // 2nd example — uploading from a WebGL texture
188203 let pixmap2 = ImageScene :: read_cowboy_image ( ) ;
189204 let texture2 = self . pixmap_to_webgl_texture ( & pixmap2) ;
190- self . renderer_wrapper . renderer . upload_image ( & texture2) ;
205+ let image_id2 = self . renderer_wrapper . renderer . upload_image ( & texture2) ;
206+
207+ self . scene_resources . images = vec ! [ image_id1, image_id2] ;
208+ self . uploaded_images = vec ! [ image_id2, image_id1] ;
209+ }
210+
211+ fn handle_destroy_image ( & mut self ) {
212+ if let Some ( image_id) = self . uploaded_images . pop ( ) {
213+ self . renderer_wrapper . renderer . destroy_image ( image_id) ;
214+ }
215+ self . need_render = true ;
191216 }
192217
193218 /// Convert a pixmap to WebGL texture
@@ -382,7 +407,8 @@ pub async fn run_interactive(canvas_width: u16, canvas_height: u16) {
382407 Box :: new ( move |event : KeyboardEvent | match event. key ( ) . as_str ( ) {
383408 "ArrowRight" => app_state. borrow_mut ( ) . next_scene ( ) ,
384409 "ArrowLeft" => app_state. borrow_mut ( ) . prev_scene ( ) ,
385- " " => app_state. borrow_mut ( ) . reset_transform ( ) ,
410+ "d" => app_state. borrow_mut ( ) . handle_destroy_image ( ) ,
411+ " " => app_state. borrow_mut ( ) . reset_scene ( ) ,
386412 _ => { }
387413 } ) as Box < dyn FnMut ( _) > ,
388414 ) ;
@@ -396,7 +422,7 @@ pub async fn run_interactive(canvas_width: u16, canvas_height: u16) {
396422 let document = web_sys:: window ( ) . unwrap ( ) . document ( ) . unwrap ( ) ;
397423 let instructions = document. create_element ( "div" ) . unwrap ( ) ;
398424 instructions. set_inner_html (
399- "Left/Right Arrow: Change scene | Space: Reset view | Mouse Drag: Pan | Mouse Wheel: Zoom" ,
425+ "Left/Right Arrow: Change scene | Space: Reset scene | D: Destroy image | Mouse Drag: Pan | Mouse Wheel: Zoom" ,
400426 ) ;
401427 let style = instructions
402428 . dyn_ref :: < web_sys:: HtmlElement > ( )
0 commit comments