Creations

(side projects and demos)


Material Palette is an open-source Flutter package that adds a library of shader 'materials' that use basic noise functions to create natural-looking animated textures that can be used to style Flutter widgets accross android, ios, desktop, and web platforms.

Each of these is implemented as a single GLSL fragment shader, and some of them sample wrapped flutter widgets to apply effects like a Kuwahara filter or a crepuscular ray lighting effect to the wrapped child widgets. You can browse them all in the live demo.


Boaty Boats is a sailing simulator: pilot a little sailboat across a restless marshland. I made it for a game jam with some friends.

The sea is the fun part. Instead of a static texture or fragment shader that cannot be used for physical interactions in the scene, the water surface is models as a collection of wavelets, persistent sinusuoidal waves, and Gerstner waves, and is sampled via a compute shader every frame to make the water surface heightmap available for physics interactions. Note how the waves and sailboat wake affect the grass in the scene.

To remain efficient, the water surface is sampled only in the camera's view frustum, and sampling density follows a non-linear curve with dense detail near the camera while the ocean still appears to reache unbroken to the horizon. Physically-based shading adds the reflections and the sun-glint you can see in the thumbnail. You can try it out here.


LSystem is an interactive visualizer for Lindenmayer systems: grammars that grow a string by repeatedly rewriting symbols according to a set of production rules. The result is interpreted as a 3D scene based on a separate set of 'turtle' drawing commands that the symbols are mapped to.

Starting from a short seed and a handful of rewrite rules, a simple input blossoms into long, self-similar sequences. Handing those symbols to a 'turtle' that moves, turns, and branches in 3D produces plants, trees, and fractal forms. You can pick a preset or write your own rules, tune the number of iterations, and watch the geometry rebuild live.

L-systems were introduced by botanist Aristid Lindenmayer in 1968 to model the growth of plants and algae. I made this with WebGL via Javascript and Three.js; the geometry is generated in a background Web Worker so the interface stays responsive even while large structures are built.


Murmuration is a simulation of emergent behavior that is often visible in nature in schools of fish or flocks of birds. The term 'murmuration' is the word for a flock of starlings, which often demonstrate emergent flocking behaviors.

This simulation is based on the Boids algorithm made by Craig Reynolds in 1986.

The 'boids' in this simulation are governed by simple rules that lead to their collective behavior: avoid running into other birds, match velocity with nearby birds, and steer towards the average center of nearby birds. You can tune these behaviors with the included controls.

Built with WebGL via Javascript and Three.js.


SuperShape is a tool that generates a 3-dimensional parametric surface representation of a 'superformula' (or really, 2 superformulae combined). You can also download and save the shapes you make.

The 'superformula' was created by Johan Gielis around 2000 as a way of representing shapes found in nature. Many of the shapes generated are similar to ellipsoids or hyperbolic forms. I'm certainly not the only person to make one of these: Paul Bourke has a nice site with lots more information about this and other cool maths.

SuperShape is written in C++(20) and cross-compiled to webassembly to run in a web browser. You can try it out yourself (but it might not work great on mobile).

I wrote this tool both to quickly make cool 3D shapes as a starting point for my own projects, but also because procedural generation is neat. Lots of games use procedural generation in some form, but some games take it to a new level, generating whole worlds and universes (stuff like Spore, Love, and No Man's Sky), and that's really cool.