We approached the project as a lab with short cycles: hypothesis → test → evaluate → document.
- Legacy parity
- Chose a single post‑processing stack (FXAA, Bloom, Motion Blur) for stability.
- Tuned Bloom (kernel/threshold/blur) and Motion Blur (vectors/prev textures).
- GLSL3 migration
- Removed glslify and consolidated precision/defines.
- Rewrote FXAA as a self‑contained shader.
- GPU simulation with fallback
- FBO ping‑pong with a "Fibonacci sphere" initializer.
- Prev/current textures exposed as getters to avoid stale references.
- UI and experience
- Leva for live controls.
- Styled‑components + tokens/themes for visual consistency.
- Prioritize a complete and stable path over multiple mediocre alternatives.
- Document trade‑offs (why legacy post‑fx) and keep improvements scoped and measurable.
- Centralizing precision/uniforms reduces shader fragility.
- A defensive composer avoids feedback loops when toggling effects. /- Keeping clear contracts between simulation and render simplifies future changes.