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:
parent
d5a12e0e9f
commit
89ca998fa8
|
@ -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)",
|
||||||
]
|
]
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
Loading…
Reference in New Issue