P17.3: organic fall — per-round landing squash-&-settle (sx, iOS sim)
Give each landing gem a wide-and-short squash-&-settle bounce as it touches its destination, applied WITHIN the fall so EVERY cascade round bounces (staggered per column), not only the final whole-move settle. One envelope, one bounce: land_squash is now LAND_SQUASH_A * squash_envelope (P15.1) over its normalized window, so the per-round fall bounce and the settle bounce are the exact same shape. render_fall/render_clear age a per-column bounce from each column's touch-down instant (fall_landing_frac * FALL_ANIM_DUR) via the shared rest_squash + delivering_round helpers, so a gem still in the air draws unsquashed and only a landed gem flattens; the squash carries across the fall->clear seam. Double-bounce reconciliation (approach a): drive the bounce from the per-round fall and DROP the old whole-move "stamp at age 0" settle. The settle stamp is now BACK-DATED per column (clock - (total - round_land_time)) so render_gems resumes land_squash exactly where render_fall left off at the render_anim -> render_gems seam — one continuous bounce, no double-pop. Amplitude tuned 0.13 -> 0.18 (~13% peak) so the bounce reads while staying tasteful; durations unchanged, so the cascade-cue snapshots don't churn. M3TE_ANIM_TIME=0 still reproduces goldens/p6_idle_t0.png (a resting board carries no landing stamp). New goldens/p17_land.png pins a staggered landing mid-pour (M3TE_FX=11 ANIM_TIME=1.94). tests/easing.sx gains a landing-instant section pinning fall_landing_frac / round_land_time; tests/gem_pose.sx stays green (land_squash values are identical).
This commit is contained in:
40
README.md
40
README.md
@@ -344,6 +344,46 @@ env SIMCTL_CHILD_M3TE_FX=11 SIMCTL_CHILD_M3TE_ANIM_TIME=3.0 \
|
||||
The change is render-only — no `board.sx` model change, and normal play is
|
||||
byte-identical apart from the fall's per-column timing.
|
||||
|
||||
### Organic fall — landing squash-&-settle (P17.3)
|
||||
|
||||
Each landing gem now flattens **wide-and-short on impact then wobbles back to rest**
|
||||
(P15.1's `squash_envelope`), applied WITHIN the fall so EVERY cascade round bounces,
|
||||
staggered per column — not only the final whole-move settle as before. `render_fall`
|
||||
ages a per-column bounce from each column's touch-down instant (`fall_landing_frac` ·
|
||||
`FALL_ANIM_DUR`), so a gem still in the air is drawn unsquashed and only a gem that
|
||||
has reached its cell flattens; the squash carries across the fall→clear seam
|
||||
(`render_clear` continues the previous round's bounce) and across the final
|
||||
render_anim → render_gems seam (the settle stamp is **back-dated** per column so
|
||||
`land_squash` resumes exactly where the fall left it — ONE bounce, no double-pop).
|
||||
`land_squash` is now `LAND_SQUASH_A · squash_envelope(tl/LAND_DUR)`, so the per-round
|
||||
fall bounce and the settle bounce are the same single envelope; amplitude is the
|
||||
tasteful ~13 % peak (`LAND_SQUASH_A = 0.18`). Durations are unchanged, so the
|
||||
cascade-cue snapshots don't churn; `M3TE_ANIM_TIME=0` still reproduces
|
||||
`goldens/p6_idle_t0.png` exactly (a resting board carries no landing stamp).
|
||||
|
||||
The visual tell: pin a round's fall just before it ends and the leading columns sit
|
||||
landed-and-squashed (wide-short) while the trailing columns are still airborne — a
|
||||
staggered squash wave. On seed 1337, `M3TE_FX=11` **round 4** (the refill round) at
|
||||
`1.94` shows columns 2–4 landed and flattened with columns 5–7 still pouring in
|
||||
(every round behaves identically — round 2 `[1.02,1.24)` at `1.21` and round 3
|
||||
`[1.38,1.60)` near `1.58` bounce the same way, so the bounce is NOT limited to the
|
||||
last settle):
|
||||
|
||||
```bash
|
||||
# Staggered landing squash mid-pour (leading cols flattened, trailing airborne):
|
||||
# goldens/p17_land.png
|
||||
env SIMCTL_CHILD_M3TE_FX=11 SIMCTL_CHILD_M3TE_ANIM_TIME=1.94 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
# Same cascade past the timeline — fully settled, bounce decayed to rest (no golden):
|
||||
env SIMCTL_CHILD_M3TE_FX=11 SIMCTL_CHILD_M3TE_ANIM_TIME=3.0 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
```
|
||||
|
||||
`goldens/p17_fall.png` stays the pre-stagger lockstep reference (P17.1) and
|
||||
`goldens/p17_stagger.png` the pure per-column stagger (P17.2); both pin moments where
|
||||
no column has landed yet, so neither carries squash. The change is render-only — no
|
||||
`board.sx` model change, and a resting board is untouched.
|
||||
|
||||
### FPS counter — dev overlay (P20.1)
|
||||
|
||||
A small FPS readout for gauging frame cost while tuning the animations. It is a
|
||||
|
||||
Reference in New Issue
Block a user