# VEC3 format specification 3D models binary format. Byteorder: little-endian ## Syntax ```cpp enum AttributeType:uint8 { POSITION = 0, UV, NORMAL, COLOR, }; sizeof(AttributeType) == 1; struct VertexAttribute { AttributeType type; // data type is infered from attribute type uint8 flags; uint32 size; float data[]; // if compressed, first 4 bytes of compressed data is decompressed size }; sizeof(VertexAttribute) == 6; // + dynamic data array struct Mesh { uint32 triangle_count; // number of mesh triangles uint16 material_id; uint16 flags; uint16 attribute_count; VertexAttribute attributes[]; uint8 indices[]; // if compressed, first 4 bytes of compressed data is compressed buffer size }; sizeof(Mesh) == 10; // + dynamic attributes array + dynamic indices array struct Model { uint16 name_len; vec3 origin; uint32 mesh_count; Mesh meshes[]; char name[]; }; sizeof(Model) == 18; // + dynamic Mesh array + name length struct Material { uint16 flags; uint16 name_len; char name[]; }; sizeof(Material) == 4; // + dynamic sized string struct Header { char[8] ident; // "\0\0VEC3\0\0" uint16 version; // current is 1 uint16 reserved; // 0x0000 }; sizeof(Header) == 12; struct Body { uint16 material_count uint16 model_count Material materials[]; Model models[]; }; sizeof(Body) == 4; // + dynamic models array + dynamic materials array ``` \* vertex data: positions are global. Model origins used to make it local. vertex - is a set of vertex data section entries indices divided by stride, starting from 0 (section first entry). Example: in file having sections (coordinates, texture_coordinates, normal) vertex is a set of 3 indices ordered the same way as sections stored in the file. ## Vertex Data section tags All sections are optional. | Value | Name | Stride (bytes) | Description | | ----- | ------------------- | -------------- | --------------------------- | | %x01 | Coordinates | 12 | vertex position | | %x02 | Texture coordinates | 8 | vertex texture coordinates | | %x03 | Normals | 12 | vertex normal vector | | %x04 | Color | 16 | vertex RGBA color (0.0-1.0) | VertexAttribute flags: | Value | Name | | ----- | ---------------- | | %x01 | ZLib compression | ## Mesh Mesh flags: | Value | Name | | ----- | ----------------------------------- | | %x01 | Indices ZLib compression | | %x02 | Use 16 bit indices instead of 8 bit | ## Material Material flags: | Bit offset | Description | |------------|-------------| | 0 | Shadeless | | 1-7 | Reserved |