Small Beat Saber 1.45.2 compatibility fixes.
High obstacle quality now remains available with Screen Distortion Effects off. BSFixes keeps the high-quality wall shader and its screen/depth capture, but sets wall refraction strength to zero on owned material copies. The graphics checkbox and saved setting stay off. Turning distortion on restores normal refraction; Low and Medium obstacle quality retain their existing material selection. The required screen capture still has a rendering cost. This change does not establish that legacy custom-map water renders correctly after the URP transition.
Current behavior filters only confirmed harmless Unity startup noise:
- stale Quest-only SettingsIO properties on PC;
- missing DLC promo assets;
- deprecated OnLevelWasLoaded notices from the loader;
- Camera.stereoTargetEye warning under a scriptable render pipeline;
- malformed internal cvar.System.* command-name errors.
When no LIV app path exists in LIV_APP_PATH or the LIV app registry key,
BSFixes skips Beat Saber's LIV initialization. An installed LIV app keeps the
game's normal integration and error reporting.
While the game runs, BSFixes follows headset resolution changes (for example SteamVR's per-application or global resolution slider). Twice per second it asks the OpenXR runtime for its current recommended eye size and, on SteamVR, also reads SteamVR's resolution settings as a fallback. It then adjusts the XR render scale until the measured eye width matches, on top of Beat Saber's own VR resolution setting. Each change is logged with both sources and the resulting eye width.
The scene-transition loading spinner is centred in front of the camera instead of sitting in the lower-right corner, in the headset and on desktop cameras.
Main-thread hitch fixes for game code:
- Downloaded cover/promo sprites (
MediaAsyncLoader.LoadSpriteAsync) copy raw pixel bytes into their mipmapped texture instead of a managedColor[](16 bytes per pixel). Mipmaps are still generated byApply; unexpected formats fall back to the original copy. - PlayerData saves serialize their detached
PlayerSaveDatasnapshot on a worker thread, then write from the main thread as before. A newer save of the same file skips an older pending write. Other JSON saves are unchanged.