P3D File Format - ODOLV40 Obsolete

From Bohemia Interactive Community
Revision as of 01:06, 16 June 2007 by Mikero (talk | contribs) (1st raw save)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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. }