mirror of
https://github.com/bevyengine/bevy
synced 2024-09-20 06:22:01 +00:00
# Objective - When viewport is set to the same size as the window on creation, when adjusting to SizedFullscreen, the window may be smaller than the viewport for a moment, which caused the arguments to be invalid and panic. - Fixes #12000. ## Solution - The fix consists of matching the size of the viewport to the lower size of the window ( if the x value of the window is lower, I update only the x value of the viewport, same for the y value). Also added a test to show that it does not panic anymore. ---
This commit is contained in:
parent
a27ce270d0
commit
ac91b19118
2 changed files with 64 additions and 0 deletions
|
@ -755,6 +755,20 @@ pub fn camera_system<T: CameraProjection + Component>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// This check is needed because when changing WindowMode to SizedFullscreen, the viewport may have invalid
|
||||||
|
// arguments due to a sudden change on the window size to a lower value.
|
||||||
|
// If the size of the window is lower, the viewport will match that lower value.
|
||||||
|
if let Some(viewport) = &mut camera.viewport {
|
||||||
|
let target_info = &new_computed_target_info;
|
||||||
|
if let Some(target) = target_info {
|
||||||
|
if viewport.physical_size.x > target.physical_size.x {
|
||||||
|
viewport.physical_size.x = target.physical_size.x;
|
||||||
|
}
|
||||||
|
if viewport.physical_size.y > target.physical_size.y {
|
||||||
|
viewport.physical_size.y = target.physical_size.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
camera.computed.target_info = new_computed_target_info;
|
camera.computed.target_info = new_computed_target_info;
|
||||||
if let Some(size) = camera.logical_viewport_size() {
|
if let Some(size) = camera.logical_viewport_size() {
|
||||||
camera_projection.update(size.x, size.y);
|
camera_projection.update(size.x, size.y);
|
||||||
|
|
50
tests/window/change_window_mode.rs
Normal file
50
tests/window/change_window_mode.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
//! a test that confirms that 'bevy' does not panic while changing from Windowed to SizedFullscreen when viewport is set
|
||||||
|
|
||||||
|
use bevy::
|
||||||
|
{ prelude::*,
|
||||||
|
render::camera::Viewport,
|
||||||
|
window::WindowMode,
|
||||||
|
};
|
||||||
|
|
||||||
|
//Having a viewport set to the same size as a window used to cause panic on some occasions when switching to SizedFullscreen
|
||||||
|
const WINDOW_WIDTH : f32 = 1366.0;
|
||||||
|
const WINDOW_HEIGHT: f32 = 768.0;
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{ //Specify Window Size.
|
||||||
|
let window = Window { resolution: ( WINDOW_WIDTH, WINDOW_HEIGHT ).into(), ..default() };
|
||||||
|
let primary_window = Some ( window );
|
||||||
|
|
||||||
|
App::new()
|
||||||
|
.add_plugins( DefaultPlugins.set( WindowPlugin { primary_window, ..default() } ) )
|
||||||
|
.add_systems( Startup, startup )
|
||||||
|
.add_systems( Update, toggle_window_mode )
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn startup( mut cmds: Commands )
|
||||||
|
{ //Match viewport to Window size.
|
||||||
|
let physical_position = UVec2::new( 0, 0 );
|
||||||
|
let physical_size = Vec2::new( WINDOW_WIDTH, WINDOW_HEIGHT ).as_uvec2();
|
||||||
|
let viewport = Some ( Viewport { physical_position, physical_size, ..default() } );
|
||||||
|
|
||||||
|
cmds.spawn( Camera2dBundle::default() ).insert( Camera { viewport, ..default() } );
|
||||||
|
}
|
||||||
|
|
||||||
|
fn toggle_window_mode
|
||||||
|
( mut qry_window: Query<&mut Window>,
|
||||||
|
)
|
||||||
|
{ let Ok( mut window ) = qry_window.get_single_mut() else { return };
|
||||||
|
|
||||||
|
window.mode = match window.mode {
|
||||||
|
WindowMode::Windowed => {
|
||||||
|
//it takes a while for the window to change from windowed to sizedfullscreen and back
|
||||||
|
std::thread::sleep(std::time::Duration::from_secs(4));
|
||||||
|
WindowMode::SizedFullscreen
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
std::thread::sleep(std::time::Duration::from_secs(4));
|
||||||
|
WindowMode::Windowed
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue