diff --git a/CHANGELOG.md b/CHANGELOG.md index 84e8771..96f83e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 fence. The gem's rim joins in: on a confirmed hit the outline flashes in the string's own colour with the same intensity treatment as the wires, fading with the scorer's alpha. With no scorer attached, nothing changes. +- **Background controls in the player (3D Highway)** — change the highway + background mid-song from the player's Plugin Controls popover instead of + opening Settings: a style dropdown, a Reactive toggle, and an Intensity + slider, all kept in sync with the Settings page. Controls that the active + style ignores are greyed out with a reason on hover (Custom video and + Butterchurn use neither; Custom image uses Intensity but not Reactive), so + a knob is never present-but-inert. The control disappears when a non-3D + renderer is selected. ### Changed - **`GET /api/song/{f}?stems=1`** (new, opt-in) — returns the pack's playable stem diff --git a/plugins/highway_3d/plugin.json b/plugins/highway_3d/plugin.json index e4718ff..caa52fc 100644 --- a/plugins/highway_3d/plugin.json +++ b/plugins/highway_3d/plugin.json @@ -1,7 +1,7 @@ { "id": "highway_3d", "name": "3D Highway", - "version": "3.33.1", + "version": "3.34.0", "type": "visualization", "bundled": true, "script": "screen.js", diff --git a/plugins/highway_3d/screen.js b/plugins/highway_3d/screen.js index a96a521..c4929fe 100644 --- a/plugins/highway_3d/screen.js +++ b/plugins/highway_3d/screen.js @@ -4011,12 +4011,363 @@ let _nextInstanceId = 0; + /* ====================================================================== + * Player-chrome background control + * ====================================================================== + * A Background picker mounted into the player's Plugins rail popover, so + * the background can be switched MID-SONG without leaving for Settings. + * + * It writes through the SAME global setters settings.html uses + * (h3dBgSetStyle / SetReactive / SetIntensity), so the existing pub-sub + * rebuilds the mounted style live and both UIs stay agreed. Nothing extra + * is persisted here, and the option list is generated from BG_STYLE_IDS — + * add a style there and it shows up in both places automatically. + * + * MOUNTED ONCE, REFCOUNTED. Under splitscreen there are N renderer + * instances but these settings are global, so N copies of the control + * would be N ways to set one value. init() acquires, destroy() releases, + * and the last release unmounts — so the control disappears when the user + * switches to a non-3D renderer instead of lingering as a dead knob. + * + * Everything here is event-driven. No DOM work on a per-frame path. + */ + // Wording is kept verbatim in sync with settings.html's