Add a convenience method for creating a scene proxy with an empty scene.

This makes animation rendering loops a bit easier for users.
This commit is contained in:
Patrick Walton 2019-05-13 18:29:33 -07:00
parent d5a12e0e9f
commit 89ca998fa8
8 changed files with 20 additions and 28 deletions

1
Cargo.lock generated
View File

@ -180,7 +180,6 @@ dependencies = [
"pathfinder_gl 0.1.0", "pathfinder_gl 0.1.0",
"pathfinder_gpu 0.1.0", "pathfinder_gpu 0.1.0",
"pathfinder_renderer 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 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)", "sdl2-sys 0.32.5 (registry+https://github.com/rust-lang/crates.io-index)",
] ]

View File

@ -143,7 +143,7 @@ impl<W> DemoApp<W> where W: Window {
viewport.size()); viewport.size());
let camera = Camera::new(options.mode, scene_metadata.view_box, 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_program = GroundProgram::new(&renderer.device, resources);
let ground_vertex_array = GroundVertexArray::new(&renderer.device, let ground_vertex_array = GroundVertexArray::new(&renderer.device,

View File

@ -74,7 +74,7 @@ fn main() {
canvas.stroke_path(path); canvas.stroke_path(path);
// Render the canvas to screen. // 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()); scene.build_and_render(&mut renderer, RenderOptions::default());
window.gl_swap_window(); window.gl_swap_window();

View File

@ -6,7 +6,6 @@ edition = "2018"
[dependencies] [dependencies]
gl = "0.6" gl = "0.6"
pretty_env_logger = "0.3"
sdl2 = "0.32" sdl2 = "0.32"
sdl2-sys = "0.32" sdl2-sys = "0.32"

View File

@ -37,8 +37,6 @@ const CIRCLE_THICKNESS: f32 = 16.0;
const COLOR_CYCLE_SPEED: f32 = 0.0025; const COLOR_CYCLE_SPEED: f32 = 0.0025;
fn main() { fn main() {
pretty_env_logger::init();
// Set up SDL2. // Set up SDL2.
let sdl_context = sdl2::init().unwrap(); let sdl_context = sdl2::init().unwrap();
let video = sdl_context.video().unwrap(); let video = sdl_context.video().unwrap();
@ -87,7 +85,7 @@ fn main() {
struct MoireRenderer { struct MoireRenderer {
renderer: Renderer<GLDevice>, renderer: Renderer<GLDevice>,
scene: Option<SceneProxy>, scene: SceneProxy,
frame: i32, frame: i32,
window_size: Point2DI32, window_size: Point2DI32,
drawable_size: Point2DI32, drawable_size: Point2DI32,
@ -100,7 +98,7 @@ impl MoireRenderer {
-> MoireRenderer { -> MoireRenderer {
MoireRenderer { MoireRenderer {
renderer, renderer,
scene: None, scene: SceneProxy::new(RayonExecutor),
frame: 0, frame: 0,
window_size, window_size,
drawable_size, drawable_size,
@ -138,16 +136,9 @@ impl MoireRenderer {
self.draw_circles(&mut canvas, outer_center); self.draw_circles(&mut canvas, outer_center);
self.draw_circles(&mut canvas, inner_center); self.draw_circles(&mut canvas, inner_center);
// Build scene if necessary. // Build and render scene.
// TODO(pcwalton): Allow the user to build an empty scene proxy so they don't have to do this. self.scene.replace_scene(canvas.into_scene());
match self.scene { self.scene.build_and_render(&mut self.renderer, RenderOptions::default());
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());
self.frame += 1; self.frame += 1;
} }

View File

@ -62,7 +62,7 @@ fn main() {
canvas.stroke_text("Goodbye Pathfinder!", Point2DF32::new(32.0, 96.0)); canvas.stroke_text("Goodbye Pathfinder!", Point2DF32::new(32.0, 96.0));
// Render the canvas to screen. // 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()); scene.build_and_render(&mut renderer, RenderOptions::default());
window.gl_swap_window(); window.gl_swap_window();

View File

@ -369,14 +369,12 @@ impl Contour {
let rotation = Transform2DF32::from_rotation(angle); let rotation = Transform2DF32::from_rotation(angle);
segment = segment.transform(&scale.post_mul(&rotation).post_mul(&translation)); segment = segment.transform(&scale.post_mul(&rotation).post_mul(&translation));
/* debug!("angle={} start_angle={} end_angle={} sweep_angle={} segment={:?}",
println!("angle={} start_angle={} end_angle={} sweep_angle={} segment={:?}",
angle, angle,
start_angle, start_angle,
end_angle, end_angle,
sweep_angle, sweep_angle,
segment); segment);
*/
if first_segment { if first_segment {
self.push_full_segment(&segment, true); self.push_full_segment(&segment, true);

View File

@ -36,7 +36,12 @@ pub struct SceneProxy {
} }
impl SceneProxy { impl SceneProxy {
pub fn new<E>(scene: Scene, executor: E) -> SceneProxy where E: Executor + Send + 'static { pub fn new<E>(executor: E) -> SceneProxy where E: Executor + Send + 'static {
SceneProxy::from_scene(Scene::new(), executor)
}
pub fn from_scene<E>(scene: Scene, executor: E) -> SceneProxy
where E: Executor + Send + 'static {
let (main_to_worker_sender, main_to_worker_receiver) = mpsc::channel(); let (main_to_worker_sender, main_to_worker_receiver) = mpsc::channel();
thread::spawn(move || scene_thread(scene, executor, main_to_worker_receiver)); thread::spawn(move || scene_thread(scene, executor, main_to_worker_receiver));
SceneProxy { sender: main_to_worker_sender } SceneProxy { sender: main_to_worker_sender }