Parsing Roblox's .rbxm binary format turned out to be a much bigger project than expected. Roblox has shipped several different mesh formats over the years, and none of them are officially documented in one place.
The problem
A .rbxm file can contain MeshPart geometry in at least three different sub-formats depending on when it was created:
- Plain ASCII text (v1.00/1.01)
- Raw fixed-size binary vertex/face records (v2.00-v4.01)
- A chunked container wrapping Draco-compressed geometry (v7.00+)
Supporting only the newest format meant older uploaded meshes silently failed to render.
The fix
I ended up writing a dedicated parser for each version, dispatching off the version string in the file header. The Draco path was the trickiest part, since Roblox uses non-standard attribute IDs that don't match Draco's own defaults.
Once all three paths were in place, the viewer could load meshes from basically any era of Roblox Studio without falling back to a wireframe placeholder box.
What's next
Texture support and CFrame reconstruction for full Parts (not just MeshParts) are next on the list.