fix(web): cap canvas via Window resize_constraints (the actual fix)
The previous attempts (#97/#98) capped a wrapper element's max-width and
relied on the canvas's width:100% resolving against it — but winit observes
and sizes the *canvas element itself* (via ResizeObserver on its content box),
so the wrapper cap never reached the surface and /play still panicked at
2560x1440 on a 4K@150% viewport.
Use the canonical mechanism instead: set the primary Window's
`resize_constraints { max_width: 2048, max_height: 2048 }`. On web, Bevy maps
this to winit `set_max_inner_size` → the canvas's own `max-width`/`max-height`
style, so the wgpu surface can never exceed wgpu's downlevel_webgl2
max_texture_dimension_2d (2048). play.html mirrors the same `max-*` directly on
#bevy-canvas (belt-and-suspenders) and centres the letterbox with margin:auto;
the obsolete wrapper + clamp script are removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,7 +13,7 @@ use bevy::asset::AssetMetaCheck;
|
||||
use bevy::prelude::*;
|
||||
use bevy::render::RenderPlugin;
|
||||
use bevy::render::settings::{RenderCreation, WgpuSettings, WgpuSettingsPriority};
|
||||
use bevy::window::{Window, WindowPlugin, WindowResolution};
|
||||
use bevy::window::{Window, WindowPlugin, WindowResizeConstraints, WindowResolution};
|
||||
use solitaire_data::LocalOnlyProvider;
|
||||
use solitaire_engine::CoreGamePlugin;
|
||||
use wasm_bindgen::prelude::*;
|
||||
@@ -42,6 +42,19 @@ pub fn start() {
|
||||
// resize event and killing the WASM thread.
|
||||
resolution: WindowResolution::default()
|
||||
.with_scale_factor_override(1.0),
|
||||
// Cap the surface at WebGL2's max texture dimension (2048).
|
||||
// On wasm Bevy creates the device with
|
||||
// `Limits::downlevel_webgl2_defaults()` (max_texture_dimension_2d
|
||||
// = 2048), so a larger surface — e.g. a 4K display at 150% scale
|
||||
// gives a 2560x1440 logical viewport — makes Surface::configure
|
||||
// panic on the first frame. winit maps this constraint to the
|
||||
// canvas's `max-width`/`max-height` style, so the surface can
|
||||
// never exceed it. Viewports wider/taller than 2048 letterbox.
|
||||
resize_constraints: WindowResizeConstraints {
|
||||
max_width: 2048.0,
|
||||
max_height: 2048.0,
|
||||
..default()
|
||||
},
|
||||
..default()
|
||||
}),
|
||||
..default()
|
||||
|
||||
Reference in New Issue
Block a user