v0.1.0#1
Merged
Merged
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.