Fix temporal inconsistency in the demo between transform applied between vector

scene and environment
This commit is contained in:
Patrick Walton 2019-02-21 12:09:02 -08:00
parent 66ee901e43
commit b6e334a5bb
2 changed files with 34 additions and 36 deletions

View File

@ -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<usize>,
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<usize> = 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)
}

View File

@ -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) {