Ulric
Book a call

Eugene, Oregon · one person, whole builds

The game lab

Ronin plays fetch

Throw the ball, and Ronin, my pit bull, runs it down and brings it back. Three places to play, by day or after dark with the lights on, power set by how far you pull, and an aiming line that is the real flight rather than a picture of one.

Play Ronin plays fetch

Opens in a new tab. Works on a phone, a tablet, or a laptop.

Built by
Eric
When
September 2026
Kind
A back-yard game
Made with
HTML, CSS, JavaScript, Three.js, Blender, Python

Ronin already ran through the procedural world. This gives him something to chase. Press anywhere in the lower half of the screen and draw your thumb back: the further you pull, the harder the throw, and you can ease it forward again before you let go. Slide sideways to aim. Low, Arc or Lob on the switch under the score sets the height, and Low is the one he can catch before it bounces. A dotted line shows the flight while you hold it.

That dotted line is not an approximation of the throw. It is the throw: the same integrator run forward on a copy of the ball, which is why it lands where the ball lands to within a centimetre or two. Gravity, air drag, a bounce that depends on what you are standing on, rolling friction, pilings, and water.

Three worlds. The back yard. A concrete pier, where the ball comes off the slab hard and rolls a long way, a wide throw goes in the bay, and Ronin swims out for it. And a meadow of long grass that kills a bounce dead. Each is procedural three.js, instanced and merged, about thirty draw calls, with its own best score. Pinch to zoom, two fingers to pan, and if you leave the camera alone for a few seconds it goes back to following the dog on its own.

The moon button turns the day into night. The windows light up and the porch light comes on in the yard, two lamp posts and a masthead light on the pier, a lantern on the bench in the meadow with fireflies over the grass. The sun goes down and the moon comes up over about a second and a half, and the ball is the glow-in-the-dark kind, so it lights the ground it rolls across and you can follow it, and so can he. Every surface is lit by its own sky, day or night, through an environment map generated from the dome overhead.

The thrower is sculpted in Blender: thirteen parts, each a union of primitives voxel-remeshed into one smooth surface and exported with its origin at the joint it hangs from, so the game keeps its own pose code and only the flesh changed. Ronin runs with a longer stride and wears the coat painted from his photograph, brindle patches on white, the dark eye, the pink nose.

What it taught Eric

  • Making the aiming line honest by running the real physics forward, instead of a formula that only looks like it.
  • Water that lets a ball back up without throwing it into the air.
  • Driving the throw animation off the pull, so the wind-up is the input rather than a clip played after it.
  • Three worlds inside one scene budget, by only ever having one of them in the scene.
  • A timed meter reads as a skill to the person who built it and as a lottery to the person playing it. A pull you can see is the honest control.
  • Night as a mix between two lighting presets, so dusk is one number travelling from 0 to 1 and every lamp, sky and shadow reads it.
  • Sculpting body parts in Blender with their origins at the joints, so a procedural pose rig can wear them without a skeleton export.