BSPX is a format originally invented by Tonik, I believe, and is already implemented in both ezQuake and FTE. It is not so much a format itself, but more of an extensible way to shove additional lumps within an existing BSP. Typically these additional lumps will provide supplemental information or replace existing info. BSPX itself can logically be applied to the BSP file format of Quake, Quake II, or Quake III. BSPX itself can be defined in just the following two structures: typedef struct { char lumpname[24]; // up to 23 chars, zero-padded int fileofs; // from file start int filelen; } bspx_lump_t; typedef struct { char id[4]; // 'BSPX' int numlumps; bspx_lump_t lumps[1]; } bspx_header_t; The bspx_header_t struct can be found immediately following the BSP's standard header. It is only valid if the standard header specifies no lump as starting at that location, and if the magic id matches. The engine can then walk the lump list looking for lumps that it recognises. Unknown lumps MUST be ignored. These lumps are currently defined: RGBLIGHTING: (applies to fte, ezquake, qss) This is equivelent to the information stored in a .lit file (sans header), and must contain the same number of samples as the lightmap lump would normally contain, because it doesn't make much sense otherwise. Presence of this lump permits omitting the regular mono lightmap to save space, but doing so will harm compatibility. LIGHTING_E5BGR9: (applies to fte, parsed by qss only as a fallback) This is a more advanced alternative to RGBLIGHTING. Each luxel is a E5BGR9 int32 packed value (ie: on little-endian machines, the exponent is the high 5 bits), resulting in what is effectively a memory-efficient floating point rgb value. This lightmap format virtually removes all oversaturation limits, and promises greater precision in dark areas too. This format is directly supported on ALL OpenGL[ES] 3.0+ gpus (aka: GL_EXT_texture_shared_exponent). As a floating point format, a logical value of 1.0 is considered as identity (instead of 255 being an [overbright] multiplier of 2.0). Lighting values are always assumed to be linear. LIGHTINGDIR: (applies to fte) This lump contains averaged surface-space light directions (read: deluxemap), equivelent to fte's .lux file, or dp's .dlit files (sans header). (as unorm values, these need to be biased before use). If bumpmaps or specular maps are not available then the effects of this may not be significant/noticable. LMSHIFT: (applies to fte, qss) This is a series of per-surface bytes. Each byte provides the (1<