One Format, Every Map

The .blvl level format stores everything a traditional FPS map needs to render. From the core geometry, collision data, lightmaps, spawns, doors, breakables and triggers, and more. Everything translated to a single Quake-style coordinate system making compatibility easy. Bake from your favorite FPS maps, load anywhere.

Inside a BLVL

The section tree needs JavaScript. The spec describes the same layout.

Supported Source Formats

Quake III Arena, Urban Terror

pk3 · idTech3 · IBSP 46

From the game files

  • entities lumplump 0
  • textures lumplump 1 · shader names
  • planes, brushes, sideslumps 2, 8, 9
  • vertices, meshverts, faceslumps 10, 11, 13
  • lightmaps lumplump 14 · 128² gamma8
  • lightvols lumplump 15
  • .shader scripts, imagesthe layered pk3 path

What the importer does

  • shader script resolveq3/shader.rs
  • bezier tessellationdraw at 6, collide at 3
  • entity + jump-pad solveballistic, against --gravity

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • sites

Source 1

Counter-Strike: Source, Half-Life 2, Team Fortress 2, legacy CS:GO · VBSP 19–21

From the game files

  • faces, brushes, texinfolumps 7/58, 18, 6
  • displacementslumps 26, 33
  • static propsgame lump 'sprp' · mdl, phy
  • lighting lumpLDR 8, HDR 53 · RGBExp32
  • leaf ambient lightinglumps 55, 56
  • worldlights, cubemapslumps 15/54, 42 · c*.vtf
  • entity lumplump 0 · round-logic outputs
  • .vmt and .vtfvpk archives + pakfile 40

What the importer does

  • displacement tessellationsource/disp.rs
  • bump basis, light styles3 pages · 64-entry table
  • leaf ambient to a gridsource/grid.rs · 64 units
  • vmt chain, vtf decodesource/vmt.rs, vtf.rs

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • cubemaps
  • props
  • sites

Source 2

Counter-Strike 2, Deadlock · hand-parsed, no Valve tooling

From the game files

  • world and world nodesvwrld_c, vwnod_c
  • placed modelsvmdl_c · meshoptimizer
  • world_physicshulls and collision meshes
  • entity lumpsvents_c · binary KV3
  • lightmaps, probe volumesvtex_c · BC6H
  • materials and texturespak01_dir.vpk
  • post volume, env_skyvpost_c, vmat_c

What the importer does

  • KV3 and block decodev2 to v5 · LZ4, zstd
  • meshopt vertex, indexsource2/meshopt.rs
  • coplanar tris to polygonssource2/phys.rs
  • probe slabs to a gridmost indoor volume wins

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • cubemaps
  • sites

Apex Legends

Respawn’s rBSP · RPak v8 and starpaks, read in place

From the game files

  • map rpaksRPak v8 · Oodle · by GUID
  • starpakspc_all, pc_all.opt
  • rBSP world meshesv52 · lumps 0x03, 0x47–0x52
  • materials and texturesmatl v23 · txtr v10
  • static propsgame lump 0x23 · mdl_ v20
  • BVH4 collision treelumps 0x10, 0x12–0x14
  • lightmaps and probesRGB9E5 pages · band-1 SH
  • entity text.ent files + lump 0

What the importer does

  • world mesh buildapex/scene.rs, brushes.rs
  • BVH4 to mesh collidersapex/bvh.rs, collision.rs
  • instanced propsapex/props.rs, mdl.rs
  • lighting importprobes to an ambient cube

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • lighting
  • entities
  • props

Valorant

Unreal Engine · .utoc and .ucas, read in place

From the game files

  • .utoc / .ucas containersOodle, never encrypted
  • .usmap property mapsper patch, from FModel
  • persistent + sublevelsart, bomb layer, pawn
  • StaticMeshComponentinstanced, via archetypes
  • MapBuildDataRegistrylightmaps, per-instance bias
  • kill and bomb volumesBP_PlayerKillVolume
  • ShooterTeamStartTeamRoleComponent

What the importer does

  • Zen package readunversioned props by index
  • shapes, polygons or voxelsvoxels past 60 polygons
  • HQ coefficient decodeirradiance + direction
  • skydome renderfrom the spawn centre

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • sites

Overwatch 2

via a DataTool extract · the one frontend with a step outside this repo

From the game files

  • OWMAP scene2.1 · placements, lights
  • OWMDL meshes2.0 · pre-swizzled verts
  • OWMAT materials3.0 · texture-type hashes
  • DDS texturesBC blocks from TankLib
  • .owphys shapesour extract-physics verb
  • Lighting/ statesun.json, lut.raw, probes

What the importer does

  • (x, −z, y) swizzleUV flip · --ow2-scale
  • shapes to collidersrender-hull fallback
  • traced irradiance volumeow2/grid.rs · 64 units
  • dome layers to a cubeow2/sky.rs · 256 px

Sections it fills

  • sim
  • geometry
  • textures
  • skies
  • lighting
  • cubemaps
  • entities

Call of Duty 4

IW3 · fastfiles, read straight out of the install

From the game files

  • fastfile zonezlib · over common_mp.ff
  • GfxWorld draw surfacesverts, lm uvs, tangents
  • ClipMap brushes, modelscbrush_t, CStaticModel
  • lightmap and light gridARGB8 pages · 32×32×64
  • .iwi images in *.iwdversion 6 · DXT blocks
  • entity string, gsc, visionraw files in the zone

What the importer does

  • block allocator replayiw/stream.rs · pointers
  • lightmap reconstructionfrom the game's own shader
  • models to world + hullslit from the light grid
  • six faces to a sky cuberesampled, not rotated

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • cubemaps
  • sites

Call of Duty: Modern Warfare 2

IW4 · the 2024 rebuild, 64-bit zones

From the game files

  • fastfile zonesigned IWff0100 · 64-bit
  • GfxWorld draw surfacesa list of skies, not one
  • ClipMap brushes, modelsbrushBounds, 16-bit idx
  • lightmap and light gridARGB8 pages
  • .iwi images in *.iwdversion 8 · DXT blocks
  • entity string, gsc, visionraw files in the zone

What the importer does

  • block allocator replayiw/stream.rs · 8-byte Abi
  • lightmap reconstructionfrom the game's own shader
  • models to world + hullscollision off the clipmap
  • six faces to a sky cuberesampled, not rotated

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • cubemaps
  • sites

Call of Duty: Black Ops

T5 · Treyarch's fork of IW3, multiplayer, campaign and zombies

From the game files

  • fastfile zoneover common, _mp or _zombie
  • GfxWorld draw surfacesvertex green is a blend weight
  • ClipMap brushes, modelsflags on the brush itself
  • lightmap and light grid5:6:5, G16R16 and DXT1 pages
  • .iwi images in *.iwdstreamed, not in the zone
  • entity string, gsc, visionraw files in the zone

What the importer does

  • block allocator replayiw/stream.rs · shift 29
  • lightmap reconstructionfrom the game's own shader
  • models to world + hullslit from the light grid
  • six faces to a sky cuberesampled, not rotated

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • cubemaps
  • sites

Halo 2 Classic

second-generation Blam · Master Chief Collection caches

From the game files

  • the .map cachezlib chunks · tag index
  • structure BSP clustersparts, materials, streams
  • instanced geometrydefinitions + transforms
  • collision BSPplanes, surfaces, edges
  • lightmap tag bitmapspages, page indices, colours
  • scenariospawns, volumes, placements
  • sky tagrender model + fog block
  • textures.datzlib runs · DXT blocks

What the importer does

  • raw resource blockshalo2/section.rs · 'rsrc'
  • edge rings to hullscoplanar merge by type
  • incident dir to an L1 bandrotated per tangent frame
  • sky model to a cubehalo2/sky.rs · 512 px

Sections it fills

  • sim
  • geometry
  • textures
  • lightmaps
  • skies
  • lighting
  • entities
  • sites

Reflex Arena

text brush maps, paks and workshop items

From the game files

  • the .map textversion 8 · prefab sections
  • brush vertex, face rowsmaterial, colour, UV transform
  • entity key/value linestyped, one per line
  • the .light sidecarSH volumes + probe faces
  • base/*.pak zips.material, .textureset, .mesh
  • WorldSpawn sky keystimeOfDay, skyAngle, fog

What the importer does

  • prefab flattennested up to eight deep
  • editor clip materialsclip, weaponclip, volumes
  • SH to an ambient gridreflex/light.rs
  • procedural sky gradientreflex/sky.rs

Sections it fills

  • sim
  • geometry
  • textures
  • skies
  • lighting
  • entities
  • cubemaps
  • sites

Star Wars Battlefront II (2005)

Pandemic’s Zero engine · one ucfb container per map

From the game files

  • the .lvl ucfb chunksno index, nothing packed
  • core, common, ingame .lvlcom_ class models, collision
  • modl and segm stripsfloat verts · MTRL flags
  • tern heightfield8×8 patches · LTEX layers
  • coll meshes, prim shapesMASK: solid or through
  • lght config treeglobals + runtime lights
  • sky_ dome and panoramafog only with both
  • tex_ chunksDXT1 and DXT5 pass through

What the importer does

  • ucfb walk + name indexhashed, no directory
  • strips to triangle listsdegenerate stitches cut
  • terrain patch placement(grid / 8)², row by row
  • panorama to a sky cubefaded to ground ambient

Sections it fills

  • sim
  • geometry
  • textures
  • skies
  • lighting
  • entities
  • props
  • sites

Desktop App

Finds the games you have installed, bakes their maps into .blvl files in a queue, and opens any level in a live 3D view. The newest release, for:

Example Usage

Rust
let file = blvl::LevelFile::read("ut4_uptown.blvl")?;
let sim = file.sim()?;
let world = blvl_trace::World::from_baked(
    &sim.colliders, &sim.triggers, &sim.teleport_dests);
let hit = blvl_trace::trace_box(&world, half, from, to, skin);
TypeScript
const level = await LevelFile.open(fromBlob(file));
const sim = (await level.read('sim'))!.root;
const geo = (await level.read('geometry'))!.root;
device.queue.writeBuffer(vbo, 0, vertexBytes(geo));
device.queue.writeBuffer(ibo, 0, indexArray(geo));