Thank you much! BTW i realized that every vertex entry has info about face entry and count so the count isn't always equal. Don't know why there are chunks for face indices.
That "id" in code is acctually face info offset and "face_chunks" is count of entries.
Try it on this one...
EDiT: Nevermind... I figured it out. Another ugly template. But thank you anyway for your template... I learned alot from it. For now it's limited on 3 face chunks.
Code:
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//
// File:
// Authors:
// Version:
// Purpose:
// Category:
// File Mask:
// ID Bytes:
// History:
//------------------------------------------------
LittleEndian(); OutputPaneClear();
local uint i,j,k,inc_0,inc_1;
local string FileName=GetFileName(),FilePath=FileNameGetPath(FileName,true),BaseName=FileNameGetBase(FileName,false);
struct MDL_HEADER {
float POS[4];
uint IDS[2],FLAG,VERTEX_INFO_OFFSET,TABLE_0_OFFSET,VERTEX_INFO_COUNT,NULL;
float VALUES[3];
uint TABLE_3_OFFSET,TABLE_3_SIZE,TABLE_4_OFFSET,TABLE_4_SIZE,TABLE_1_OFFSET,MATERIAL_INFO_OFFSET,MATERIAL_COUNT;
uint POS_ROT_INFO_OFFSET,UNK_DATA_0_OFFSET,POS_ROT_INFO_COUNT,UNK_DATA_1_OFFSET,TABLE_2_OFFSET;
ubyte COUNT_0,COUNT_1,COUNT_2,COUNT_3;
uint ZERO;
};
struct POS_ROT_INFO {
local float null=0.000000;
float m00,m01,m02,w03,m10,m11,m12,w13,m20,m21,m22,w23,POS_X,POS_Y,POS_Z,POS_W;
//Printf("xform -matrix %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %s_%d_Mesh; xform -t %f %f %f %s_%d_Mesh;\n",m00,m01,m02,w03,m10,m11,m12,w13,m20,m21,m22,w23,null,null,null,null,BaseName,SUBMDL_COUNT_TMP---1,POS_X,POS_Y,POS_Z,BaseName,SUBMDL_COUNT_TMP1---1);
};
struct VERTEX_INFO {
uint FLAG0,VERTEX_DATA_OFFSET,FLAG1,FACE_INFO_OFFSET,FACE_CHUNKS,VTB_SIZE,FLAG2;
};
struct FACE_INFO {
float VALUES[8];
uint FACE_FLAG,FACE_COUNT,FACE_DATA_OFFSET,NULL;
};
struct MATERIAL_INFO {
string MATERIAL_NAME;
};
MDL_HEADER MDLHeader;
FSeek(MDLHeader.VERTEX_INFO_OFFSET);
VERTEX_INFO VTXEntry[MDLHeader.VERTEX_INFO_COUNT];
for( i = 0; i < MDLHeader.VERTEX_INFO_COUNT; i++ ){
FSeek(VTXEntry[i].FACE_INFO_OFFSET + startof(VTXEntry[i]));
if (VTXEntry[i].FACE_CHUNKS == 1){
FACE_INFO FIEntryMain;}
else if (VTXEntry[i].FACE_CHUNKS == 2){
FACE_INFO FIEntryMain,FIEntrySecond;}
else if (VTXEntry[i].FACE_CHUNKS == 3){
FACE_INFO FIEntryMain,FIEntrySecond,FIEntryThird;}
}
FSeek(MDLHeader.MATERIAL_INFO_OFFSET+MDLHeader.MATERIAL_COUNT*4);
MATERIAL_INFO MATEntry[MDLHeader.MATERIAL_COUNT]<optimize=false>;
for( i = 0; i < MDLHeader.VERTEX_INFO_COUNT; i++ )
{
if (VTXEntry[i].FACE_CHUNKS == 1){
Printf("Vertex Offset = 0x%08x\tBlock Size = %u\tFace Offset = 0x%08x\tFace Count = %u\n",
VTXEntry[i].VERTEX_DATA_OFFSET + startof(VTXEntry[i]), VTXEntry[i].VTB_SIZE,
FIEntryMain[i].FACE_DATA_OFFSET + startof(FIEntryMain[i]), FIEntryMain[i].FACE_COUNT + 1);
}
else if (VTXEntry[i].FACE_CHUNKS == 2){
Printf("Vertex Offset = 0x%08x\tBlock Size = %u\tFace Offset = 0x%08x\tFace Count = %u\n",
VTXEntry[i].VERTEX_DATA_OFFSET + startof(VTXEntry[i]), VTXEntry[i].VTB_SIZE,
FIEntryMain[i].FACE_DATA_OFFSET + startof(FIEntryMain[i]), FIEntryMain[i].FACE_COUNT+FIEntrySecond[j++].FACE_COUNT+2);
}
else if (VTXEntry[i].FACE_CHUNKS == 3){
Printf("Vertex Offset = 0x%08x\tBlock Size = %u\tFace Offset = 0x%08x\tFace Count = %u\n",
VTXEntry[i].VERTEX_DATA_OFFSET + startof(VTXEntry[i]), VTXEntry[i].VTB_SIZE,
FIEntryMain[i].FACE_DATA_OFFSET + startof(FIEntryMain[i]), FIEntryMain[i].FACE_COUNT+FIEntrySecond[j++].FACE_COUNT+FIEntryThird[k++].FACE_COUNT+3);
}
}