P3D File Format - ODOLV40 Obsolete
Categories:
The following information has been provided by BxBx
Blocks in Odol v4 are quite similar to Odol v7 but placed in reverse order.
relolution table, LOD last to first
For the Lods there is same LZ compresion as ODOL v7
known data:
Beginning of file (Header signature)
char signature[4] //'ODOL' long format // 40 long lod_count
float resolutions[lod_count]
{
long u1;
float u2,u3,u4
} // unknown data, same data follows on end of ODOL v7
char u5[139] // unknown data , still same length
Asciiz *sceletonname // float zeroendded char array
if (char[0]!=0)
{
bool8 u6 // 8bit boolean // value 1 or 0
int bone_count
struct bones[bone_count]
{
char * bone1,bone2 //strings
}
}
char u7[0x26] // unknow data
char *modelclass, *modelparent // I think of purpose this data found values 'houseno'
//housebuilding',....
char u8[5] // unknowd data
bool8 exist_anims
if (exist_anims)
{
int anims_count
struct anims[anims_count]
{
int type // 0,4,9 // rotation,move,.., i dont check it yet
char *name,*parent
float tr[6]// transformations values
if (type!=9) int u9
}
}
unknowdata[unknowlength] // handle seek
lod
{
int vertices count
bool8 ub1
if (ub1) char uch[11] // unknow data
cha uch[0x29] // unknow data
int textures_count
char * texture[textures_count]
int materials_count
struct materials[materials_count]
{
char * name
char uch[0x85] // unknowdata // some float values
int textres_count
struct textures_in_material[textres_count]
{
int u10 // value 3 still
char* t_name
int u11 // self increment value // 0,1,2,3,4,...
}
char uch[0x34*textres_count] // some struct with same length
//as textures_in_material
// I dont work with material now, I skip it.
}
if ( textures_count>0 ) char uch[7];
bool8 ub // unknown value
int faces_count
char u12[6]
struct faces[6]
{
char dot_count
unsigned short dot_vertice_index[dot_count]
}
unknowdata[ubknowlength]
int components_count
struct components[components_count]
{
char *name;
int selected_faces_count
unsign short selected_faces[selected_faces_count] // if selected_faces_count > 0x100
// then compresed by LZ
int u14;
unsign short u15[u14]
bool8 ub
if (ub) int u16
char uch[3]
bool8 ub2
int selected_vertices_count
unsign short selected_vertices[selected_vertices_count] // if selected_vertices_count > 0x100
// then compresed by LZ
int u17
char uch[u17];
}
int named_properties_count
struct named_properties[named_properties_count]
{
char * name,*value
}
unknowdata[mostly 0x15 , but not every time]
int vertices_count // again same value
bool8 ub
if (ub)
{
struct UV[vertices_count] {float u,v} if count > 127 then LZ
}
else char uch[8]
int u[18]
int vertices_count
struct vertices_pos[verices_count]{float x,y,z}
follows normals and the other data ,but this is in progress
I cannot find face.texture_index informations, in M16A4 are only 2 textures and I texture it handly by original UVsets. }