mirror of
https://github.com/bevyengine/bevy
synced 2024-11-26 22:50:19 +00:00
ac91b19118
# 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. ---
50 lines
No EOL
1.7 KiB
Rust
50 lines
No EOL
1.7 KiB
Rust
//! 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
|
|
},
|
|
};
|
|
} |