mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-08-10 18:59:56 +00:00
fix(bend): GP8 short-bend curve loss + 2D curve timing + 3D bnv gating (#535)
Post-merge Codex review of the bend-curve PRs (#531/#532) surfaced edge cases: - GP8 (#531 P2): bnv timing used rn.sustain, which is zeroed for notes <= 0.2s, so short GP8 bends kept the scalar bn but lost bt/bnv. Use the beat duration `dur` (matching the GP5 path) so the curve survives. - 2D highway (#532 P2): bnvNormalizedPoints mapped x over the curve's own t-range [first,last] instead of the note span, so curves not starting at 0 / ending at sus were time-distorted. Now maps over [0, sus] (clamped), with a curve-span fallback when sus<=0 (existing no-sus callers unaffected). - 3D highway (#532 P3): the sustain ribbon + bend chevron were gated on bn>0, so a note carrying an authoritative bnv with bn==0 drew no ribbon/marker. Both now also fire on bnv presence; chevron steps derived from max(bn, bnv peak). Codex-reviewed: clean (no findings). +1 JS test (sus-relative mapping + fallback). JS 8/8, 250 core GP/song tests pass. NB: GP8's short-bend path still lacks a dedicated synthetic-GPIF fixture (same gap as the GP8 offset-prop-names P3) — _gpx_bend_shape units cover the function; the fix is the one-line caller change. Part of got-feedback/feedback#334. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
351b273ab5
commit
a858617d71
@@ -11949,6 +11949,7 @@
|
||||
const ribbonSusTrail = !!(
|
||||
(slideSt && n.f > 0 && (n.sus || 0) > 1e-4)
|
||||
|| (Number(n.bn) > 0)
|
||||
|| (Array.isArray(n.bnv) && n.bnv.length > 0)
|
||||
|| n.tr
|
||||
|| hasTechniqueVibrato
|
||||
);
|
||||
@@ -12119,11 +12120,17 @@
|
||||
arrow.material.opacity = 1;
|
||||
}
|
||||
}
|
||||
if (n.bn > 0) {
|
||||
// Derive the peak from bn OR the bnv curve: a note may carry an
|
||||
// authoritative curve with bn left at 0 (bn SHOULD be the peak
|
||||
// whenever bnv exists — this is the robustness fallback).
|
||||
const _bnvPeak = (Array.isArray(n.bnv) && n.bnv.length)
|
||||
? n.bnv.reduce((m, p) => Math.max(m, Number(p.v) || 0), 0) : 0;
|
||||
const _bendPeak = Math.max(Number(n.bn) || 0, _bnvPeak);
|
||||
if (_bendPeak > 0) {
|
||||
// Bend chevron stack — PlaneGeometry mesh so it tilts with
|
||||
// the gem (approachRot). Fixed world size so it perspective-
|
||||
// shrinks naturally without distFactor compensation.
|
||||
const steps = Math.max(1, Math.min(4, Math.round(n.bn)));
|
||||
const steps = Math.max(1, Math.min(4, Math.round(_bendPeak)));
|
||||
const bendSm = bendChevronMat(steps, activePalette[s] || 0xffffff);
|
||||
const l = pTechPlane.get();
|
||||
l.material = _spriteMat2MeshMat(l, bendSm);
|
||||
|
||||
Reference in New Issue
Block a user