The stand stops wobbling: a real clap frame, a wave, and three spectators who have already turned
The wobble was never the animation. x_crowd2 was a RE-ROLL of x_crowd, not a pose of it — 13-16% of its pixels differed, over faces, torsos, seat backs and the railing — so swapping 16 columns at 4.5 Hz re-hashed a strip of crowd twice a second. assets/_crowdpass.py rebuilds the pair: the clap frame is now the seated frame plus 36 genuine raises, each contained in ONE of render's columns, so any column swap is seamless by construction and an empty column is invisible instead of being a wobble. The three courts are one composition in three palettes, so a raise found in one court's roll is transplanted into the other two through a colour map learnt from the aligned seated pair. The same tool paints the crowd, because at ~8 logical px a spectator detail can only mean chroma and silhouette: 55 shirts and 44 heads of hair in colours the court does not own, 28 caps, 4 flags above the heads, 8 emptied seats, 8 people permanently standing — and 3 who are already turned, grey-green, mid-row, who are also the only three who never applaud. Movement, one draw path and three behaviours: applause scatters per column, a WAVE crosses the stand for a moment big enough to deserve one (crowd.pop >= 0.75), and with nobody cheering ONE column stands for a third of every TUNE.fidgetEvery, so the stand between points is no longer a photograph. Paparazzi now scale with the moment: cheer() records the size of it (vol was already exactly that at every call site) and queues shutters proportional to it, drained at a fifth of the normal gap. pop is held at the loudest while an applause is live, so a won rally landing inside a match-point ovation cannot demote the stand to a polite clap — that rule has a test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
76ea1d0d79
commit
74afd5988c
14 files changed
+585
-42
No files matched your search
@@ -589,6 +589,13 @@ export function aside(name, delay = 0.2) {
|
||||
|
||||
export function cheer(seconds, vol) {
|
||||
sfx('tennis-applaus', Math.min(1.5, vol * 2.2)); // recorded crowd; vol scales with the size of the moment (gain > 1 amplifies)
|
||||
// HOW BIG THIS ONE WAS. vol is already the size of the moment everywhere it is called from (a
|
||||
// won rally 0.25, a game 0.6, a match or an EPIC 1.0), so the stand reads it rather than growing
|
||||
// a second scale of its own: past 0.6 the wave rolls, and the photographers in the stand fire a
|
||||
// burst proportional to it. Held at the LOUDEST while an applause is live — a small cheer landing
|
||||
// inside a big one must not quietly demote it.
|
||||
crowd.pop = Math.max(crowd.cheer > 0 ? crowd.pop : 0, Math.min(1, vol));
|
||||
crowd.burst += Math.round(crowd.pop * 7);
|
||||
// floored at the CLIP LENGTH: the sample always plays out in full, so the stand must stay on its
|
||||
// feet until it stops. `seconds` still lets a big moment run longer than the audio.
|
||||
crowd.cheer = Math.max(crowd.cheer, seconds, APPLAUSE_T);
|
||||
|
||||
Reference in new issue
Block a user