Steven’s blog

This is where I post about my side projects so I can feel like I actually shipped something.


One day maybe I’d like to make a game. Currently focused on learning Mandarin, and building an app, Bookchoy to help with that.


Engineer at Solo.io, but I don’t write about much networking/infra/work stuff here.

I'm gonna release my Chinese app

It’s been a while! My last post was about this app, about a year ago after a couple months of work. I did not expect this to be a long-term project. Studying Mandarin became one of my main hobbies. Using my own app to study was cool, but it had lots of issues so I kept chipping away at it over nights and weekends. At this point I use it daily. After showing my in-laws (who are Malaysian Chinese, and native speakers), they showed enormous support and ended up motivating me to polish it for release as a proper app. ...

Steven Landow

Building my own app for learning Chinese

I’ve been studying Mandarin Chinese for a few years, starting with basic phrases (Pimsleur) and then moving on to Hello Chinese. This app was excellent for the basics, offering (quality!) gamified lessons and a content of library with a slick reading interface where you could tap unknown words for translation and audio. After completing all the structured lessons, I focused on reading. When I saved new words, they went into a separate review system: flashcards. I found this system, particularly the self-grading aspect, less engaging than the original lessons and their multiple-choice based review system. ...

Steven Landow

3D Autotiling pt. 2: Expanding and Optimizing

In the last post we were able to randomly generate “correct” looking 3D shapes. However, my goal was something that a user or game developer could create levels with. Let’s look at our requirements: The user should have direct control of the generation. BorisTheBrave describes calls this “Driven WFC”. We need a lot of tiles. That would take a lot of time to model for a game developer. This isn’t totally avoidable, but we can optimize our workflow. If the user is going to interact with this, the algorithm for solving the generation needs to be fast. Our naive implementation needs a major upgrade. Driving WFC Initial Constraint Our method of “driving” WFC will be specifying which cells aren’t empty as an initial contraint. ...

Steven Landow

3D Autotiling pt. 1: Basic WFC

Introduction I don’t think I would have become interested in shooters if it weren’t for Halo 3’s forge mode. I probably logged 1000 hours in Minecraft when I was a kid (and learned Java because of it!). Games that let you make stuff are the best. Making games is even better. After a few years focusing on my career in network programming I decided to revisit games, this time looking at 3D. ...

Steven Landow

Faking Buoyancy

During the intro to a game I (perodically) work on, the player starts on a pirate ship. Realistic water doesn’t fit the style, and scroling textures on a big plane looked pretty boring. To make things a bit angrier I needed intense waves, and I needed those waved to actually affect the world. Waves To keep it simple, I just did procedural heightmap; i.e. set the vertical coorinate to be a function of the horizontal position and time. ...

Steven Landow

Non-Destructive Terrain Editor

I am not a good artist. One of the reason 3D is a bit more attractive to me is that I can usually build something rather than draw it or sculpt it. Digital art gives you an “undo” button, but being able to undo or redo things out of order makes it even easier to experiment. Most of the terrain tools out there have a destructive workflow. Using various brushes, you write directly to a heightmap. Including the concept of “layers” can help here, but I want something closer to modeling. ...

Steven Landow

Triplanar with Deep Parallax in Godot

Triplanar mapping is already expensive, and multiplying that by the samples for paralax occlusion mapping is probably a bad idea. It was fun to implement this anyway, even if I don’t use it in a game. In my current WFC prototypes, I’m re-using models and rotating them. At some point I’ll need to handle also transforming the UVs based on the rotation of the tiles’ models, but for now triplanar mapping is a quick way to get an idea of how things might look. ...

Steven Landow

Train Station

I saw this picture on Reddit or something, and I decided to recreate it. There were other decorations I wanted to put in the train station, like a Goblin-themed vending machine and better-looking torches. I needed to wrap it up and move on. To build the environment, I re-used the tileset that I made for my Wave Function Collapse level editor. Rather than copying the tiles into this blender file and arranging the tiles by hand, I was able to use my level editor in Godot, then snapshot the scene using PackedScene, and export the tscn as GLTF, which I then imported in Blender. ...

Steven Landow

My First Character Models

These are a few of the first things I ever made in Blender. It turns out characters are way harder than hard surface. Legfish Literally the first completed model I ever made in Blender. For this, I used a Skin Modifier and Subdivision Surface based workflow. Joey Carlino has some great tutorials for this on YouTube. A nice starting point, but a bit finnicky. Cat Knight I read the first few chapters of The Animator’s Survival Kit because Mixamo animations look pretty bad on stylized characters, and winging it produced wasn’t working either. I’m never going to be a professional animator, but it’s nice to be able to throw things together for my own use. So this is my first run cycle. ...

Steven Landow