Skip to content

Commit 5f0fc97

Browse files
committed
Implement serialized scene playback in the winit example
1 parent 0691c2d commit 5f0fc97

4 files changed

Lines changed: 71 additions & 35 deletions

File tree

Cargo.lock

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ pollster = "0.4"
7878
# Dev-dependencies
7979
winit = { version = "0.30.2", features = ["rwh_06"] }
8080

81-
# [patch.crates-io]
81+
[patch.crates-io]
82+
kurbo = { git = "https://github.com/linebender/kurbo", rev = "868cd631beee6f787d63113a9eb72e8c005fa33c" }
8283
# vello = { path = "../vello/vello" }
8384
# vello_cpu = { path = "../vello/sparse_strips/vello_cpu" }
8485
# vello_hybrid = { path = "../vello/sparse_strips/vello_hybrid" }

examples/winit/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ kurbo = { workspace = true }
1010
winit = { workspace = true }
1111
peniko = { workspace = true }
1212
anyrender = { workspace = true }
13+
anyrender_serialize = { workspace = true }
1314
anyrender_vello = { workspace = true }
1415
anyrender_skia = { workspace = true }
1516
anyrender_vello_hybrid = { workspace = true }

examples/winit/src/main.rs

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use anyrender::{NullWindowRenderer, PaintScene, WindowRenderer};
1+
use anyrender::{NullWindowRenderer, PaintScene, Scene, WindowRenderer};
2+
use anyrender_serialize::SceneArchive;
23
use anyrender_skia::SkiaWindowRenderer;
34
use anyrender_vello::VelloWindowRenderer;
45
use anyrender_vello_cpu::{PixelsWindowRenderer, SoftbufferWindowRenderer, VelloCpuImageRenderer};
56
use anyrender_vello_hybrid::VelloHybridWindowRenderer;
67
use kurbo::{Affine, Circle, Point, Rect, Stroke};
78
use peniko::{Color, Fill};
8-
use std::sync::Arc;
9+
use std::{path::PathBuf, sync::Arc};
910
use winit::{
1011
application::ApplicationHandler,
1112
event::{ElementState, KeyEvent, WindowEvent},
@@ -16,6 +17,7 @@ use winit::{
1617

1718
struct App {
1819
render_state: RenderState,
20+
scene: Scene,
1921
width: u32,
2022
height: u32,
2123
}
@@ -119,30 +121,6 @@ impl App {
119121
}
120122
}
121123

122-
fn draw_scene<T: PaintScene>(scene: &mut T, color: Color) {
123-
scene.fill(
124-
Fill::NonZero,
125-
Affine::IDENTITY,
126-
Color::WHITE,
127-
None,
128-
&Rect::new(0.0, 0.0, 50.0, 50.0),
129-
);
130-
scene.stroke(
131-
&Stroke::new(2.0),
132-
Affine::IDENTITY,
133-
Color::BLACK,
134-
None,
135-
&Rect::new(5.0, 5.0, 35.0, 35.0),
136-
);
137-
scene.fill(
138-
Fill::NonZero,
139-
Affine::IDENTITY,
140-
color,
141-
None,
142-
&Circle::new(Point::new(20.0, 20.0), 10.0),
143-
);
144-
}
145-
146124
fn set_backend<R: WindowRenderer + Into<Renderer>>(
147125
&mut self,
148126
mut renderer: R,
@@ -204,15 +182,23 @@ impl ApplicationHandler for App {
204182
}
205183
WindowEvent::RedrawRequested => match renderer {
206184
Renderer::Skia(r) => {
207-
r.render(|p| App::draw_scene(p, Color::from_rgb8(128, 128, 128)))
185+
r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY))
186+
}
187+
Renderer::Gpu(r) => {
188+
r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY))
189+
}
190+
Renderer::Hybrid(r) => {
191+
r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY))
192+
}
193+
Renderer::Cpu(r) => {
194+
r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY))
208195
}
209-
Renderer::Gpu(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(255, 0, 0))),
210-
Renderer::Hybrid(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 0))),
211-
Renderer::Cpu(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 255, 0))),
212196
Renderer::CpuSoftbuffer(r) => {
213-
r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 255)))
197+
r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY))
198+
}
199+
Renderer::Null(r) => {
200+
r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY))
214201
}
215-
Renderer::Null(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 0))),
216202
},
217203
WindowEvent::KeyboardInput {
218204
event:
@@ -245,8 +231,20 @@ impl ApplicationHandler for App {
245231
}
246232

247233
fn main() {
234+
let mut args = std::env::args_os();
235+
let maybe_path = args.nth(1).map(|s| PathBuf::from(s));
236+
237+
let scene = if let Some(path) = maybe_path {
238+
let file = std::fs::File::open(&path).expect("File not found");
239+
let archive = SceneArchive::deserialize(file).expect("Failed to deserialize archive");
240+
archive.to_scene().expect("Failed to convert archive to scene")
241+
} else {
242+
default_scene()
243+
};
244+
248245
let mut app = App {
249246
render_state: RenderState::Suspended(None),
247+
scene,
250248
width: 800,
251249
height: 600,
252250
};
@@ -256,3 +254,30 @@ fn main() {
256254
.run_app(&mut app)
257255
.expect("Couldn't run event loop");
258256
}
257+
258+
fn default_scene() -> Scene {
259+
let mut scene = Scene::new();
260+
scene.fill(
261+
Fill::NonZero,
262+
Affine::IDENTITY,
263+
Color::WHITE,
264+
None,
265+
&Rect::new(0.0, 0.0, 50.0, 50.0),
266+
);
267+
scene.stroke(
268+
&Stroke::new(2.0),
269+
Affine::IDENTITY,
270+
Color::BLACK,
271+
None,
272+
&Rect::new(5.0, 5.0, 35.0, 35.0),
273+
);
274+
scene.fill(
275+
Fill::NonZero,
276+
Affine::IDENTITY,
277+
Color::from_rgb8(255, 0, 0),
278+
None,
279+
&Circle::new(Point::new(20.0, 20.0), 10.0),
280+
);
281+
282+
scene
283+
}

0 commit comments

Comments
 (0)