Post

i'd already spent a fair amount of time using @jasperrlz.bsky.social's noclip framework writing a Halo level viewer, and as a recovering WoW subscriber from back in the vanilla days, i wondered how feasible getting an older game like WoW classic into noclip would be

but first, it might be helpful to outline how exactly noclip.website works. Jasper's put together a really nice TypeScript & Rust framework for building scenes in WebGL/WebGPU, plus a ton of utilities for the kinds of math, debugging, and camera manipulation one commonly does in 3D graphics

one core tenet of noclip.website development is that its game viewers should, as much as possible, work from native game files. this means that each viewer is a bespoke parser of the original game file formats, and writing one usually means recreating a reasonable portion of the game's engine

as such, my WoW viewer needed to understand the file formats as they shipped w/ vanilla WoW. or, to be precise, as they shipped with WoW Classic. and to get things started, i began with the game's texture format, BLP in all of the following posts, check image alt text for more dev details

(as an aside, all of the screenshots following this were recovered from my discord DMs w/ Jasper, so what follows is a roughly chronological account of what my viewer looked like through development)

after textures, i moved on to models. these are pretty straightforward: they're mostly just triangle meshes which reference one or more BLPs as textures

you probably noticed the models above are sideways; as it turns out, in graphics, concept of which 3D dimension is "up" is fully arbitrary, and each studio chooses their own convention. each noclip viewer has to adjust for this to get things from their "studio space" into "noclip space"

after models, i moved on to rendering WoW's terrain. terrain in WoW is stored in chunks called ADTs, which are fixed mesh grids that're 1024 points wide and 1024 points long. each point in the grid can have an arbitrary height value, thus giving us a sort of mesh blanket that forms the terrain

"but wait, if each point of terrain can only have one height value, how do caves and stuff exist??" what an astute question, hypothetical reader! and it brings us to the last major renderable object in WoW, the "world map object", or WMO. WMOs are how caves, buildings, and entire cities are stored

if you're familiar with how WoW looks, you might note that the colors in the above images are pretty off. that's because at this point, i was rendering geometry and textures, but doing nothing to handle lighting. all of that came quite a bit later, so for now these scenes will look pretty flat.

but with these 4 ingredients (BLPs, models, ADTs, and WMOs), we can finally start rendering proper levels! well, again, not really proper due to the total lack of lighting, but at this point in the project i was seriously ecstatic just to see Ironforge nestled in its mountain here

speaking of bugs, one of my favorite things about Jasper's noclip framework is the bevy of debug tools he's written into it. it's hard to overstate how useful it is to display debug information in-place when working on 3D scenes, or to use a debug shader to track down incorrect model normals

once i'd rounded out most of the major graphics systems for vanilla WoW, i thought i'd try and load up some levels from the 2 subsequent expansions, Burning Crusade and Wrath of the Lich King. to my amazement, they kinda just worked! here's some screenshots of what they looked like then vs. now

sadly that's about all the archival footage i've got from the dev period -- at some point, whenever i ran into an issue, i'd just hop on a discord call w/ Jasper and screenshare rather than sending screenshots. here's an early version of the particle system in action, though

there's more to tell about this project, but i'll leave here for now. i'd like to give a ton of thanks to @jasperrlz.bsky.social, without whom i'd certainly never have written this project, but also for being an incredibly patient and generous mentor and co-conspirator on this project

i learned a tremendous amount about reverse engineering, 3D graphics, linear algebra, etc from this, most of which i had very little knowledge of before starting. if there's one takeaway here, it's that if you've got passion, time and persistence, you can accomplish a heck of a lot

Great work on the Vanilla, TBC, & WOTLK zones. I sure hope there will be zones from the Cataclysm, Mists of Pandaria, Warlords of Draenor, Legion, Battle For Azeroth, Shadowlands, Dragonflight, & The War Within (Once 11.2.7 is out).