FYI - there's a presentation about Incremental UI's at https://www.youtube.com/watch?v=LkSWyqNUBq8
Really speaks to me since I've been doing a lot of React at my dayjob, and ended up with an approach I really like for splitting between App state (FRP) and UI State (React class components) and DOM View (React functional components) - but it totally feels like there's something better lurking there...
In terms of Raw WebGL - that's been my nighttime / side project for a bit of a while now and my excuse for not getting into any of the language learning I want to do (still on the fence about whether it'll be Rust or Purescript/Haskell.... kinda leaning towards purescript actually because so many of the things I want to do require understanding Haskell, but I'm building for the web, and Purescript looks more appealing than GHCJS)
Anyway - about that WebGL thing, I've made significant progress to build a renderer but it's not done yet. Conceptually though it's working and it's supporting most of the GLTF Spec so far... you can see it in action at https://dakom.github.io/pure3d/#/gltf/DAMAGED_HELMET_BINARY
The implementation idea is pretty much something like:
--setup--
1. Load all the required data
2. Create a memoized function that has all the IO needs cached - return a render()
function for side effects.
3. render()
expects a Scene
which is pure data, completely based on simple primitives (actually it's mostly number
and arrays - I think there's only one string
in there). Given that it's pure data, it could even be serialized.
4. create a function createScene()
that can generate a new Scene
, based on the loaded data.
--game start--
1. Call createScene()
and pass that result into a FRP pipeline (could even be in a separate thread)
--game loop--
1. Pipeline may creates new immutable copies of Scene
, and it doesn't matter how it modifies it (e.g. even deleting nodes is completely fine) - the only catch is that certain properties of the scene should have the same value as they were when it was originally created (e.g. lookupIds)
2. At the end of the pipeline, pass the resulting Scene
into render()
It's far enough along that I can probably put together a demo with Sodium - maybe a 3D bouncing ball Will try to do that in the coming week