Skip to content
widberg edited this page Oct 12, 2023 · 115 revisions

Chum World MESH
ImZouna Mesh_Z

This has an associated Data Class.

Mesh_Z_Header

struct Mesh_Z_Header {
    Object_Z objectHeader;
    PascalArray<crc32_t> crc32s;
        // all the material crc32s followed by the mesh data crc32
    float closeX;
        // how close the camera is allowed to get to the mesh on the X axis before it pops out
        // if closeX or closeY are 0 then the mesh will never pop out
    float closeY;
        // Unused
        // Usually 1.5
        // no effect
        // the closeY value is never used, instead the allowable closeY is calculated from closeX and closeZ
        // how close the camera is allowed to get to the mesh on the Y axis before it pops out
    float closeZ;
        // how close the camera is allowed to get to the mesh on the Z axis before it pops out
        // if closeX or closeZ is 0 then the mesh will never pop out
    PascalArray<struct DynPoint {
        Sphere_Z point;
            // point.radius unused?
        std::uint32_t flags;
            // 0x10000000 - 
            // 0x08000000 - 
            // 0x04000000 - 
            // 0x01000000 - 
            // 0x00010000 - 
            // 0x00000007 - 
        std::uint32_t nameCRC32;
            // Observed values:
            //   * LOCAL_LOOKAT - 3243480878
            //   * LOCAL_ATTACH - 3355622209
            //   * LOCAL_LIMIT - 3448189790
            //   * DYN_POINT1 - 1178470142
            //   * DYN_POINT2 - 1266491431
            //   * DYN_POINT3 - 1337736592
            //   * DYN_POINT4 - 1375432085
            //   * DYN_POINT5 - 1429893154
            //   * DYN_POINT6 - 1484347131
            //   * DYN_POINT7 - 1555581772
            //   * DYN_POINT8 - 4092384112
            //   * DYN_POINT9 - 1614211910
            //   * DYN_POINT10 - 1631719061
            //   * DYN_POINT11 - 1703088930
            //   * DYN_POINT12 - 1757427195
            //   * DYN_POINT13 - 1812015180
            //   * DYN_POINT14 - 1917220937
            //   * DYN_POINT15 - 1988584958
            //   * DYN_POINT16 - 2076459815
    }> dynPoints;
        // May be referenced in UserDefines
        // LOCAL_LOOKAT is required on vehicle chassis
    PascalArray<struct DynBox {
        Mat4 mat;
        std::uint32_t flags;
            // 0x10000000 - 
            // 0x08000000 - 
            // 0x04000000 - 
            // 0x01000000 - 
            // 0x00010000 - 
            // 0x00000007 - 
        crc32_t nameCRC32;
            // Observed values:
            //   * SFX_FIRE1 - 4217370453
            //   * SFX_EXHAUST1 - 342724588
            //   * SFX_EXHAUST2 - 422488373
            //   * SFX_EXHAUST3 - 502248578
            //   * SFX_EXHAUST4 - 61400199
            //   * SFX_EXHAUST5 - 124385584
            //   * SFX_EXHAUST6 - 170581993
            //   * SFX_EXHAUST7 - 250331742
            //   * SFX_EXHAUST8 - 916750307
            //   * SFX_EXHAUST9 - 845505108
            //   * SFX_EXHAUST10 - 612613378
            //   * SFX_EXHAUST11 - 541237429
            //   * SFX_EXHAUST12 - 755074668
            //   * SFX_EXHAUST13 - 700488667
            //   * SFX_EXHAUST14 - 931646430
            //   * SFX_EXHAUST15 - 860280425
            //   * SFX_EXHAUST16 - 1040576688
            //   * DURL - 2234468230
            //   * DYN_DAMAGE - 917337438
            //   * DYN_XFILTER - 3491467995
            //   * DYN_YFILTER - 1699973321
            //   * DYN_ZFILTER - 354920422
            //   * DYN_TENSION - 1676256635
            //   * DYN_VCOL - 1062800321
            //   * DYN_WINDPOW - 795155901
            //   * DYN_EXTPOW - 318847781
            //   * DYN_MVRATIO - 3678433905
            //   * DYN_VISCOSITY - 3134916619
            //   * DYN_STATICROTATION - 1081475432
            //   * DYN_R - 320233663
            //   * DYN_L - 1669929925
            //   * DYN_BR - 2360085526
            //   * DYN_FR - 2821249261
            //   * DYN_BL - 4231231340
            //   * DYN_FL - 3635913623
    }> dynBoxes;
        // read only when spawning model into the world
// The following fields only appear in the CHALGE versions
    std::uint32_t zero0;
    std::uint32_t zero1;
    std::uint32_t zero2;
    std::uint32_t zero3;
};
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------

struct MeshZHeader {
    struct Object_Z
    {
        uint32 friendlyNameCRC32;
        uint32 dataCRC32;
        float rot[4];
        float transform[16];
        float unknown2;
        float unknown0;
        uint16 unknown1;
    } object;
    uint32 crc32Count0;
    uint32 crc32s0[crc32Count0];
    uint32 unknown0;
    float unknown1;
    uint32 unknown2;
    uint32 unknown3Count;
    struct Unknown3
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
    } unknown3s[unknown3Count];
    uint32 unknown4Count;
    struct Unknown4
    {
        float unknown0s[16];
        uint32 unknown1;
        uint32 unknown2;
    } unknown4s[unknown4Count];
} meshheader;
MeshZHeaderAlt

//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------

struct MeshZHeaderAlt {
    struct Object_Z
    {
        uint32 friendlyNameCRC32;
        uint32 crc32Count;
        uint32 crc32s[crc32Count];
        uint32 dataCRC32;
        float rot[4];
        float transform[16];
        float unknown2;
        float unknown0;
        uint16 unknown1;
    } object;
    float unknown0s[3];
    uint32 unknown1s[4];
    uint32 unknown10Count;
    struct Unknown10
    {
        uint32 unknown0;
        float unknown2s[3];
        uint32 unknown3s[2];
    } unknown10s[unknown10Count] <optimize=false>;
    uint32 unknown3s[2];
    uint32 unknown4Count;
    byte unknown4s[unknown4Count * 6];
    uint32 unknown5Count;
    uint32 unknown5s[unknown5Count * 8];
    uint32 unknown6Count;
    uint32 unknown6s[unknown6Count];
    uint32 unknown7Count;
    uint16 unknown7s[unknown7Count];
    uint32 unknown8Count;
    struct Unknown8
    {
        uint32 nameSize;
        byte name[nameSize];
        uint32 unknown0;
        uint16 unknown0flag;
        uint32 unknown0Count;
        uint16 unknown0s[unknown0Count];
        uint32 unknown1Count;
        float unknown1s[unknown1Count * 4];
    } unknown8s[unknown8Count] <optimize=false>;
} meshheader;

Mesh_Z

struct Mesh_Z : Points_Z {
    PascalArray<Vec3f> stripVertices;
        // always empty
    PascalArray<struct Unused0 {
        std::uint32_t unknown0;
        std::uint32_t unknown1;
        std::uint32_t unknown2;
        std::uint32_t unknown3;
    }> unused0s;
        // always empty
    PascalArray<Vec2f> texcoords;
        // always empty
    PascalArray<Vec3f> normals;
        // always empty
    PascalArray<struct Strip {
        PascalArray<std::uint16_t> stripVerticesIndices;
        std::uint32_t materialCRC32;
        std::uint32_t triOrder;
            // 1/2
    }> strips;
        // always empty
    // if (objectHeader.unknown0 & 2 != 0)
    // {
    //     PascalArray<std::uint32_t> unknown3s;
    // }
        // This condition is never true
    PascalArray<struct Unused4 {
        PascalArray<struct Unused0 {
            std::uint32_t unused0;
            std::uint32_t unused1;
        }> unused0s;
    }> unused4s;
        // always empty
    PascalArray<crc32_t> materialCRC32s;
    PascalArray<struct AABBCol {
        Vec3f min;
        std::uint16_t cylindreColsIndexBegin;
        std::uint16_t cylindreColsIndexEnd;
            // range of AABBs contained directly by this one
        Vec3f max;
        std::uint16_t unknown7sIndex;
        std::uint16_t unknown7sIndicesCount;
            // 0 if this AABB only contains other AABB and no faces
            // range of CollisionFaces contained directly by this AABB
    }> cylindreCols;
    PascalArray<struct CollisionFace {
        std::uint16_t unknown12Index0;
        std::uint16_t unknown12Index1;
        std::uint16_t unknown12Index2;
            // Indices that make up the tri face
        std::uint16_t option;
            // 0/1
            // not winding order
            // double sided?
    }> unknown7s;
    PascalArray<struct Unused8 {
        std::uint32_t unused0;
        std::uint32_t unused1;
        std::uint32_t unused2;
        std::uint32_t unused3;
        std::uint32_t unused4;
        std::uint32_t unused5;
        std::uint32_t unused6;
        std::uint32_t unused7;
    }> unused8s;
        // always empty
    struct MeshBuffers {
        PascalArray<struct VertexBufferExt {
            std::uint32_t vertexCount;
            std::uint32_t vertexSize;
            std::uint32_t subMeshID;
            std::uint8_t data[vertexCount * vertexSize];
        }> subMeshes;
            // If one of the buffers is required by the morpher and it is removed then the game will crash while loading
        PascalArray<struct IndexBufferExt {
            std::uint32_t indexCount;
            std::uint32_t subMeshID;
            std::uint16_t data[indexCount];
        }> indices;
        PascalArray<struct WeirdQuad {
            Vec3f vertex0;
            Vec3f vertex1;
            Vec3f vertex2;
            Vec3f vertex3;
                // Vertices that make up the quad face
                // duplicated in unknown12s for some reason
            Vec3f facing;
        }> unknown11s;
            // Occlusion test quad?
        PascalArray<struct VertexGroup {
            std::uint32_t vertexBufferIndex;
            std::uint32_t indexBufferIndex;
            std::uint32_t zero;
            std::uint32_t zero1;
            std::uint32_t flags;
                // 0x00000004 - visible
                // 0x00080000 - has morph
            std::uint16_t vertexBufferIndexBegin;
            std::uint16_t vertexBufferIndexEnd;
            std::uint32_t vertexCount;
            std::uint32_t indexBufferIndexBegin;
            std::uint32_t faceCount;
            std::uint32_t zero2;
            std::uint32_t zero3;
            std::uint16_t vertexSize;
            std::uint16_t materialIndex;
            PascalArray<struct Unused1 {
                std::uint32_t unused0;
                std::uint32_t unused1;
                std::uint32_t unused2;
                std::uint32_t unused3;
                std::uint32_t unused4;
                std::uint32_t unused5;
                std::uint32_t unused6;
            }> unused1s;
        }> vertexGroups;
            // composes vertex and index buffer
            // when removed the mesh disapears but the game still runs as expected
            // in wireframe debug view the mesh is not there but that could be a result of no material
            // does NOT contain collision data
        struct Morpher {
            PascalArray<struct AABBMorphTrigger {
                Vec3f min;
                std::uint16_t unknown16IndexBegin;
                std::uint16_t unknown16IndexEnd;
                    // range of AABBMorphTriggers contained directly by this one
                Vec3f max;
                std::uint16_t pairIndex;
                std::uint16_t pairsIndicesCount;
                    // 0 if this AABBMorphTrigger only contains other AABBMorphTriggers and no pairs
                    // range of pairs contained by this AABBMorphTrigger
            }> unknown16s;
                // removing this has no effect
                // relatively small
            Map<std::uint16_t, std::uint16_t> map;
                // Mapping from unknown12sIndex to unknown15sIndicesIndex
                // removing this causes the game to crash when a collision with a static body occurs while MorphTargetDesc exists
                // one element smaller than unknown12s
            PascalArray<std::uint16_t> unknown15sIndices;
                // smaller than unknown15s but much larger than any vertex buffer or pairs
            PascalArray<struct MorphTargetDesc {
                PascalString name;
                std::uint32_t baseVertexBufferId;
                    // The vertexBufferId of the vertex buffer containing the visible mesh vertices
                std::uint16_t displacementVertexBufferIndex;
                    // The index of the vertex buffer containing the displacement vectors
                    // Must be the same size as the base vertex buffer
                    // Editing this buffer doesnt seem to do anything
                PascalArray<std::uint16_t> unknown15Indicies;
                    // Must be the same size as the base vertex buffer
                    // maps vertices in the base vertex buffer to displacement vectors
                PascalArray<struct DisplacementVector {
                        std::int16_t x;
                            // multiply by 0.0009765625 = 0.5^10
                        std::int16_t y;
                            // multiply by 0.0009765625 = 0.5^10
                        std::int16_t z;
                            // multiply by 0.0009765625 = 0.5^10
                        std::uint16_t unknown15SelfIndex;
                            // current struct's Unknown15 index
                }> unknown15s;
                    // much larger than any of the vertex buffers
                    // zeroing this array will make it so the deformation never happens
                    // This array contains displacements
            }> morphs;
                // always 0 or 1 but a loop is used to load it so it is a PascalArray and not an Option
                // the game will run as normal when removed
                // some pieces, as defined in VertexGroup, will be missing
        } morpher;
    } meshBuffers;
    PascalArray<struct ShortVecWeird {
        std::int16_t x;
        std::int16_t y;
        std::int16_t z;
    }> unknown12s;
        // 0x007b3800
        // multiply every element by 0.0009765625 = 0.5^10
        // related to the Col structs
        // game crashes on collision with static body if empty while MorphTargetDesc exists
        // no effect if same size but 0ed out data
        // all overlap with various vertices in the last vertex buffer
};
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------

struct Mesh_Z
{
    uint32 vecCount;
    float vecs[vecCount * 3];
    uint32 unknown0Count;
    struct Unknown0
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
    } unknown0s[unknown0Count];
    uint32 unknown1Count;
    struct Unknown1
    {
        uint32 unknown0;
        uint32 unknown1;
    } unknown1s[unknown1Count];
    uint32 vertexCount;
    float vertices1[vertexCount * 3];
    uint32 unknown2Count;
    struct Unknown2
    {
        uint32 unknown0Count;
        uint16 unknown0s[unknown0Count];
        uint32 unknown1;
        uint32 unknown2;
    } unknown2s[unknown2Count] <optimize=false>;
    uint32 unknown4Count;
    struct Unknown4
    {
        uint32 unknown0Count;
        struct Unknown4Unknown0
        {
            uint32 unknown0;
            uint32 unknown1;
        } unknown0s[unknown0Count];
    } unknown4s[unknown4Count] <optimize=false>;
    uint32 materialCRC32Count;
    uint32 materialCRC32s[materialCRC32Count];
    uint32 unknown6Count;
    struct Unknown6
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
        uint32 unknown6;
        uint32 unknown7;
    } unknown6s[unknown6Count];
    uint32 unknown7Count;
    struct Unknown7
    {
        uint16 unknown0;
        uint16 unknown1;
        uint16 unknown2;
        uint16 unknown3;
    } unknown7s[unknown7Count];
    uint32 unknown8Count;
    struct Unknown8
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
        uint32 unknown6;
        uint32 unknown7;
    } unknown8s[unknown8Count];
    uint32 subMeshCount;
    struct SubMesh
    {
        uint32 vertexCount;
        uint32 vertexSize;
        uint32 vertexGroupCRC32;
        struct
        {
            float pos[3];
            ubyte normx<read=byteToFloat,optimize=false>;
            ubyte normy<read=byteToFloat,optimize=false>;
            ubyte normz<read=byteToFloat,optimize=false>;
            ubyte normp;
            ubyte tanx<read=byteToFloat,optimize=false>;
            ubyte tany<read=byteToFloat,optimize=false>;
            ubyte tanz<read=byteToFloat,optimize=false>;
            ubyte tanp;
            float uvs[2];
            ubyte x[vertexSize - 12 - 4 - 4 - 8];
        } data[vertexCount];
    } subMeshes[subMeshCount] <optimize=false>;
    uint32 indicesCount;
    struct Indices
    {
        uint32 indexCount;
        uint32 vertexGroupCRC32;
        uint16 data[indexCount];
    } indices[indicesCount] <optimize=false>;
    uint32 unknown11Count;
    struct Unknown11
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
        uint32 unknown6;
        uint32 unknown7;
        uint32 unknown8;
        uint32 unknown9;
        uint32 unknown10;
        uint32 unknown11;
        uint32 unknown12;
        uint32 unknown13;
        uint32 unknown14;
    } unknown11s[unknown11Count];
    uint32 unknown13Count;
    struct Unknown13
    {
        uint32 vertexBufferIndex;
        uint32 indexBufferIndex;
        uint32 zero;
        uint32 zero1;
        uint32 flags;
        uint16 vertexBufferIndexBegin;
        uint16 vertexBufferIndexEnd;
        uint32 vertexCount;
        uint32 indexBufferIndexBegin;
        uint32 faceCount;
        uint32 zero2;
        uint32 zero3;
        uint16 vertexSize;
        uint16 materialIndex;
        uint32 unknown1Count;
        struct Unknown13Unknown1
        {
            uint32 unknown0;
            uint32 unknown1;
            uint32 unknown2;
            uint32 unknown3;
            uint32 unknown4;
            uint32 unknown5;
            uint32 unknown6;
        } unknown1s[unknown1Count];
    } unknown13s[unknown13Count] <optimize=false>;
    uint32 unknown16Count;
    struct Unknown16
    {
        float unknown0;
        float unknown1;
        float unknown2;
        uint16 unknown30;
        uint16 unknown31;
        float unknown4;
        float unknown5;
        float unknown6;
        uint16 unknown70;
        uint16 unknown71;
    } unknown16s[unknown16Count];
    uint32 pairCount;
    struct Pair
    {
        uint16 first;
        uint16 second;
    } pairs[pairCount];
    uint32 unknown18Count;
    uint16 unknown18s[unknown18Count];
    uint32 unknown14Count;
    struct Unknown14
    {
        uint32 nameSize;
        byte name[nameSize];
        uint32 unknown1;
        uint16 unknown2;
        uint32 unknown4Count;
        uint16 unknown4s[unknown4Count];
        uint32 unknown15Count;
        struct Unknown14Unknown15
        {
                int16 unknown0;
                int16 unknown1;
                int16 unknown2;
                int16 unknown3;
        } unknown15s[unknown15Count];
    } unknown14s[unknown14Count] <optimize=false>;
    uint32 unknown12Count;
    struct Unknown12
    {
        uint16 u0;
        uint16 u1;
        uint16 u2;
    } unknown12s[unknown12Count];
} mesh;

string byteToFloat(ubyte& value )
{
    local string str = "";
    local float normalByteToD3DColorComponent = ((value/255.0));
    local float normalByteToFloat = ((normalByteToD3DColorComponent * 2) - 1);
    SPrintf(str, "%f",normalByteToFloat);

    return str;
}
Mesh_Z_Alt

struct Mesh_Z_Alt : Points_Z
{
    PascalArray<Vec3f> vecs;
    std::uint32_t unknown0Count;
    struct Unknown0
    {
        std::uint32_t unknown0;
        std::uint32_t unknown1;
        std::uint32_t unknown2;
        std::uint32_t unknown3;
    } unknown0s[unknown0Count];
    std::uint32_t unknown1Count;
    struct Unknown1
    {
        std::uint32_t unknown0;
        std::uint32_t unknown1;
    } unknown1s[unknown1Count];
    PascalArray<Vec3f> vertices1;
    std::uint32_t unknown2Count;
    struct Unknown2
    {
        PascalArray<std::uint16_t> unknown0s;
        std::uint32_t unknown1;
        std::uint32_t unknown2;
    } unknown2s[unknown2Count];
    // if (objectHeader.unknown1 & 2 != 0)
    // {
    //     PascalArray<std::uint32_t> unknown3s;
    // }
        // This condition is never true
    std::uint32_t unknown4Count;
    struct Unknown4
    {
        std::uint32_t unknown0Count;
        struct Unknown0
        {
            std::uint32_t unknown0;
            std::uint32_t unknown1;
        } unknown0s[unknown0Count];
    } unknown4s[unknown4Count];
    PascalArray<crc32_t> materialCRC32s;
    std::uint32_t unknown6Count;
    struct Unknown6
    {
        std::uint32_t unknown0;
        std::uint32_t unknown1;
        std::uint32_t unknown2;
        std::uint32_t unknown3;
        std::uint32_t unknown4;
        std::uint32_t unknown5;
        std::uint32_t unknown6;
        std::uint32_t unknown7;
    } unknown6s[unknown6Count];
    std::uint32_t unknown7Count;
    struct Unknown7
    {
        std::uint16_t unknown0;
        std::uint16_t unknown1;
        std::uint16_t unknown2;
        std::uint16_t unknown3;
    } unknown7s[unknown7Count];
    std::uint32_t unknown8Count;
    struct Unknown8
    {
        std::uint32_t unknown0;
        std::uint32_t unknown1;
        std::uint32_t unknown2;
        std::uint32_t unknown3;
        std::uint32_t unknown4;
        std::uint32_t unknown5;
        std::uint32_t unknown6;
        std::uint32_t unknown7;
    } unknown8s[unknown8Count];
    std::uint32_t subMeshCount;
    struct SubMesh
    {
        std::uint32_t vertexCount;
        std::uint32_t vertexSize;
        std::uint32_t vertexGroupCRC32;
        std::uint8_t data[vertexCount * vertexSize];
    } subMeshes[subMeshCount];
    std::uint32_t indicesCount;
    struct Indices
    {
        std::uint32_t indexCount;
        std::uint32_t vertexGroupCRC32;
        std::uint16_t data[indexCount];
    } indices[indicesCount];
    std::uint32_t unknown11Count;
    struct Unknown11
    {
        std::uint32_t unknown0;
        std::uint32_t unknown1;
        std::uint32_t unknown2;
        std::uint32_t unknown3;
        std::uint32_t unknown4;
        std::uint32_t unknown5;
        std::uint32_t unknown6;
        std::uint32_t unknown7;
        std::uint32_t unknown8;
        std::uint32_t unknown9;
        std::uint32_t unknown10;
        std::uint32_t unknown11;
        std::uint32_t unknown12;
        std::uint32_t unknown13;
        std::uint32_t unknown14;
    } unknown11s[unknown11Count];
    std::uint32_t unknown13Count;
    struct Unknown13
    {
        std::uint32_t unknown0s[12];
        std::uint32_t unknown1Count;
        struct Unknown1
        {
            std::uint32_t unknown0;
            std::uint32_t unknown1;
            std::uint32_t unknown2;
            std::uint32_t unknown3;
            std::uint32_t unknown4;
            std::uint32_t unknown5;
            std::uint32_t unknown6;
        } unknown1s[unknown1Count];
    } unknown13s[unknown13Count];
    std::uint32_t unknown12Count;
    struct Unknown12
    {
        std::uint16_t u0;
        std::uint32_t u1;
    } unknown12s[unknown12Count];
};
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------

struct Mesh_Z_Alt
{
    uint32 vecCount;
    float vecs[vecCount * 3];
    uint32 unknown0Count;
    struct Unknown0
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
    } unknown0s[unknown0Count];
    uint32 unknown1Count;
    struct Unknown1
    {
        uint32 unknown0;
        uint32 unknown1;
    } unknown1s[unknown1Count];
    uint32 vertexCount;
    float vertices1[vertexCount * 3];
    uint32 unknown2Count;
    struct Unknown2
    {
        uint32 unknown0Count;
        uint16 unknown0s[unknown0Count];
        uint32 unknown1;
        uint32 unknown2;
    } unknown2s[unknown2Count] <optimize=false>;
    // if (someHeaderValue)
    // {
    //     PascalArray<uint32> unknown3s;
    // }
    uint32 unknown4Count;
    struct Unknown4
    {
        uint32 unknown0Count;
        struct Unknown4Unknown0
        {
            uint32 unknown0;
            uint32 unknown1;
        } unknown0s[unknown0Count];
    } unknown4s[unknown4Count] <optimize=false>;
    uint32 materialCRC32Count;
    uint32 materialCRC32s[materialCRC32Count];
    uint32 unknown6Count;
    struct Unknown6
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
        uint32 unknown6;
        uint32 unknown7;
    } unknown6s[unknown6Count];
    uint32 unknown7Count;
    struct Unknown7
    {
        uint16 unknown0;
        uint16 unknown1;
        uint16 unknown2;
        uint16 unknown3;
    } unknown7s[unknown7Count];
    uint32 unknown8Count;
    struct Unknown8
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
        uint32 unknown6;
        uint32 unknown7;
    } unknown8s[unknown8Count];
    uint32 subMeshCount;
    struct SubMesh
    {
        uint32 vertexCount;
        uint32 vertexSize;
        uint32 vertexGroupCRC32;
        byte data[vertexCount * vertexSize];
    } subMeshes[subMeshCount] <optimize=false>;
    uint32 indicesCount;
    struct Indices
    {
        uint32 indexCount;
        uint32 vertexGroupCRC32;
        uint16 data[indexCount];
    } indices[indicesCount] <optimize=false>;
    uint32 unknown11Count;
    struct Unknown11
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknown4;
        uint32 unknown5;
        uint32 unknown6;
        uint32 unknown7;
        uint32 unknown8;
        uint32 unknown9;
        uint32 unknown10;
        uint32 unknown11;
        uint32 unknown12;
        uint32 unknown13;
        uint32 unknown14;
    } unknown11s[unknown11Count];
    uint32 unknown13Count;
    struct Unknown13
    {
        uint32 unknown0s[12];
        uint32 unknown1Count;
        struct Unknown13Unknown1
        {
            uint32 unknown0;
            uint32 unknown1;
            uint32 unknown2;
            uint32 unknown3;
            uint32 unknown4;
            uint32 unknown5;
            uint32 unknown6;
        } unknown1s[unknown1Count];
    } unknown13s[unknown13Count] <optimize=false>;
    uint32 unknown12Count;
    struct Unknown12
    {
        uint16 u0;
        uint32 u1;
    } unknown12s[unknown12Count];
} mesh;

Vertex Formats

The vertex format is the lower vertexSize bytes from the folowing structure.

struct Vertex {
    Vec3f position;
    std::uint8_t normal[3];
        // Each byte is transformed to float via
        // (normal[i] / 255.0) * 2.0 - 1.0
    std::uint8_t normalPadding;
        // Always? 255
    std::uint8_t tangent[3];
        // Each byte is transformed to float via
        // (normal[i] / 255.0) * 2.0 - 1.0
        // Always orthogonal to normal i.e. normal dot tangent == 0 aprox
    std::uint8_t tangentPadding;
        // Always? 255
    Vec2f uvs[2];
    // ...
};

Home
FAQ

For FMTK Users and Mod Developers

Read the Docs

For FMTK Developers

Asobo BigFile Format Specification
Asobo Classes
      Animation_Z
      Binary_Z
      Bitmap_Z
      Camera_Z
      CollisionVol_Z
      Fonts_Z
      GameObj_Z
      GenWorld_Z
      GwRoad_Z
      Keyframer*_Z
      Light_Z
      LightData_Z
      Lod_Z
      LodData_Z
      Material_Z
      MaterialAnim_Z
      MaterialObj_Z
      Mesh_Z
      MeshData_Z
      Node_Z
      Omni_Z
      Particles_Z
      ParticlesData_Z
      RotShape_Z
      RotShapeData_Z
      Rtc_Z
      Skel_Z
      Skin_Z
      Sound_Z
      Spline_Z
      SplineGraph_Z
      Surface_Z
      SurfaceDatas_Z
      UserDefine_Z
      Warp_Z
      World_Z
      WorldRef_Z
Asobo File Format Idioms
Asobo CRC32
Asobo LZ Compression
Asobo Arithmetic Coding Compression
Asobo Save Game File Format Specification
Asobo Audio Formats
TotemTech/ToonTech/Zouna/ACE/BSSTech/Opal Timeline
Zouna Modding Resources
Miscellaneous

Clone this wiki locally