P3D File Format - ODOLV40 Obsolete
The following information has been provided by BxBx
blocks in odol v4 are quite similar to odol v7 but placed in back direction , (first is relolution table, LOD are placed from last to first ),there is same LZ compresion as ODOL v7
known data:
char signature[4] //'ODOL' int format // 40 int lod_count float resolutions[lod_count] { int u1; float u2,u3,u4 } // unknow data, same data follows on end of ODOL v7
char u5[139] // unknow data , still same length char *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' or '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. }