Code
					
				
				
					
						 Issues
						
							35
						
					
				
				
				
					
						 Pull requests
						
							11
						
					
				
				
					
						 Projects
						
							1
						
					
				
				
					
						 Releases
						
							3
						
					
				
				
					
						 Packages
						
							1
						
					
				
				
					
						 Wiki
					
				
				
				
					
						 Activity
					
				
				
				
		
	Var Dump: 
 Mailing List
				
				
			dumpVar: only available in dev mode
						
							Page:
							File Type - Texture
						
						
					
					
							Pages
							
							
								Building the source code
							
								Building your first mod
							
								Bundle Patcher Architecture
							
								CLI Reference
							
								Debugging with Ghidra on Linux
							
								File Type - Bundle Database
							
								File Type - Bundle
							
								File Type - Material
							
								File Type - Package
							
								File Type - Strings
							
								File Type - Texture
							
								File Type - Wwise Bank
							
								File Type - Wwise Event
							
								File Type - Wwise Stream
							
								File Type Status
							
								Home
							
								Installing mods with DTMM
							
								Migrating from loose files
							
								Murmur hashes and dictionaries
							
								Obtaining the Oodle library
							
								Register DTMM as handler for Nexus downloads
							
								Reverse Engineering - Getting Started
							
								Reverse Engineering - Sound
							
								Reverse Engineering - Textures
							
								WIP DDSImage::load
							
								dtmt.cfg Reference
							
						
					No results
				
					2 
					File Type - Texture
					
				
						
						Lucas Schwiderski edited this page 2024-07-22 17:09:55 +02:00 
					
				Case 1:
header {
    unknown_1 == 0,
    size > 0,
    unknown_2 == 1,
    len_data_file_name == 31
}
data is non-zero size. The extra_file points to a .stream in data/.
Case 2:
header {
    unknown_1 == 1,
    size == 30,
    unknown_2 == 1,
    len_data_file_name == 0
}
data is a file path in data/. The file name will be without extension, ends with 0x0 and will be filled up by 0x66s until header.size (usually 5).
uint32 compression_type;
Assert(compression_type == 1 || compression_type == 0);
if (compression_type == 1) {
    uint32 compressed_size;
    uint32 uncompressed_size;
    
    byte data[compressed_size] <format=hex, bgcolor=0x888545>;
    
    // Seems to be skipped by the decompiled binary's code.
    // Doesn't fit to be a length of a later data section. It doesn't match anything, and it's an uneven number.
    uint32 unknown_1 <comment="Always 67 (0x43), so maybe a format/type specifier.">;
    //Assert(unknown_1 == 0x43);
    
    // At this point, the code reads an array of 37 uint32 fields.
    // This will be slowly split into individual named fields as I figure them out.
    
    typedef struct TextureHeader {
        // Checked bits:
        // >> 1: Some extra calculations are done with the next three fields around mipmaps
        //       Also determines if `unknown_2` is saved into `TextureImage`
        //       => Presumable means "has mipmaps" or VT2's "is streamable"
        // >> 2: So far, I haven't found a line of code that actually uses this bit. But there is a line that does `flags & 3`,
        //       indicating that this bit does get used somewhere else.
        // >> 8: TextureFormat.srgb
        uint32 flags <format=binary, comment="Some bitflags.">;
    
        uint32 n_streamable_mips;
        uint32 width;
        uint32 height;
    
        // At some point, the code will move 68 bytes from an offset to the start of this array.
        uint32 unknown_2[(68 + 60) / 4] <bgcolor=0x9b86d3, fgcolor=0xb2dbeb>;
    
    };
    
    TextureHeader texture_header;
    
    uint32 meta_size;
    
    // According to limn, this is something that happens inside `meta_data`.
    // But so far, I haven't found the part in the decompiled binary that handles this data.
    if (meta_size > 0) {
        uint32 num_chunks <comment="Connected to `largest_{width|height}`">;
        Assert((num_chunks * 4) + 8 == meta_size);
    
        uint16 unknown_6 <hidden=true>;
        Assert(unknown_6 == 0);
    
        uint16 num_chunks_2 <hidden=true, comment="Always the same as `num_chunks`">;
        Assert(num_chunks == num_chunks_2);
    
        uint32 chunks[num_chunks];
    }
    
    // A key to look up a value in the engine's internal render quality settings.
    // Specifically, a value that VT2 calls `mip_drop`.
    // TODO: Check how many unique values there are in the game files.
    // Ideally, there would only be a handful that we can simply hard code.
    uint32 category <format=hex, comment="Assumed, since VT2 has the same thing.">;
    
    // Shortcuts to get to compile this:
    // - `flags = 0` -> skips most of the mipmap stuff in the bundle file
    // - `width = 0`, `height = 0` -> also skips some of the mipmap stuff
    // - `n_streamable_mipmaps = 0` -> seems to be an intended value to only rely on DDS mipmaps
    //                                 It does force `srgb` on through setting a special value for `flags`, though. So if that produces issues, I might
    //                                 need to fake it s
} else if (compression_type == 0) {
    uint32 unknown_1;
    uint32 unknown_2;
    Assert(unknown_1 == 0);
    Assert(unknown_2 == 0);
}
compressed_data once uncompressed:
byte unknown_1[8];
uint32 flags;
uint32 unknown_2;
uint32 base_width;
uint32 base_pitch;
byte unknown_3[60];
uint32 four_cc;
Assert(four_cc == 0x44583130) // Or reverse?
byte unknown_4[40];
uint32 dxt10_encoding_kind;
uint32 dxt10_dimension;
Assert(dxt10_dimension == 3);
uint32 dxt10_misc_flags;
uint32 dxt10_array_size;
Assert(dxt10_array_size == 1);
uint32 dxt10_misc_flags_2;
Wiki
Building the source code
Obtaining the Oodle library
DTMM
Installing mods
Register DTMM as handler for Nexus downloads
DTMT
CLI Reference
Building your first mod
Migrating from loose files
dtmt.cfg Reference
Murmur hashes and dictionaries
Reverse Engineering
Getting Started
Sound
Textures
File Types
Status
Bundle
Bundle Database
Texture
Material
Strings
Package
Wwise Event
Wwise Stream
Wwise Bank