mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-07-21 12:21:49 +00:00
The guitar/bass highway_3d renderer self-detects panel-canvas size changes in its draw() loop and re-runs applySize() every frame, because the splitscreen host overrides hw.resize and never calls renderer.resize(). The drum and keys highways lacked that fallback — they only re-framed when the host explicitly called resize(w, h) — so their panels stayed framed for the pre-fullscreen size while the guitar/bass panels adapted. Symptom: a too-small, off-center highway in the drum/keys panels after maximizing a split-screen session. Port highway_3d's per-frame drift check into both draw() loops: re-apply on backing-store change (canvas.width/height) AND on CSS-box drift (clientWidth/clientHeight vs the last applied logical size, throttled to every 10th frame). Track _lastHwW/_lastHwH + _appliedW/_appliedH per instance and reset them in destroy() so a reused instance re-frames on the next song. plugins/drum_highway_3d -> 0.3.1, plugins/keys_highway_3d -> 0.1.1. Tests: tests/js/drum_keys_highway_3d_resize_reframe.test.js. Signed-off-by: Kris Anderson <topkoa@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
69 lines
1.6 KiB
JSON
69 lines
1.6 KiB
JSON
{
|
|
"id": "keys_highway_3d",
|
|
"name": "Keys Highway 3D",
|
|
"version": "0.1.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"
|
|
}
|