core: Adjust culling area based on letterbox setting

This commit is contained in:
Mike Welsh 2021-01-06 23:58:21 -08:00
parent 01aca9f861
commit 44e9185a5f
1 changed files with 35 additions and 15 deletions

View File

@ -163,6 +163,7 @@ pub struct Player {
transform_stack: TransformStack, transform_stack: TransformStack,
view_matrix: Matrix, view_matrix: Matrix,
inverse_view_matrix: Matrix, inverse_view_matrix: Matrix,
view_bounds: BoundingBox,
storage: Storage, storage: Storage,
@ -252,6 +253,7 @@ impl Player {
transform_stack: TransformStack::new(), transform_stack: TransformStack::new(),
view_matrix: Default::default(), view_matrix: Default::default(),
inverse_view_matrix: Default::default(), inverse_view_matrix: Default::default(),
view_bounds: Default::default(),
rng: SmallRng::seed_from_u64(chrono::Utc::now().timestamp_millis() as u64), rng: SmallRng::seed_from_u64(chrono::Utc::now().timestamp_millis() as u64),
@ -528,6 +530,11 @@ impl Player {
self.letterbox = letterbox self.letterbox = letterbox
} }
fn should_letterbox(&self) -> bool {
self.letterbox == Letterbox::On
|| (self.letterbox == Letterbox::Fullscreen && self.user_interface.is_fullscreen())
}
pub fn movie_width(&self) -> u32 { pub fn movie_width(&self) -> u32 {
self.movie_width self.movie_width
} }
@ -882,14 +889,6 @@ impl Player {
} }
pub fn render(&mut self) { pub fn render(&mut self) {
let view_bounds = BoundingBox {
x_min: Twips::new(0),
y_min: Twips::new(0),
x_max: Twips::from_pixels(self.movie_width.into()),
y_max: Twips::from_pixels(self.movie_height.into()),
valid: true,
};
self.renderer.begin_frame(self.background_color.clone()); self.renderer.begin_frame(self.background_color.clone());
let (renderer, transform_stack) = (&mut self.renderer, &mut self.transform_stack); let (renderer, transform_stack) = (&mut self.renderer, &mut self.transform_stack);
@ -898,6 +897,8 @@ impl Player {
matrix: self.view_matrix, matrix: self.view_matrix,
..Default::default() ..Default::default()
}); });
let view_bounds = self.view_bounds.clone();
self.gc_arena.mutate(|_gc_context, gc_root| { self.gc_arena.mutate(|_gc_context, gc_root| {
let root_data = gc_root.0.read(); let root_data = gc_root.0.read();
let mut render_context = RenderContext { let mut render_context = RenderContext {
@ -915,7 +916,10 @@ impl Player {
}); });
transform_stack.pop(); transform_stack.pop();
self.draw_letterbox(); if self.should_letterbox() {
self.draw_letterbox();
}
self.renderer.end_frame(); self.renderer.end_frame();
self.needs_render = false; self.needs_render = false;
} }
@ -1100,6 +1104,28 @@ impl Player {
}; };
self.inverse_view_matrix = self.view_matrix; self.inverse_view_matrix = self.view_matrix;
self.inverse_view_matrix.invert(); self.inverse_view_matrix.invert();
self.view_bounds = if self.should_letterbox() {
// No letterbox: movie area
BoundingBox {
x_min: Twips::new(0),
y_min: Twips::new(0),
x_max: Twips::from_pixels(f64::from(self.movie_width)),
y_max: Twips::from_pixels(f64::from(self.movie_height)),
valid: true,
}
} else {
// No letterbox: full visible stage area
let margin_width = f64::from(margin_width / scale);
let margin_height = f64::from(margin_height / scale);
BoundingBox {
x_min: Twips::from_pixels(-margin_width),
y_min: Twips::from_pixels(-margin_height),
x_max: Twips::from_pixels(f64::from(self.movie_width) + margin_width),
y_max: Twips::from_pixels(f64::from(self.movie_height) + margin_height),
valid: true,
}
};
} }
/// Runs the closure `f` with an `UpdateContext`. /// Runs the closure `f` with an `UpdateContext`.
@ -1328,12 +1354,6 @@ impl Player {
} }
fn draw_letterbox(&mut self) { fn draw_letterbox(&mut self) {
if self.letterbox == Letterbox::Off
|| (self.letterbox == Letterbox::Fullscreen && !self.user_interface.is_fullscreen())
{
return;
}
let black = Color::from_rgb(0, 255); let black = Color::from_rgb(0, 255);
let viewport_width = self.viewport_width as f32; let viewport_width = self.viewport_width as f32;
let viewport_height = self.viewport_height as f32; let viewport_height = self.viewport_height as f32;