Add AutoMax next to ScalingMode::AutoMin (#6496)
# Objective `ScalingMode::Auto` for cameras only targets min_height and min_width, or as the docs say it `Use minimal possible viewport size while keeping the aspect ratio.` But there is no ScalingMode that targets max_height and Max_width or `Use maximal possible viewport size while keeping the aspect ratio.` ## Solution Added `ScalingMode::AutoMax` that does the exact opposite of `ScalingMode::Auto` --- ## Changelog Renamed `ScalingMode::Auto` to `ScalingMode::AutoMin`. ## Migration Guide just rename `ScalingMode::Auto` to `ScalingMode::AutoMin` if you are using it. Co-authored-by: Lixou <82600264+DasLixou@users.noreply.github.com>
This commit is contained in:
parent
db0d7698e2
commit
b765682c6e
@ -185,9 +185,12 @@ pub enum ScalingMode {
|
||||
None,
|
||||
/// Match the window size. 1 world unit = 1 pixel.
|
||||
WindowSize,
|
||||
/// Use minimal possible viewport size while keeping the aspect ratio.
|
||||
/// Keeping the aspect ratio while the axes can't be smaller than given minimum.
|
||||
/// Arguments are in world units.
|
||||
Auto { min_width: f32, min_height: f32 },
|
||||
AutoMin { min_width: f32, min_height: f32 },
|
||||
/// Keeping the aspect ratio while the axes can't be bigger than given maximum.
|
||||
/// Arguments are in world units.
|
||||
AutoMax { max_width: f32, max_height: f32 },
|
||||
/// Keep vertical axis constant; resize horizontal with aspect ratio.
|
||||
/// The argument is the desired height of the viewport in world units.
|
||||
FixedVertical(f32),
|
||||
@ -227,16 +230,30 @@ impl CameraProjection for OrthographicProjection {
|
||||
fn update(&mut self, width: f32, height: f32) {
|
||||
let (viewport_width, viewport_height) = match self.scaling_mode {
|
||||
ScalingMode::WindowSize => (width, height),
|
||||
ScalingMode::Auto {
|
||||
ScalingMode::AutoMin {
|
||||
min_width,
|
||||
min_height,
|
||||
} => {
|
||||
// Compare Pixels of current width and minimal height and Pixels of minimal width with current height.
|
||||
// Then use bigger (min_height when true) as what it refers to (height when true) and calculate rest so it can't get under minimum.
|
||||
if width * min_height > min_width * height {
|
||||
(width * min_height / height, min_height)
|
||||
} else {
|
||||
(min_width, height * min_width / width)
|
||||
}
|
||||
}
|
||||
ScalingMode::AutoMax {
|
||||
max_width,
|
||||
max_height,
|
||||
} => {
|
||||
// Compare Pixels of current width and maximal height and Pixels of maximal width with current height.
|
||||
// Then use smaller (max_height when true) as what it refers to (height when true) and calculate rest so it can't get over maximum.
|
||||
if width * max_height < max_width * height {
|
||||
(width * max_height / height, max_height)
|
||||
} else {
|
||||
(max_width, height * max_width / width)
|
||||
}
|
||||
}
|
||||
ScalingMode::FixedVertical(viewport_height) => {
|
||||
(width * viewport_height / height, viewport_height)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user