TextureMap and CompiledMip
A TextureMap describes an image and its mip chain. Larger levels can live in separate CompiledMip resources, while smaller levels remain in the parent body. Observed · RR Breakpoint also uses TextureMaps and TextureSets, supports separately stored high-resolution mips and uses unswizzled PC textures. These community descriptions do not establish the Riders Republic byte offsets for Breakpoint. Sourced · GRB · GRB modding reference
Shaun White Skateboarding
Section titled “Shaun White Skateboarding”only in SWS
A Shaun White Skateboarding texture is one TextureMap object that holds its whole mip chain inline: there are no separate high-resolution mip resources. A CompiledTextureMap is embedded in the same body. Width, height, depth, format, dimension, gamma, mip count and the address and filter modes are stored twice, once before the pixels and once after them, and the two copies agree. A strict reading of every one of the 40,851 TextureMaps of the 33 data forges of the PC build reads the body below to its exact end, with the two copies equal on every texture. Proven · SWS[every TextureMap of the install]
Little-endian. Body offsets, with the managed byte at 0. The body ends with the compiled copy on all 40,851 TextureMaps of the install.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 = 1 | managed | Proven | 1 on every TextureMap |
| 0x1 | 4 | u32 | id | Proven | the object's id in its entry's directory |
| 0x5 | 4 | u32 = 0xA2B7E917 | class | Proven | CRC-32 of TextureMap |
| 0x9 | 4 | u32 | width | Proven | level 0's width; the game creates its texture with it |
| 0xD | 4 | u32 | height | Proven | level 0's height |
| 0x11 | 4 | u32 = 1 | depth | Observed | 1 on every TextureMap; no volume texture is stored |
| 0x15 | 4 | u32 | pixel format | Proven | codes 0, 2, 3, 4, 5 and 12 occur; see the format codes page |
| 0x19 | 4 | u32 | dimension | Proven | 1 flat, 2 cube (created as a cube texture); only these occur |
| 0x1D | 4 | u32 | gamma | Observed | 0 linear, 1 sRGB; both are created with the same Direct3D format |
| 0x21 | 4 | u32 | mip count | Proven | levels per face; 0 means one level |
| 0x25 | 12 | u32[3] | address U, V, W | Observed | |
| 0x31 | 12 | u32[3] | magnification, minification and mip filters | Observed | |
| 0x3D | 4 | u32 | map type | Observed | |
| 0x41 | 4 | u32 | category | Observed | |
| 0x45 | 3 | u8[3] | flags | Unknown | the first byte takes the values 0, 1, 2, 4 and 5 |
| 0x48 | 4 | u32 | user category | Observed | |
| 0x4C | 1 | u8 = 0 | compiled pointer | Proven | 0 on every TextureMap: the compiled object follows inline |
| 0x4D | 4 | u32 | compiled id | Proven | the inline CompiledTextureMap's id |
| 0x51 | 4 | u32 = 0x13237FE9 | compiled class | Proven | CRC-32 of CompiledTextureMap |
| 0x55 | 4 | u32 | pixel byte length P | Proven | |
| 0x59 | P | bytes | pixels | Proven | levels largest first; a cube map holds six complete chains face by face, in Direct3D's +X, -X, +Y, -Y, +Z, -Z order |
| 89+P | 4 | u32 = 2 | platform | Proven | 2 on every TextureMap |
| 93+P | 4 | u32 = 32 | SDK version | Proven | 32 on every TextureMap |
| 97+P | 52 | u32[13] | compiled copy | Proven | width, height, depth, mip count, format, dimension, gamma, address U V W and the three filters again, equal to the fields above on every TextureMap |
Each level is its format’s size for its dimensions (blocks round each axis up to four texels), and the levels of every TextureMap of the install fill its pixels exactly, with no byte before, between or after them. Proven · SWS[every TextureMap of the install]
The game uploads each level’s stored bytes unchanged. On the game’s own loader and renderer run from a new game to the start of the level-02 load, each of the 6,024 levels of the 1,037 TextureMaps it created a texture from was copied into the texture’s locked level byte for byte, at the same face and mip, with the width and height above; no texture is converted, swizzled or re-encoded on the way. Observed · SWS[every texture the game loaded on that route]
The texture reached from a material is a TextureMapSpec object whose last u32 is the TextureMap id. Observed
The 40,851 TextureMaps of the install comprise 21,402 of code 2, 401 of code 3, 2,126 of code 4, 14,931 of code 5, 1,981 of code 12 and 10 of code 0; 330 of them are cube maps (100 of code 2, 99 of code 4, 131 of code 5). Proven · SWS[every TextureMap of the install] The 13,019 mip levels of level 01 and the extra forge decode to the same pixels as an independent block decoder. Observed · level 01 and the extra forge
Graphical interface textures keep their rows upside down. The loading screens of the extra forge are 1280 by 720 block-compressed images stored this way. Observed
Riders Republic
Section titled “Riders Republic”TextureMap header
Section titled “TextureMap header”The complete six-forge header/body census reads 46,338 TextureMaps to their exact body end and refuses 27 of the 46,365 entries. The proven framing below applies to those 46,338 accepted bodies, not to every codec or every mip-chain interpretation. Proven · RR · 46,338 read; 27 refused
Little-endian; excludes the resource identity and class prefix.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 = 1 | managed byte | Proven | |
| 0x1 | 4 | u32 | width | Proven | |
| 0x5 | 4 | u32 | height | Proven | |
| 0x9 | 4 | u32 | depth | Proven | |
| 0xD | 4 | u32 | array size | Proven | |
| 0x11 | 4 | u32 | format code | Proven | |
| 0x15 | 4 | u32 | dimension | Proven | 1 flat; 2 cube; 3 volume |
| 0x19 | 4 | u32 | transfer flag | Observed | 0 linear; 1 requests sRGB treatment for supporting formats |
| 0x1D | 4 | u32 | mip count | Proven | zero is a single-level image in 15 measured maps |
| 0x21 | 14 | bytes | remaining header fields | Unknown | retained; meanings not assigned here |
| 0x2F | 4 | u32 | external mip count r | Proven |
The external list uses nine bytes per mip: zero tag byte and u64 identity. The compiled header follows another nine bytes, beginning at 60+9r. This list uses a different envelope from the ten-byte references inside Materials. Proven · RR · 46,338 read; 27 refused
The 60-byte compiled header starts with 0x13237FE9 (CompiledTextureMap), u32 1, then width, height, depth, array size, mip count, format, dimension and transfer flag. Sixteen more bytes precede its pixel-byte length. The metadata repeats the outer header, and the held pixel span closes the resource body. Proven · RR · 46,338 read; 27 refused
Held levels run largest first from level r to the last mip. Width and height halve per level with a minimum of one. A block-compressed flat level occupies ceil(width/4)*ceil(height/4)*blockBytes; uncompressed levels occupy width*height*pixelBytes. Two maps declare two mips while their pixels hold a complete ten-level chain, so the declared count alone does not always describe the held bytes. Observed · RR · measured map framing and storage census
RRAssetStudio’s PNG export is flipped vertically against the stored texel order. On the TerrainMaterials detail maps, the correlation between a normal map’s green channel and its height map’s row gradient is −0.21 and −0.31 on the exported PNGs and +0.18 and +0.30 decoded in stored order, while red is unchanged. Comparisons that depend on rows (normal green, UV v, atlas rows, terrain rasters) need the two orders reconciled first. Observed · RR · TerrainMaterials detail maps
External mip body
Section titled “External mip body”| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 = 1 | managed byte | Observed | |
| 0x1 | 4 | u32 | image byte length n | Observed | |
| 0x5 | n | bytes | image | Observed | |
| 5+n | 1 | u8 | stored byte | Unknown | 0 in the four original fixtures |
| 6+n | 8 | u64 | parent TextureMap identity | Observed | |
| 14+n | 4 | u32 | mip level | Observed |
The parent and level fields distinguish an image’s external mips from another image’s data. Four original fixtures comprise three level-0 mips and one level-1 mip, each with exact body closure; a sampled BC7 parent names levels 0 and 1 whose sizes match its missing levels. Observed · RR
Cubes, volumes and generated maps
Section titled “Cubes, volumes and generated maps”Each mip contains its layers consecutively. The measured storage uses the header’s depth × array size × six faces for a cube at each held level; these byte counts account exactly for all 25 cube and volume maps in the examined install. This is the measured file layout, independently of a graphics API’s volume-mip convention. Proven · RR · 25 layered maps’ lengths
Seventeen BC6H environment cubemaps are 512×512×6 and belong to WorldAmbiance looks. The complete face orientation is a separate question from the established layer byte counts. Observed · RR
Two debug-font maps end after an external-reference count of zero and a lone null tag 3, without a compiled image. They are image-less stored resources rather than truncated mip chains. Runtime generation is the interpretation given by their debug-font use. Observed · RR · stored form Inferred · RR · generation
See format codes for codecs and the transfer flag’s format-specific limits.
The sampled layered lengths establish storage, not every cube-face orientation or runtime-generated image producer. Unknown · RR