Skip to main content

.tga File Extension (BIMAGE)

The ".tga" files used in Doom Eternal are not targa images. They are actually "BIM" (or .bimage) files of various formats.

These files are stored in two parts. The file header is embedded in Doom Eternal's .resources files. The body of the file is embedded in Doom Eternal's .streamdb files.

File Signature

Doom Eternal ".tga" files can be identified by the first 3 bytes of the file header, which is always 0x42 0x49 0x4D or "BIM", short for "bimage" or "binary image".

Header Structure

The .tga file header is extracted from Doom Eternal's .resources files. The FILE_HEADER structure is a 63-byte SUBHEADER struct, followed by a variable number of 36-byte MIPMAP structs.

struct FILE_HEADER
{
    SUBHEADER subheader;
    MIPMAP mipmap[];				// Flexible array member, length varies with subheader.MipCount;
};

The SUBHEADER struct is a 63-byte sequence as follows:

struct SUBHEADER 
{		
	char Signature[3];				// "BIM"
    byte Version;					// 0x15
	int TextureType; 				// enum textureType_t
	int TextureMaterialKind;		// enum textureMaterialKind_t
	int PixelWidth;					// image width in pixels
	int PixelHeight;				// image height in pixels
	int Depth;
    int MipCount; 					// determines # of MIPMAP structs to follow
	__int64 MipLevel;				
	float unkFloat1; 				// usually 1.0, purpose unknown
	byte boolIsEnvironmentMap;		// 1 if image is an environment map
	int TextureFormat;				// enum textureFormat_t
	int Always7;					// literally always 7, purpose unknown
	int nullPadding;
	short AtlasPadding;
	byte boolIsStreamed;			// 1 if file is located in streamDB
	byte unkBool;
	byte boolNoMips;				// 1 if image has no mips
	byte boolFFTBloom;				// 1 if using FFT Bloom
	int StreamDBMipCount; 			// usually same number of mips stored in streamdb
};
  • TextureType  is a member of the textureType_t enum - it marks the image as 2-dimensional, 3-dimension, or cubic.
  • TextureMaterialKind is a member of the textureMaterialKind_t enum - it tells the engine what type of material this texture is (albedo, normal, specular, etc).
  • TextureFormat is a member of the textureFormat_t enum - it tells the engine how the image is encoded (image format, block compression type, etc).

Mipmap Struct

The MIPMAP struct is a 36-byte sequence described as follows. The MIPMAP struct is repeated n times, where n  is equal to SUBHEADER.MipCount above.

struct MIPMAP
{
	__int64 MipLevel;				// Starts at 0, increment by 1 each time it repeats
	int MipPixelWidth;				// Original PixelWidth reduced by 50% for each MipLevel
	int MipPixelHeight;				// Original PixelHeight reduced by 50% for each MipLevel
	int UnknownFlagA;
	int DecompressedSize;			// Decompressed size in bytes
	int FlagIsCompressed;			// 1 if the texture is compressed
	int CompressedSize;				// Compressed size in bytes
	int CumulativeSizeStreamDB;		
};
  • CumulativeSizeStreamDB is always zero for the first mipmap. For additional mipmaps, it is the sum of previous mipmaps compressed sizes.

010 Editor Template

A 010 Editor template for use with Doom Eternal's TGA file headers can be found here: https://github.com/brongo/eternal-010-templates/blob/main/templates/DoomEternalTGA.bt