e5be266ce6
3 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
70922bd855 |
M7: marmalade — rind, and a judge who scores its distribution
A particulate spread. The jelly is ordinary rheology; the rind is discrete solids that ride the knife and drop off per unit of stroke DISTANCE, not per second — a dabbing knife makes a pile, a moving knife lays a trail, and since the shed rate scales with what's left on the blade, one dip cannot cover the slice. Even rind takes several dips placed with intent. Scraping picks bits back up (60% survive the blade), so a clump can be argued with. The judge scores the scatter with the Clark–Evans nearest-neighbour index over the bread's own area, and quotes it: R near 0 is one clump, 1 is random, above 1 is deliberate. Verified end to end on day 8: dab in a corner 8 bits "one clump (R 0.24)" drags grade to B three placed dips 24 bits "evenly strewn (R 1.17)" A, 8.9/10 First cut shed per-second; even careful strokes dumped the whole load in the first half-second and scored "clumped (R 0.50)". Distance-based shedding is what makes evenness the reward for technique rather than luck. Rind renders as instanced chunks parented to the slice mesh, so it rides the pop, the landing, and the pedestal turn. Points, not a field: the judge wants nearest-neighbour statistics, and those want points. Same sRGB trap as M3, new spot: the instanced material's colour was passed as raw floats, which the renderer reads as linear — candied orange rendered as pale butter. setRGB(..., SRGBColorSpace). New content: day 8 handwritten (Deidre wants a piece in every bite), marmalade in the procedural pool, five rind-district lines for the judge, and a marmalade jar GLB generated on-device like everything else, with a plain-glass fallback while it loads. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
5b09f23c7e |
M5+M6: content, generated assets, title, sound, perf
Content (verified — same dial, same 18s, four breads that disagree): bread 4s 9s 18s char white 0.22 0.54 1.08 93% multigrain 0.20 0.52 1.06 92% raisin 0.30 0.76 1.14 99.8% sourdough 0.11 0.33 0.74 14% Sourdough stalls at half the rate then accelerates hardest (x3.0 vs white's x2.45) as its water boils off; raisin browns 40% faster and is essentially carbon by 18s. Seven handwritten days then procedural, day persisted. Assets, all generated on-device and free, all reproducible from fixed seeds: - the judge's five expressions (one seed, one description, only the expression phrase varying — he stays the same man while his face falls) - title art, wooden bench, blurred kitchen backdrop - butter dish / peanut butter / MITEY jars as GLBs, normalised on load (recentre, scale to fit, sit on y=0) rather than hand-fixed, so regenerating them doesn't mean re-fixing them The toaster stays procedural: the generated one is prettier but this one has a lever we can drive and a dial that turns. Judgment call, per the brief. Sound is synthesised, no samples: clatter is driven by real Rapier contact-force events and scaled by force, which is the only way a drawer of cutlery can sound like one. Plus lever clunk, knife scrape pitched by pressure, and the stamp. Perf, measured (16.7ms is the 60fps budget): kitchen 0.99ms/step · drawer 0.12ms · drawer while dragging 0.21ms Production build: 2.87MB / 1.0MB gzipped, mostly Rapier's inlined wasm + three. Textures carry colorSpace = SRGBColorSpace explicitly — same class of bug as the albedo gamma fix in M3, and it washes them out silently if you forget. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
eb74170011 |
M2: spreading — one control, three behaviours
Knife angle (wheel) is the only input, and spread/scrape/gouge all fall out of it.
Verified by driving real input through the real code paths:
cold toast + fridge butter -> damage 0.015, spread 0.029 (tears, as designed)
fresh warm toast -> damage 0, spread 0.117 (flows cleanly)
burnt toast, knife on edge -> char 99.9% -> 82.7% -> 54.5%
evenness 0.029 -> 0.123 -> 0.226
pale toast, knife on edge -> gouges; steak knife gouges 3.2x harder
That evenness column is the mechanic: scraping rescues you from char and wrecks
uniformity doing it. The judge will have opinions.
The trap is calibrated, not hoped for. Pressure comes from steepness, but past
SCRAPE_ANGLE the knife stops spreading:
fridge butter / cold toast yield 0.72 needs angle 0.75 IMPOSSIBLE
bench butter / cold toast yield 0.54 needs angle 0.57 (cliff at 0.62)
fridge butter / fresh toast yield 0.36 needs angle 0.38 fine
soft butter / fresh toast yield 0.16 needs angle 0.12 dream mode
So cold toast + hard butter cannot be spread at any angle, and the way out isn't
technique — it's not dawdling. The pressure gauge draws both marks so you can
see the gold sitting past the red and understand why you're losing.
Emergent and kept: a steak knife's narrow blade concentrates pressure enough to
beat cold butter's yield. It's the right tool for cold butter and a menace
everywhere else.
- cutlery.ts: 9 hand-authored archetypes (silhouettes are gameplay — the drawer
has to be fair) + compound box colliders for M4.
- dev.ts: harness that drives real gestures deterministically. Earns its keep.
Two bugs: cutlery meshes used mesh.rotation.x = -PI/2, which sends a profile
drawn toward +y to -z and one drawn toward -y to +z — the handle and blade were
laid out in opposite directions, overlapping, nowhere near the cursor. Now
rotated at the geometry level. And resize() computed aspect = 0/0 = NaN when the
container reports zero, which poisons the projection matrix so every raycast
silently misses — i.e. the entire mechanic stops with no error.
Metals need something to reflect: added a RoomEnvironment IBL and rebalanced the
direct rig, which was tuned before it existed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|