Post

i recently finished v2.0 of my browser-based World of Warcraft level viewer! so here's a thread on what it is, how it works, and a visual history of its development check it out at noclip.website by searching "World of Warcraft", finding a zone you wanna explore, and fly around w/ WASD + mouse

one nice thing about noclip is it'll save your current camera position in the URL, so to share a specific location, just share the URL: noclip.website#WorldOfWarcr... you'll want a decent computer and internet connection to use it. also, these flythrough videos are all from noclip's builtin tooling

getting the project to this point took a truly insane amount of time, research, and debugging that's kinda difficult for me to wrap my head around now. it all started about a year and a half ago when i was looking for a new hobby project to sink my teeth into

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)

0 reposts0 likes

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