Difference between revisions of "JOE format"
(New page: 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.) |
m (Update categories) |
||
(14 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
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. | 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. | ||
+ | |||
+ | {{note|This documentation was generated by reverse engineering model.h and modle.cpp and inspecting the python blender export script. So there may be errors in evaluation.}} | ||
+ | |||
+ | === Data Type Map === | ||
+ | The following table explicitly defines the various data types used in a JOE file. | ||
+ | {| border="1" | ||
+ | !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. | ||
+ | |||
+ | {| border="1" | ||
+ | !data type!!block offset!!name!!description | ||
+ | |- | ||
+ | |int||0||magic | ||
+ | |'''8441211611'''(0x1F722AADB): 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. | ||
+ | |||
+ | {| border="1" | ||
+ | !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 | ||
+ | * File Header.num_faces Face blocks | ||
+ | * 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 ). | ||
+ | |||
+ | {| border="1" | ||
+ | !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]] and [[Track files and formats]] | ||
+ | |} | ||
+ | |||
+ | ===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. | ||
+ | |||
+ | {| border="1" | ||
+ | !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. | ||
+ | {| border="1" | ||
+ | !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]] |
Latest revision as of 02:33, 1 September 2012
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.
Note: This documentation was generated by reverse engineering model.h and modle.cpp and inspecting the python blender export script. So there may be errors in evaluation. |
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 | 8441211611(0x1F722AADB): 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.
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
- File Header.num_faces Face blocks
- 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 and Track files and formats |
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. |