From b6e334a5bbbb77c738da8b5af751d0c11899d304 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 21 Feb 2019 12:09:02 -0800 Subject: [PATCH] Fix temporal inconsistency in the demo between transform applied between vector scene and environment --- demo/common/src/lib.rs | 60 ++++++++++++++++++++---------------------- demo/common/src/ui.rs | 10 +++---- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index 63a4a1a5..5a02d399 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -135,7 +135,7 @@ impl DemoApp { let scene_thread_proxy = SceneThreadProxy::new(base_scene, options.clone()); update_drawable_size(&window, &scene_thread_proxy); - let camera = if options.threed { Camera::three_d() } else { Camera::two_d() }; + let camera = if options.three_d { Camera::three_d() } else { Camera::two_d() }; let ground_program = GroundProgram::new(&device); let ground_solid_vertex_array = @@ -193,7 +193,7 @@ impl DemoApp { if transform.offset(*velocity) { self.dirty = true; } - RenderTransform::Perspective(transform.to_perspective(drawable_size, true)) + RenderTransform::Perspective(transform.to_perspective(drawable_size)) } Camera::TwoD(transform) => RenderTransform::Transform2D(transform), }; @@ -316,10 +316,14 @@ impl DemoApp { } fn draw_scene(&mut self, render_msg: SceneToMainMsg, mut ui_event: UIEvent) { - let SceneToMainMsg::Render { built_scene, tile_time } = render_msg; + let SceneToMainMsg::Render { + built_scene, + transform: render_transform, + tile_time, + } = render_msg; self.device.clear(); - self.draw_environment(); + self.draw_environment(&render_transform); self.render_vector_scene(&built_scene); let rendering_time = self.renderer.shift_timer_query(); @@ -337,7 +341,7 @@ impl DemoApp { // Switch camera mode (2D/3D) if requested. // // FIXME(pcwalton): This mess should really be an MVC setup. - match (&self.camera, self.ui.threed_enabled) { + match (&self.camera, self.ui.three_d_enabled) { (&Camera::TwoD { .. }, true) => self.camera = Camera::three_d(), (&Camera::ThreeD { .. }, false) => self.camera = Camera::two_d(), _ => {} @@ -360,16 +364,12 @@ impl DemoApp { self.frame_counter += 1; } - fn draw_environment(&self) { - let transform = match self.camera { - Camera::TwoD(..) => return, - Camera::ThreeD { ref transform, .. } => *transform, + fn draw_environment(&self, render_transform: &RenderTransform) { + let perspective = match *render_transform { + RenderTransform::Transform2D(..) => return, + RenderTransform::Perspective(perspective) => perspective, }; - let (drawable_width, drawable_height) = self.window.drawable_size(); - let drawable_size = Point2DI32::new(drawable_width as i32, drawable_height as i32); - let perspective = transform.to_perspective(drawable_size, false); - unsafe { // Use the stencil buffer to avoid Z-fighting with the gridlines. let mut transform = perspective.transform; @@ -442,7 +442,7 @@ impl DemoApp { self.renderer.disable_subpixel_aa(); } - if self.ui.threed_enabled { + if self.ui.three_d_enabled { self.renderer.enable_depth(); } else { self.renderer.disable_depth(); @@ -538,10 +538,15 @@ impl SceneThread { self.scene.view_box = RectF32::new(Point2DF32::default(), size.to_f32()); } MainToSceneMsg::Build(build_options) => { + let render_transform = build_options.render_transform.clone(); let start_time = Instant::now(); let built_scene = build_scene(&self.scene, build_options, self.options.jobs); let tile_time = Instant::now() - start_time; - self.sender.send(SceneToMainMsg::Render { built_scene, tile_time }).unwrap(); + self.sender.send(SceneToMainMsg::Render { + built_scene, + transform: render_transform, + tile_time, + }).unwrap(); } } } @@ -560,13 +565,13 @@ struct BuildOptions { } enum SceneToMainMsg { - Render { built_scene: BuiltScene, tile_time: Duration } + Render { built_scene: BuiltScene, transform: RenderTransform, tile_time: Duration } } #[derive(Clone)] pub struct Options { jobs: Option, - threed: bool, + three_d: bool, input_path: PathBuf, } @@ -581,19 +586,14 @@ impl Options { .takes_value(true) .help("Number of threads to use"), ) - .arg( - Arg::with_name("3d") - .short("3") - .long("3d") - .help("Run in 3D"), - ) + .arg(Arg::with_name("3d").short("3").long("3d").help("Run in 3D")) .arg(Arg::with_name("INPUT").help("Path to the SVG file to render").index(1)) .get_matches(); let jobs: Option = matches .value_of("jobs") .map(|string| string.parse().unwrap()); - let threed = matches.is_present("3d"); + let three_d = matches.is_present("3d"); let input_path = match matches.value_of("INPUT") { Some(path) => PathBuf::from(path), @@ -612,7 +612,7 @@ impl Options { } thread_pool_builder.build_global().unwrap(); - Options { jobs, threed, input_path } + Options { jobs, three_d, input_path } } } @@ -725,7 +725,7 @@ impl CameraTransform3D { update } - fn to_perspective(&self, drawable_size: Point2DI32, flip_y: bool) -> Perspective { + fn to_perspective(&self, drawable_size: Point2DI32) -> Perspective { let aspect = drawable_size.x() as f32 / drawable_size.y() as f32; let mut transform = Transform3DF32::from_perspective(FRAC_PI_4, aspect, 0.025, 100.0); @@ -736,11 +736,9 @@ impl CameraTransform3D { -self.position.y(), -self.position.z())); - if flip_y { - transform = transform.post_mul(&Transform3DF32::from_scale(1.0, -1.0, 1.0)); - transform = - transform.post_mul(&Transform3DF32::from_translation(0.0, -WORLD_SCALE, 0.0)); - } + // Flip Y. + transform = transform.post_mul(&Transform3DF32::from_scale(1.0, -1.0, 1.0)); + transform = transform.post_mul(&Transform3DF32::from_translation(0.0, -WORLD_SCALE, 0.0)); Perspective::new(&transform, drawable_size) } diff --git a/demo/common/src/ui.rs b/demo/common/src/ui.rs index 9d0eb02c..566e6be4 100644 --- a/demo/common/src/ui.rs +++ b/demo/common/src/ui.rs @@ -50,7 +50,7 @@ pub struct DemoUI { effects_panel_visible: bool, rotate_panel_visible: bool, - pub threed_enabled: bool, + pub three_d_enabled: bool, pub gamma_correction_effect_enabled: bool, pub stem_darkening_effect_enabled: bool, pub subpixel_aa_effect_enabled: bool, @@ -71,7 +71,7 @@ impl DemoUI { rotate_texture, zoom_in_texture, zoom_out_texture, - threed_enabled: options.threed, + three_d_enabled: options.three_d, effects_panel_visible: false, rotate_panel_visible: false, gamma_correction_effect_enabled: false, @@ -110,15 +110,15 @@ impl DemoUI { debug_ui.draw_solid_rect(RectI32::new(threed_switch_origin, Point2DI32::new(SWITCH_SIZE, BUTTON_HEIGHT)), WINDOW_COLOR); - self.threed_enabled = self.draw_switch(debug_ui, + self.three_d_enabled = self.draw_switch(debug_ui, event, threed_switch_origin, "2D", "3D", - self.threed_enabled); + self.three_d_enabled); // Draw rotate and zoom buttons, if applicable. - if !self.threed_enabled { + if !self.three_d_enabled { let rotate_button_y = bottom - BUTTON_HEIGHT; let rotate_button_position = Point2DI32::new(ROTATE_PANEL_X, rotate_button_y); if self.draw_button(debug_ui, event, rotate_button_position, &self.rotate_texture) {