Each sprite in the file has 5 sub sprites, the first is the baked map, used if lighting is disabled or the others do not exist, while the other 4 will be used by the lighting engine.
In the following description, 'uint16' refers to an unsigned 16 bit short integer, and 'uint32' to an unsigned 32 bit integer. Files are stored in little-endian format.
A C32 file consists of 3 distinct parts:
- A header, containing information about the file
- Image headers, one for each image,
- Image data
The first 32 bits are the unsigned integer 1, which is used to determine that the engine's Big/Little endian compatibility functions are working correctly before loading.
the next 16 bits are an unsigned short containing the number of sprites in the file.
Next comes a whole bunch of image headers, one for each sprite the file.
- uint16: image width in pixels
- uint16: image height in pixels
- uint32: offset to the first byte of the baked map
- uint32: offset to the first byte of the albedo map
- uint32: offset to the first byte of the normal map
- uint32: offset to the first byte of the microsurface map
- uint32: offset to the first byte of the reflectivity map
The first two image maps are stored normally (RGBA), while the rest have been swizzled (0G0R), used to reduces compression artifacts in the default compressors.
Images are compressed twice, first with an image compression algorithm, then with run length encoding. For a type of compression to be considered valid, the data must remain compressed on the graphics card.
uint8: if the highest bit is 1 then the image data is followed by a mimpmap. The remaining 7 indicate which kind of compression is used:
- 0 uncompressed 32 bit image data
- 1 compressed with dxt1
- 3 compressed with dxt3
- 5 compressed with dxt5
uint32: the total number of bytes in the image, after the run length encoding has been undone.
Next the following two kinds of runs alternate until the image buffer contains the previously indicated number of bytes. uint32: the number of bytes representing transparent image data, this is followed immediately by: uint32: the number of bytes representing non-transparent image data, this tag will be followed by the given number of bytes of image data.