Notes/Chunked.md

140 lines
4.0 KiB
Markdown

# Chunked Formats
# General Block format
```cpp
struct Block {
unsigned char block_id[4],
uint32_t size,
unsigned char data[size],
}
template<typename T>
struct Block {
unsigned char block_id[4],
uint32_t size,
T data,
}
```
# Block IDs
File ID | Chunk IDs
------- | ------------------------------------------------------------------------------
AMC | AMC, CMSH, QUAD
CM3 | ANI, CM3, EVA, NAE, NAM, SCN
DUM | DUM, INI
EMI | EMI, LFVF, MAP, MAT, TRI
SM3 | ANI, CAM, INI, LFVF, LUZ, MAP, MAT, MD3D, NAE, NAM, PORT, SCN, SM3, SPR3, SUEL
Read types:
- `i`: 4-byte unsigned integer
- `s`: 4-byte signed integer
- `p`: length prefixed string
- `f`: 4-byte float
- `3f`: array of 3 4-byte floats
- `3i`: array of 3 4-byte unsigned integers
Chunk ID | Description | Reads
-------- | --------------------------- | ------------------------
AMC | Collision Data |
ANI | Animation data? |
CAM | Camera info? |
CMSH | Collision Mesh Data |
DUM | Dummy (map object) data |
INI | INI-Configuration data |
LFVF | FVF Vertex Data |
LUZ | Lighting information |
MAP | UV Map? |
MAT | Material information |
NAE | Animation Data? |
NAM | Animation Data? |
PORT | Map portals? | i==1, i, i, 4, 4
QUAD | Mesh data? |
SCN | Scene data? |
SUEL | Ground plane? | 0x18, 0xc, 4, 4, 4, 0x18
TRI | Triangle strip definitions? |
MD3D | 3D Model definition? |
# Format of Specific chunks
## INI
Configuration Data
```cpp
struct INI {
uint32_t num_sections;
struct {
uint32_t num_lines;
struct {
uint32_t num_chars;
char line[num_chars]
} lines[num_lines];
} sections[num_sections];
};
```
## LFVF
DirectX Flexible Vertex Format Data
```cpp
struct Vertex { // fields according to flags
float position[3]; // D3DFVF_XYZ | D3DFVF_XYZRHW | D3DFVF_XYZB*
float rhw; // D3DFVF_XYZRHW
float weights[3]; // D3DFVF_XYZB*
float normal[3]; // D3DFVF_NORMAL
float point_size; // D3DFVF_PSIZE
uint32_t diffuse; // D3DFVF_DIFFUSE, RGBA
uint32_t specular; //D3DFVF_SPECULAR, RGBA
float tex_coords[D3DFVF_TEXTUREFORMAT][D3DFVF_TEX]; // D3DFVF_TEX* and D3DFVF_TEXTUREFORMAT*
};
struct LFVF {
uint32_t unk;
uint32_t num_entries;
struct {
uint32_t FVF; // FVF vertex data configuration
uint32_t vert_size; //?,
uint32_t num_verts;
Vertex vertices[num_vers];
} entry[num_entries];
};
```
## DUM
Map object data
```cpp
struct DUM {
uint32_t unk_1;
uint32_t num_dummies;
uint32_t unk_2;
struct {
uint32_t name_length;
char name[name_length];
float position[3];
float rotation[3];
uint32_t has_ini;
if (has_ini) {
Block<INI> ini;
};
uint32_t unk_1; // has_next?
} sections[num_sections];
};
```
## MAP
```cpp
struct MAP {
uint32_t version;
uint32_t tex_name_len;
char tex_name[tex_name_len];
// TODO: rest
}
```