Don Williamson

Don Williamson

@donw.bsky.social

Head of Rendering @ Pacific Light & Hologram ~30 games/engines/platforms: Fable, Splinter Cell, Total War, Dauntless, No Mans Sky, DeepMind Lab, etc. Lionhead/Microsft, Ubisoft, Google/DeepMind, SEGA, etc. https://donw.io https://github.com/Celtoys/

1.1K followers201 following322 posts

Is it that time of the year again? I think it is... The default lighting model in UE makes me really sad. I can't enjoy anything anymore, it's everywhere. You have the culmination of 30 years of engine development at your fingertips. Please, please use it!

I've rebuilt my website with a custom Hugo theme and updated to the latest version of Hugo. Also moved comments to utteranc.es I'll be adding more blog posts soon and starting a non-technical series as it will be a while before my work allows me to talk about what we're doing. donw.io

This was it. This was the big fix. The car slid EVERYWHERE and was generally considered bad to drive. It even defeated the lateral friction forces on the tires! But I was too busy fixing 100 other things on 120 hour weeks. Insane. So close to a great feeling game...

Is it wrong that I'm considering unfollowing/muting people who can't recognise when a re-post or re-tweet or whatever is written by Claude?

View full thread

And to be clear: my position on all this is way more nuanced than LLM=bad, I just vent about what explodes to the top of my "what annoys the old man this morning" pile. But nuance doesn't win friends or alliances, so nobody's interested in that, either. I should go back to shit-posting on twitter!

Is it wrong that I'm considering unfollowing/muting people who can't recognise when a re-post or re-tweet or whatever is written by Claude?

On the other hand here's me twiddling my thumbs and refusing to write blog posts because nobody reads them anymore. They just get consumed by the sponge and shat out in somebody's LLM terminal, uncredited, all personality stripped.

Look what I found! My original compiler in the 90s back in school, bought for me by a friend's parents. Dad threw it away along with all my other stuff when I left home and it's taken me 20 years to track a copy down.

Haha, Story Time! Aged 17 I went to Lionhead for a job interview and showed them I wrote my own build system and visual IDE with dependency evaluation because Watcom's compiler was awesome, but Borland's IDE was better. They look confused and asked me if I knew what makefiles were. "Uhh, no?"

Lord Save Me from the Old Dudes in my LI feed suddenly trying to become "AI Influencers," now that LLMs can temporarily prop up their washed out relevance refusing to step aside and let the younger generations thrive and grow. “LLMs have granted me a second career as a thought leader”

In ~2007 when coding the ambient lighting of Splinter Cell, I had the idea of storing dynamic SH probes in Voronoi cells, where a) dynamic objects could walk/lerp the face graph, and b) static meshes "palettised" probes per vertex and lerped to give Realtime GI. It never shipped but look how pretty!

Some promotional images went out that showed the system working on dynamic objects, but nothing of the dynamic SH updates. The cute thing about the Voronoi approach was that you could fit all possible neighour probe transitions in a single cache line, which was perfect for the PPU at the time.

I was noodling over API design philosophy during breakfast and made a link I should have made long ago about white-board/test interviews. Recently somebody claimed "we have the best engineering team in Europe" and it grated on me specifically because this is how they hired (they weren't very good).

lol: "Compile time is one of the bottlenecks HFT engineers notice every day." I mean, have you SEEN the code these guys write? It's like they looked at Boost and thought it didn't have enough code in its header files and templates in its templates.

I'm getting really tired of reading Claude-generated readmes. The voice and drama is so obvious and it immediately turns me off whatever well-thought-through library I'm evaluating.

Can you imagine how good Irish Rugby would be if the AIL was as competitive as the NPC? David Nucifora proposed it once but failed. Each year I get a little down because all the seasons end and then forget NPC is only few weeks away. Glorious Rugby, almost enough to make you want to move over!

Rode Voltron at Europa Park at the weekend. Nothing in the UK could prepare me for such an amazing experience, totally out of this world. My 10 year old subsequently labelled Blue Fire as "relaxing"! Back home and already rueing the lack of options here.

I added Rust-style error propagation to TypeScript by placing an AST rewriter in front of the compile step. Normally a bonkers idea but using Bazel to apply a build step for this was trivial and a huge win! (Try early-returns any error to the caller, propagating up the call stack)

I used to enjoy writing Go but I just can't look at it any more. It's really distressing seeing nothing but if/return blocks everywhere, obfuscating control flow in a way that could have been solved. So the server is being written in C# because Go is just not enjoyable anymore.

8 years ago I ported Remotery's UI from JavaScript to TypeScript and added a pretty awesome docking and control layout system. It's massively simpler than the standard dance you have to do, and uses auto snapping/anchoring. Quickly copied over just the window management and it feels great!

The Danger Coder: just enough knowledge to write lock free code, not enough insight to know the difference between lock free and wait free, not enough wisdom to know that the mutex was better.

Star had its own imgui built with NanoVG. One of the funnest bits of the engine I wrote. TypeScript has the DOM canvas so porting the UI window basics from C++ was trivial! Including that lovely "throw that window out of your way" feature 😄 (sim moves faster because it's a fixed-dt multi-stepper)

The rest of the UI will take a while longer but I can apparently get a whole bunch of browser accessibility reuse by using a "hidden input control" used to drive my own rendered text edit box. For another day...

Ported to TypeScript: Thing/Part updates, harmonic scheduler, sphere-constrained fly camera and a ray-traced visualisation of the earth-size planet. Feels exactly like the C++ version despite being 0.0001% of it. But it lives! (lines are askew because it's an octahedral subdivision of the sphere)

Can't explain how liberating this feels. I tried breaking down the many 15 year old tech debt problems from the C++ side (e.g. D3D11, 32-bit, pre-libclang) but it was just churn with no end in sight. I'm seeing immediate progress this way round. But it might not go anywere 😅

Math library all in! Matrices, quaternions, vectors; all HLSL-like. C++ code used pycgen to avoid templates and worked well. Thankfully TypeScript doesn't have template-compile-time-bloat or need fwd-decl discipline, so could template everything and alias simple types. No operator overloads tho :(

Ported the Thing/Part system from C++ to Typescript and made massive gains for V8-style hot loop optimisations and GC traffic reduction/zombie removal using a Handle system. Wrote my first ever WebGPU code to get started in porting the rendering. Feast thine eyes on yon glory!

You know that Thing that happens when you live with somebody for a long time? You start taking on each others' speech patterns? I'd say it's pretty easy to tell the high-volume LLM users for just that reason: "the bit that bites", "this is load-bearing", etc. You can't un-notice once you hear it!

Don Williamson reposted

I’m happy to announce the release of a new open source 3D physics engine called Box3D. I’ve been working on this project for a few years now, but it represents over 20 years of experience writing physics engines for games. Read more here: box2d.org/posts/2026/0...

box2d.orgAnnouncing Box3DI’m happy to announce the release of Box3D, an open source 3D physics engine. It is now available on GitHub. Box3D repository You can think of Box3D as a fork of Box2D, extended with many features nee...

What sounded insane is actually playing out really well: porting my aging C++ moonshot to TypeScript and WebGPU. I recall the weeks I spent perfecting the dynamic octree split/merge/constrain queues. Fond but painful memories. Ported in a day; old me actually had a use for once!

Heretical but I build my Typescript/Typia and C# code with Bazel because the concept of a language package manager that mutates your machine is exactly the footgun that can run riot. Packages are a pinned, hashed input like any other build input. Hermetic, no global tool leaks, no post-install crazy

I need to write a blog post on this because Bazel is the better small-project C++ builder. Barely anybody knows this yet because they haven't looked beyond the "you are not Google" sentiment. But it can be simplified to point of liberation from the scourge of CMake and its ilk.

When I read code, a visual model builds in my head. Hand me a node graph and it's just inert boxes and lines I have to translate. For others it's the reverse. Neither's richer and different formats suit different heads. But whatever format you pick: JUST MAKE SURE YOU CAN DEBUG THE FSCKING THING.

I see 5 satellites every minute looking up at the stars now. The meditative state I used to reach while in awe of the cosmos, has been ruined. If you worked on this ruinous technology, I hope there's at least a little shame in there. But I doubt it.

Don Williamson reposted

New recording and replay feature added to Box2D. Uses determinism to exactly reproduce the simulation for your game. Debug your game with all details including ray casts and other queries. Deterministic rollback too. box2d.org/posts/2026/0...

box2d.orgReplayReplay is a new system I developed for Box2D. The main goal is to allow users to send me files I can use to reproduce bugs. Because Box2D is open source, I can rarely run a user’s game or see their co...

C++: "We focus on performance!" Me: "OK so where's my memset32 or memset64, then?" C++: "Ohhhh don't worry about that. The compiler will do that for-loop automatically for you!!! (but not in debug obviously)" Me: C++: *shit-eating-grin*

Just realised on Fable 3 we gave special thanks to the engine and systems and gameplay teams who only worked on Fable 2. Awesome; that's how it's done!