Skip to content

Instantly share code, notes, and snippets.

@zturtleman
Last active May 29, 2021 06:48
Show Gist options
  • Select an option

  • Save zturtleman/720d24ff3e36270fa3e47a23531746eb to your computer and use it in GitHub Desktop.

Select an option

Save zturtleman/720d24ff3e36270fa3e47a23531746eb to your computer and use it in GitHub Desktop.
Serious Engine 2 .tex file structure.

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"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment