ScrapHacks/file_formats/chunked.md

3.3 KiB

General Block format

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 Extension Description
.cm3 Animation file
.sm3 3d model file
.dum Dummy (map object) file
.pth AI Path
.emi Emission maps/Materials?
.amc Collision Data
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, SUEL
Chunk ID Description
ANI Animation data?
AMC Collision Data
CMSH Collision Mesh Data
INI INI-Configuration data
LUZ Lighting information
MAT Material information
QUAD Mesh data?
SCN Scene data?
CAM Camera info?
PORT Light portals?
SUEL Ground plane?
DUM Dummy (map object) data
MAP UV Map?
LFVF FVF Vertex Data
TRI Triangle strip definitions?
NAM,NAE Animation Data?

Format of Specific chunks

INI

Configuration Data

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

struct Vertex { // fields according to flags
    float position[3],
    float rhw,
    float weights[3],
    float normal[3],
    float point_size,
    uint32_t diffuse, //RGBA
    uint32_t specular, //RGBA
    float tex_coords[1 to 4][8] // ??? decided by flags?
}

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

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]
}