Serious Engine 2 .tex file structure. | Zack Middleton (zturtleman), April 2021
The beginning of the file is the serialized form of a C++ class, which seems to be the same in most (all?) images.
There is compressed pixel data in a zlib compressed stream (begining with 78 9C). For image type 0, 2, and 6 the pixel data is BGR888. For image type 1, 3, 4, and 5 the pixel data is BGRA8888. For image type 7, 8, and 9 the pixel data is DXT1, DXT3, and DXT5 image data respectfully with a full mipmap pryamid and possibly 6 images for a cubemap (see image flags? and image type? below).
"(marker)" "(string)" are non-null terminated plain text. Markers are typically 4 bytes but start and end markers are 8 and 7 bytes. For strings, the string length proceeds it but it's listed here as well.
"(int32)" and "(uint32)" are signed and unsigned little endian 32-bit integers. Though uint32 is just used here for lengths or counts that negative values wouldn't make sense.
"(hex)" is a dump of uint8 data.
Documented from Beam.tex from Serious Sam 2 demo.
(marker) "CTSEMETA"
(uint32) 0x1234ABCD -- little endian file
(int32) 8 -- version maybe?
(uint32) 55 -- exporter name length
(string) "$Version: Serious Sam 2; 2.062.00:57284; 2005-Gold-RC5$" -- exporter name
(marker) "INFO"
(int32) 1
(int32) 0
(int32) 1
(int32) 20
(int32) 2
(marker) "RFIL"
(int32) 0
(marker) "IDNT"
(int32) 1
(int32) 0
(int32) 0
(marker) "EXTY"
(int32) 0
(marker) "INTY"
(int32) 20 -- count of DTTY entries?
(marker) "DTTY"
(int32) 0 -- field index
(int32) 13 -- field type length
(string) "CResourceFile" -- field type
(int32) 3
(int32) 5
(int32) -1
(marker) "STMB"
(uint32) 5 -- number of entries
(int32) 1 -- entry name length
(string) "2" -- entry name
(int32) 1 -- entry value for "2"
(int32) 1 -- entry name length
(string) "1" -- entry name
(int32) 1 -- entry value for "1"
(int32) 1 -- entry name length
(string) "5" -- entry name
(int32) 1 -- entry value for "5"
(int32) 12 -- entry name length
(string) "rf_crsShared" -- entry name
(int32) 3 -- entry value for "rf_crsShared"
(int32) 13 -- entry name length
(string) "rf_crsExposed" -- entry name
(int32) 3 -- entry value for "rf_crsExposed"
(marker) "DTTY"
(int32) 1 -- field index
(int32) 5 -- field type length
(string) "INDEX" -- field type
(int32) 1
(int32) 13
(int32) 2
(marker) "DTTY"
(int32) 2 -- field index
(int32) 5 -- field type length
(string) "SLONG" -- field type
(int32) 1
(int32) 0
(int32) 4
(int32) 4
(marker) "DTTY"
(int32) 3 -- field index
(int32) 28 -- field type length
(string) "CDynamicContainer<CResource>" -- field type
(int32) 0
(int32) 8
(int32) 4
(marker) "DTTY"
(int32) 4 -- field index
(int32) 9 -- field type length
(string) "CResource" -- field type
(int32) 4
(int32) 5
(int32) 8
(marker) "STMB"
(uint32) 4 -- number of entries
(int32) 1 -- entry name length
(string) "1" -- entry name
(int32) 1 -- entry value for "1"
(int32) 1 -- entry name length
(string) "5" -- entry name
(int32) 1 -- entry value for "5"
(int32) 1 -- entry name length
(string) "3" -- entry name
(int32) 10 -- entry value for "3"
(int32) 1 -- entry name length
(string) "2" -- entry name
(int32) 11 -- entry value for "2"
(marker) "DTTY"
(int32) 5 -- field index
(int32) 14 -- field type length
(string) "CStaticTexture" -- field type
(int32) 1
(int32) 5
(int32) 6
(marker) "STMB"
(uint32) 0 -- number of entries
(marker) "DTTY"
(int32) 6 -- field index
(int32) 12 -- field type length
(string) "CBaseTexture" -- field type
(int32) 9
(int32) 5
(int32) 7
(marker) "STMB"
(uint32) 8 -- number of entries
(int32) 1 -- entry name length
(string) "1" -- entry name
(int32) 12 -- entry value for "1"
(int32) 1 -- entry name length
(string) "2" -- entry name
(int32) 12 -- entry value for "2"
(int32) 1 -- entry name length
(string) "4" -- entry name
(int32) 13 -- entry value for "4"
(int32) 1 -- entry name length
(string) "6" -- entry name
(int32) 14 -- entry value for "6"
(int32) 2 -- entry name length
(string) "18" -- entry name
(int32) 15 -- entry value for "18"
(int32) 1 -- entry name length
(string) "9" -- entry name
(int32) 17 -- entry value for "9"
(int32) 2 -- entry name length
(string) "10" -- entry name
(int32) 17 -- entry value for "10"
(int32) 2 -- entry name length
(string) "14" -- entry name
(int32) 18 -- entry value for "14"
(marker) "DTTY"
(int32) 7 -- field index
(int32) 8 -- field type length
(string) "CTexture" -- field type
(int32) 1
(int32) 5
(int32) 4
(marker) "STMB"
(uint32) 0 -- number of entries
(marker) "DTTY"
(int32) 8 -- field index
(int32) 12 -- field type length
(string) "CSmartObject" -- field type
(int32) 1
(int32) 5
(int32) 9
(marker) "STMB"
(uint32) 0 -- number of entries
(marker) "DTTY"
(int32) 9 -- field index
(int32) 7 -- field type length
(string) "CObject" -- field type
(int32) 1
(int32) 5
(int32) -1
(marker) "STMB"
(uint32) 0 -- number of entries
(marker) "DTTY"
(int32) 10 -- field index
(int32) 5 -- field type length
(string) "IDENT" -- field type
(int32) 1
(int32) 0
(int32) 4
(int32) 4
(marker) "DTTY"
(int32) 11 -- field index
(int32) 14 -- field type length
(string) "CResourceFile*" -- field type
(int32) 0
(int32) 2
(int32) 0
(marker) "DTTY"
(int32) 12 -- field index
(int32) 3 -- field type length
(string) "PIX" -- field type
(int32) 1
(int32) 13
(int32) 2
(marker) "DTTY"
(int32) 13 -- field index
(int32) 8 -- field type length
(string) "TexFlags" -- field type
(int32) 0
(int32) 1
(int32) 4
(marker) "DTTY"
(int32) 14 -- field index
(int32) 9 -- field type length
(string) "TexFormat" -- field type
(int32) 0
(int32) 1
(int32) 4
(marker) "DTTY"
(int32) 15 -- field index
(int32) 19 -- field type length
(string) "CStaticArray<UBYTE>" -- field type
(int32) 0
(int32) 6
(int32) 16
(marker) "DTTY"
(int32) 16 -- field index
(int32) 5 -- field type length
(string) "UBYTE" -- field type
(int32) 1
(int32) 0
(int32) 1
(int32) 1
(marker) "DTTY"
(int32) 17 -- field index
(int32) 10 -- field type length
(string) "GfxTexWrap" -- field type
(int32) 0
(int32) 1
(int32) 4
(marker) "DTTY"
(int32) 18 -- field index
(int32) 5 -- field type length
(string) "COLOR" -- field type
(int32) 1
(int32) 13
(int32) 19
(marker) "DTTY"
(int32) 19 -- field index
(int32) 5 -- field type length
(string) "ULONG" -- field type
(int32) 1
(int32) 0
(int32) 4
(int32) 4
(marker) "EXOB"
(int32) 0
(marker) "OBTY"
(int32) 2
(int32) 0
(int32) 0
(int32) 1
(int32) 5
(marker) "EDTY"
(int32) 0
(marker) "OBJS"
(int32) 2
(int32) 0
(int32) 0
(int32) 1
(int32) 2
(int32) -1
(marker) "DCON"
(int32) 1
(int32) 1
(marker) "DCON"
(int32) 0
(int32) 1
(int32) 5
(int32) 1
(int32) -1
(int32) 0
(int32) 0
(int32) 32 -- image width?
(int32) 32 -- image height?
(int32) 33 -- image flags? (33=regular, 35=cubemap)
(int32) 7 -- image type? image type? (0,2,6=BGR888,1,3,4,5=BGRA8888,7=DXT1, 8=DXT3, 9=DXT5)
(marker) "STAR"
(uint32) 76 -- compressed data length
(hex) 789c53609067080502051cf4fffffbb73202c183fff7ff83f8e8342e7da3fa87a6feffffef5f43564f2ff9ffffe39f3303013afffe7f7906562000d18c8cbcbcfb9be56bfe03010002120b39 -- compressed data
Decompressed data length 696
Decompressed data (hex) 20001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f005555555520001f005555555520001f0055555555ffffbfb501010101e0ffdfff55555555e0ffdfff55555555e0ffdfff5555555520001f005555555520001f0055555555ffffdfd601010101e0ffdfff5555555520001f005555555520001f0055555555ffffdfd601010101e0ffdfff5555555520001f005555555520001f0055555555ffffdfd601010101e0ffdfff5555555520001f005555555520001f0055555555ffffdfd601010101e0ffdfff5555555520001f0055555555ffff5fe70303030320001f0055555555ffff5fe703030303dfff1f0005050505dfff1f0001010d0dbf831f7cffffffff
Mip 0: width 32, height 32, image length 512
Mip 1: width 16, height 16, image length 128
Mip 2: width 8, height 8, image length 32
Mip 3: width 4, height 4, image length 8
Mip 4: width 2, height 2, image length 8
Mip 5: width 1, height 1, image length 8
(int32) 80
(int32) 80
(int32) 0
(marker) "EDOB"
(int32) 0
(marker) "METAEND"