Skip to content

v0.1.0#1

Merged
ZackaryW merged 15 commits into
mainfrom
feat/reimplementation
Jul 6, 2026
Merged

v0.1.0#1
ZackaryW merged 15 commits into
mainfrom
feat/reimplementation

Conversation

@ZackaryW

@ZackaryW ZackaryW commented Jul 6, 2026

Copy link
Copy Markdown
Member

No description provided.

ZackaryW added 15 commits July 6, 2026 13:34
zmem(DECISION): revamp is GPU shader-driven with a composable Wave trait model (shape/style/motion/effects), clean-slate breaking, skeletonizer dropped
- milestone-by-milestone delivery; each milestone appends an example showcase
zmem(DECISION): a Wave composes swappable traits — WaveShape geometry, WaveStyle appearance, WaveMotion time — rendered on the GPU by a fragment shader that mirrors the Dart height field
zmem(DECISION): WaveField keeps a CPU fallback path so the surface never blanks when the shader cannot load, as in headless tests
zmem(LESSON_LEARNT): Skia SkSL runtime effects forbid derivative functions like fwidth; crest anti-aliasing derives pixel size from uSize instead
- removes the skeletonizer module and dependency and the old WaveScreen recipe/adaptation stack
zmem(DECISION): behave scenarios bind to flutter test proofs via @proof_<id> tags, with a binding-integrity feature enforcing the scenario-to-proof bijection
zmem(LESSON_LEARNT): on Windows the proof runner must resolve flutter via shutil.which — a bare flutter argv raises FileNotFoundError
- covers trait height-field math, WaveField animation, and preset rendering
zmem(DECISION): example pages come from an appendable registry so each milestone adds a showcase without editing the shell
- M1 Foundation page demos the presets and an inline trait-composed WaveScreen
- navigation chrome appears only once a second milestone page exists
zmem(DECISION): both new shapes stay pure height fields (sampleAt) so they render through the CPU fallback and the shader alike; the shader branches per layer on a shapeType uniform
zmem(DECISION): gerstner is a gamma-sharpened sine where steepness 0 reduces exactly to a sine; metaball is a smooth union of evenly-spaced drifting gaussian blobs
- uniform layout gains a per-layer geometryB slot (shapeType, steepness, blobCount, radius)
zmem(DECISION): shape proofs assert computed-model properties — gerstner peaks like a sine but flattens between crests, and metaball blobs merge as radius grows
- also covers value equality and mixed-shape field rendering to exercise uniform packing
zmem(DECISION): a second milestone page activates the gallery navigation; the page demos gerstner ocean, gooey metaballs, and a sine-vs-gerstner comparison
zmem(LESSON_LEARNT): a FragmentShader's setFloat index space is fixed by its compiled uniform layout; writing more floats than the loaded shader declares throws RangeError every frame — a stale M1 shader (67 floats) crash-flooded against M2's 99-float packer
zmem(DECISION): WaveFieldPainter guards the shader write and silently falls back to the CPU path on any uniform-write error, so a stale or incompatible shader never crashes the frame loop
zmem(DECISION): pointer ripples are a field-level interaction — WaveField becomes interactive when any wave carries a PointerRippleEffect, spawning ripples on tap and drag that displace every layer
zmem(DECISION): ripple displacement is a pure function of position and age, mirrored in both the CPU path and the shader, so the behaviour is testable without a GPU
zmem(REFACTOR): WaveUniforms now builds a pure Float32List via pack behind a thin apply, with floatCount as the single source of truth for the shader layout — deterministically testable and guarding the stale-shader mismatch class
zmem(DECISION): the pointer proof observes ripple spawns through an onRipple callback carrying the normalized position, keeping the widget behaviour provable without asserting shader pixels
- adds a deterministic uniform-packing test asserting the packed float count matches the shader layout
zmem(DECISION): the Interaction page demos tap/drag ripples and ping-pong sway; a third gallery page completes the milestone navigation
zmem(DECISION): presets are generated from a shared layered builder over a palette and shape kind, keyed by name in byName as the single source of truth for all/names — a broad gallery stays maintainable without hand-writing every layer
- restores the classic violet theme from the original WaveScreenStyle.violet
zmem(DECISION): the gallery proof asserts breadth, per-preset renderability within the shader layer budget, and unique reachable names — the release contract for the preset catalogue
- widens the existing preset test from a fixed count to the gallery minimum
zmem(DECISION): the gallery page renders every WavePresets.byName entry so the example doubles as living documentation of the catalogue
zmem(DECISION): 0.1.0 is a breaking rewrite documented as such — trait model, shapes, motion, interaction, presets, and the GPU-with-CPU-fallback rendering note
@ZackaryW ZackaryW merged commit 2fb4e5c into main Jul 6, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant