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_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)",
]

View File

@ -143,7 +143,7 @@ impl<W> DemoApp<W> 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,

View File

@ -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();

View File

@ -6,7 +6,6 @@ edition = "2018"
[dependencies]
gl = "0.6"
pretty_env_logger = "0.3"
sdl2 = "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;
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<GLDevice>,
scene: Option<SceneProxy>,
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;
}

View File

@ -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();

View File

@ -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={:?}",
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);

View File

@ -36,7 +36,12 @@ pub struct 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();
thread::spawn(move || scene_thread(scene, executor, main_to_worker_receiver));
SceneProxy { sender: main_to_worker_sender }