mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-07-22 21:01:40 +00:00
Make the three 3D highways read the Camera Director bridge per panel so each splitscreen panel renders its own camera (independent orbit/height/zoom/tilt/pan), instead of all panels sharing the focused camera. - Add a shared `_freeCamFor(canvas)` resolver to each highway: prefer this panel's entry in `window.__h3dCamCtlPanels[panelIndexFor(canvas)]`, fall back to the global `window.__h3dCamCtl`, else null (100% stock). Defensive on the splitscreen global name (feedBackSplitscreen || slopsmithSplitscreen), NaN-safe, allocation-free. - highway_3d (guitar): source `_freeCam` from the resolver (was global-only). - keys_highway_3d: adopt the bridge for the first time — layer dolly/height/orbit + pan/pitch offsets onto the pan/zoom follow rig at the camera write. - drum_highway_3d: adopt the bridge — new per-frame `applyCamera()` folds the static base pose + kick-pulse dip + free-cam offsets. - In a follower (popped-out) window there is one panel, so the resolver yields whatever camera the plugin set in that window; no highway change needed for pop-out. Camera Director absent → resolver returns null → renderers behave exactly as before. Bump each plugin patch version. Existing plugin tests pass (drum 15, keys 30); the keys "default look unchanged" test confirms the stock path is byte-identical. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Kris Anderson <topkoa@gmail.com>
69 lines
1.6 KiB
JSON
69 lines
1.6 KiB
JSON
{
|
|
"id": "keys_highway_3d",
|
|
"name": "Keys Highway 3D",
|
|
"version": "0.2.1",
|
|
"description": "RS+-style 3D falling-note piano highway fed by the Sloppak Notation Format, with Web MIDI input scoring.",
|
|
"type": "visualization",
|
|
"bundled": true,
|
|
"script": "screen.js",
|
|
"settings": {
|
|
"html": "settings.html",
|
|
"category": "graphics"
|
|
},
|
|
"standards": [
|
|
"capability-pipelines.v1",
|
|
"plugin-runtime-idempotent.v1"
|
|
],
|
|
"capabilities": {
|
|
"visualization": {
|
|
"roles": [
|
|
"provider"
|
|
],
|
|
"operations": [
|
|
"renderer.create",
|
|
"renderer.destroy"
|
|
],
|
|
"emits": [
|
|
"renderer-ready",
|
|
"renderer-failed"
|
|
],
|
|
"mode": "active",
|
|
"safety": "safe"
|
|
},
|
|
"note-detection": {
|
|
"roles": [
|
|
"provider"
|
|
],
|
|
"operations": [
|
|
"verify.target"
|
|
],
|
|
"emits": [
|
|
"hit",
|
|
"miss"
|
|
],
|
|
"mode": "active",
|
|
"safety": "sensitive"
|
|
},
|
|
"midi-input": {
|
|
"roles": [
|
|
"requester"
|
|
],
|
|
"requests": [
|
|
"discover",
|
|
"list-sources",
|
|
"select-source",
|
|
"open-source",
|
|
"close-source"
|
|
],
|
|
"mode": "active",
|
|
"compatibility": "degrade-noop",
|
|
"ownership": "requester-only",
|
|
"safety": "sensitive",
|
|
"description": "Reads the MIDI keyboard input through the core midi-input domain (Web-MIDI provider ships built-in with the domain). Absent domain \u2192 no MIDI devices, fail-soft.",
|
|
"version": 1
|
|
}
|
|
},
|
|
"category": "practice",
|
|
"icon": "assets/thumb.svg"
|
|
}
|