From 89ca998fa8cd71ff068cb852568fcfd38c3b05d7 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 13 May 2019 18:29:33 -0700 Subject: [PATCH] Add a convenience method for creating a scene proxy with an empty scene. This makes animation rendering loops a bit easier for users. --- Cargo.lock | 1 - demo/common/src/lib.rs | 2 +- examples/canvas_minimal/src/main.rs | 2 +- examples/canvas_moire/Cargo.toml | 1 - examples/canvas_moire/src/main.rs | 19 +++++-------------- examples/canvas_text/src/main.rs | 2 +- geometry/src/outline.rs | 14 ++++++-------- renderer/src/concurrent/scene_proxy.rs | 7 ++++++- 8 files changed, 20 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbc2bb2f..da630ac5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -180,7 +180,6 @@ dependencies = [ "pathfinder_gl 0.1.0", "pathfinder_gpu 0.1.0", "pathfinder_renderer 0.1.0", - "pretty_env_logger 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "sdl2 0.32.1 (registry+https://github.com/rust-lang/crates.io-index)", "sdl2-sys 0.32.5 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index 22134b0c..147eef59 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -143,7 +143,7 @@ impl DemoApp where W: Window { viewport.size()); let camera = Camera::new(options.mode, scene_metadata.view_box, viewport.size()); - let scene_proxy = SceneProxy::new(built_svg.scene, executor); + let scene_proxy = SceneProxy::from_scene(built_svg.scene, executor); let ground_program = GroundProgram::new(&renderer.device, resources); let ground_vertex_array = GroundVertexArray::new(&renderer.device, diff --git a/examples/canvas_minimal/src/main.rs b/examples/canvas_minimal/src/main.rs index 449fdd54..815ca75f 100644 --- a/examples/canvas_minimal/src/main.rs +++ b/examples/canvas_minimal/src/main.rs @@ -74,7 +74,7 @@ fn main() { canvas.stroke_path(path); // Render the canvas to screen. - let scene = SceneProxy::new(canvas.into_scene(), RayonExecutor); + let scene = SceneProxy::from_scene(canvas.into_scene(), RayonExecutor); scene.build_and_render(&mut renderer, RenderOptions::default()); window.gl_swap_window(); diff --git a/examples/canvas_moire/Cargo.toml b/examples/canvas_moire/Cargo.toml index c8b9b4b7..0bab187d 100644 --- a/examples/canvas_moire/Cargo.toml +++ b/examples/canvas_moire/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] gl = "0.6" -pretty_env_logger = "0.3" sdl2 = "0.32" sdl2-sys = "0.32" diff --git a/examples/canvas_moire/src/main.rs b/examples/canvas_moire/src/main.rs index cf58250a..f5f2c0d5 100644 --- a/examples/canvas_moire/src/main.rs +++ b/examples/canvas_moire/src/main.rs @@ -37,8 +37,6 @@ const CIRCLE_THICKNESS: f32 = 16.0; const COLOR_CYCLE_SPEED: f32 = 0.0025; fn main() { - pretty_env_logger::init(); - // Set up SDL2. let sdl_context = sdl2::init().unwrap(); let video = sdl_context.video().unwrap(); @@ -87,7 +85,7 @@ fn main() { struct MoireRenderer { renderer: Renderer, - scene: Option, + scene: SceneProxy, frame: i32, window_size: Point2DI32, drawable_size: Point2DI32, @@ -100,7 +98,7 @@ impl MoireRenderer { -> MoireRenderer { MoireRenderer { renderer, - scene: None, + scene: SceneProxy::new(RayonExecutor), frame: 0, window_size, drawable_size, @@ -138,16 +136,9 @@ impl MoireRenderer { self.draw_circles(&mut canvas, outer_center); self.draw_circles(&mut canvas, inner_center); - // Build scene if necessary. - // TODO(pcwalton): Allow the user to build an empty scene proxy so they don't have to do this. - match self.scene { - None => self.scene = Some(SceneProxy::new(canvas.into_scene(), RayonExecutor)), - Some(ref mut scene) => scene.replace_scene(canvas.into_scene()), - } - - // Render the scene. - self.scene.as_mut().unwrap().build_and_render(&mut self.renderer, - RenderOptions::default()); + // Build and render scene. + self.scene.replace_scene(canvas.into_scene()); + self.scene.build_and_render(&mut self.renderer, RenderOptions::default()); self.frame += 1; } diff --git a/examples/canvas_text/src/main.rs b/examples/canvas_text/src/main.rs index db0a455e..7490b499 100644 --- a/examples/canvas_text/src/main.rs +++ b/examples/canvas_text/src/main.rs @@ -62,7 +62,7 @@ fn main() { canvas.stroke_text("Goodbye Pathfinder!", Point2DF32::new(32.0, 96.0)); // Render the canvas to screen. - let scene = SceneProxy::new(canvas.into_scene(), RayonExecutor); + let scene = SceneProxy::from_scene(canvas.into_scene(), RayonExecutor); scene.build_and_render(&mut renderer, RenderOptions::default()); window.gl_swap_window(); diff --git a/geometry/src/outline.rs b/geometry/src/outline.rs index 7b5e3699..71fa6856 100644 --- a/geometry/src/outline.rs +++ b/geometry/src/outline.rs @@ -369,14 +369,12 @@ impl Contour { let rotation = Transform2DF32::from_rotation(angle); segment = segment.transform(&scale.post_mul(&rotation).post_mul(&translation)); - /* - println!("angle={} start_angle={} end_angle={} sweep_angle={} segment={:?}", - angle, - start_angle, - end_angle, - sweep_angle, - segment); - */ + debug!("angle={} start_angle={} end_angle={} sweep_angle={} segment={:?}", + angle, + start_angle, + end_angle, + sweep_angle, + segment); if first_segment { self.push_full_segment(&segment, true); diff --git a/renderer/src/concurrent/scene_proxy.rs b/renderer/src/concurrent/scene_proxy.rs index 52534cae..cefb7dcc 100644 --- a/renderer/src/concurrent/scene_proxy.rs +++ b/renderer/src/concurrent/scene_proxy.rs @@ -36,7 +36,12 @@ pub struct SceneProxy { } impl SceneProxy { - pub fn new(scene: Scene, executor: E) -> SceneProxy where E: Executor + Send + 'static { + pub fn new(executor: E) -> SceneProxy where E: Executor + Send + 'static { + SceneProxy::from_scene(Scene::new(), executor) + } + + pub fn from_scene(scene: Scene, executor: E) -> SceneProxy + where E: Executor + Send + 'static { let (main_to_worker_sender, main_to_worker_receiver) = mpsc::channel(); thread::spawn(move || scene_thread(scene, executor, main_to_worker_receiver)); SceneProxy { sender: main_to_worker_sender }