This format is based on the md2 format but with a few enhanced features. It can be written to using a python export script for the Blender 3D modeling package. Technical specification ----------------------- "JOE" is a binary file format in which multi-byte values are expressed with the little-endian byte order. This section details version 3 of the file format. ### Data Type Map The following table explicitly defines the various data types used in a JOE file. | Identifier | Detailed Description | |------------|--------------------------------------------------------------------------------------------------------------| | int | 32-bit signed integer | | short | 16-bit signed integer | | short3 | Three consecutive shorts forming an array | | float | 32-bit floating-point value. Unsure of the exact format... probably whatever is implemented by x86 machines. | | float3 | Three consecutive floats forming an array. | ### File Header This block of information initiates every file. | data type | block offset | name | description | |-----------|--------------|-------------|-------------------------------------------------------------------------------------------------------------------------------------------| | int | 0 | magic | **844121161**(0x32504449): number used to identify the file as a JOE file. Currently unchecked by vdrift. | | int | 4 | version | report the file version that this file conforms to. This specification details version 3 of the format. | | int | 8 | num\_faces | every frame is expected to contain the same number of faces (polygons) this value specifies how many. This is currently limited to 32000. | | int | 12 | num\_frames | Presumably, this details the number of frames used in an animation. Currently constrained to "1" | ### Frame Format details a single configuration of a model. "File Header.num\_frames" frames follow the file header. before each frame header, you will find "File Header.num\_faces" Face blocks. | data type | block offset | name | description | |-----------|--------------|-----------------|-------------------------------------------------------| | int | 0 | num\_verts | the number of vertices used in this frame | | int | 4 | num\_textcoords | the number of texture coordinates used in this frame. | | int | 8 | num\_normals | the number of vertex normals used in this frame. | after each frame header, you will find - num\_verts Vertex blocks - num\_normals Vertex blocks - num\_textcoords Texture Coordinate blocks ### Face Format Each frame as "File Header.num\_faces" face records immediately following the Frame header (decribed above). A face is basically several lists of indices in to vertex, normal, and text coord arrays described in following sections. For this version, a face is always a triangle ( i.e. a three-vertex polygon ). | data type | block offset | name | description | |-----------|--------------|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | short3 | 0 | vertexIndex | Indeces in to the vertex array. These two constructs together define the location of each corner of the face in 3d space. | | short3 | 6 | normalIndex | Indeces in to the normals array. These two constructs help define how light sources interact with the face at each corner. Normals also help define which side of a face is "front". | | short3 | 12 | textureIndex | Indeces in to the texture coordinate array. These two constructs together help define which portions of a texture image map to each corner of the face. Note that in the future there may be a multiple of 3 entries in this array to accomidate applying many textures to a single face. Which images are used as textures by a particular model are defined by convention and explained in [Car files and formats](Car_files_and_formats.md) and [Track files and formats](Track_files_and_formats.md) | ### Vertex Format A vertex block simply contains a three-element float array. Vertex blocks may have a misleading name because they are used for both vertices and normals. | data type | block offset | name | description | |-----------|--------------|--------|-----------------------------------------------------------------------------------------------------------------| | float3 | 0 | vertex | A three-element float array defining the X, Y, and Z components of a vertex at offsets 0, 4, and 8 respectively | ### Texture Coordinate Format A texture coordinate is a 2-dimensional coordinate used to map prtions of a texture to a model vertex. | data type | block offset | name | description | |-----------|--------------|------|--------------------------------------------------------------------------------| | float | 0 | u | a value between 0 and 1 indicating a position along the width of the texture | | float | 4 | v | a value between 0 and 1 indicating a position along the height of the texture. | <Category:Files>