Here's 010 HEX Editor template to parse file "DOLPHINS.RSF" you provided. It's not a full format research. Just some things.
Not sure why there is a 287 vertex blocks and only 120 face blocks. There must be some logic how to pair them. So far no luck. You can try it on your own...
Code:
//------------------------------------------------
//--- 010 Editor v12.0.1 Binary Template
//
// File:
// Authors:
// Version:
// Purpose:
// Category:
// File Mask:
// ID Bytes:
// History:
//------------------------------------------------
struct FSR_HDR {
char Magic[4];
uint32 Null[3];
};
struct INFO_HDR {
char Magic[4];
uint32 Null,InfoSize,InfoHeaderSize;
};
struct INFO {
uint32 StrLen;
char MdlBaseName[StrLen];
byte Pad[13];
float BBoxX,BBoxY,BBoxZ;
};
struct JOBN_HDR {
char Magic[4];
uint32 Null,JobnSize,JobnHeaderSize;
};
struct JOBN {
uint32 JobnCount;
char Magic[4];
uint32 StrLen;
char Name[StrLen];
};
struct GEOM_HDR {
char Magic[4];
uint32 Flag,TexHeaderOffset,GeomHeaderSize;
};
struct TMFV {
uint32 TMFVCount;
struct VFMT {
char Magic[4];uint32 StringSize;string Name;
}VFMTData[TMFVCount]<optimize=false>;
};
struct MRTS {
uint32 MRTSCount;
struct STRM {
char Magic[9];uint32 VTXCount,Stride,Num;
struct VTX {
if (Stride == 12) {
hfloat Vtx,Vty,Vtz,Val0,Uvx,Uvy;}
else if (Stride == 16) {
hfloat Vtx,Vty,Vtz,Val0,Uvx,Uvy,Val1,Val2;}
else if (Stride == 20 && Num == 2) {
hfloat Vtx,Vty,Vtz,Val0,Val1,Val2,Uvx,Uvy,Val3,Val4;}
else if (Stride == 20 && Num == 3) {
hfloat Vtx,Vty,Vtz,Val0,Uvx,Uvy,Val1,Val2,Val3,Val4;}
else if (Stride == 20 && Num == 10) {
hfloat Vtx,Vty,Vtz,Val0,Uvx,Uvy,Val1,Val2,Val3,Val4;}
else if (Stride == 24) {
hfloat Vtx,Vty,Vtz,Val0,Uvx,Uvy,Val1,Val2,Val3,Val4,Val5,Val6;}
else if (Stride == 28) {
hfloat Vtx,Vty,Vtz,Val0,Uvx,Uvy,Val1,Val2,Val3,Val4,Val5,Val6,Val7,Val8;}
else if (Stride == 72) {
float Vtx,Vty,Vtz,Val0,Val1,Val2,Val3,Val4,Val5,Val6,Uvx,Uvy,Val7,Val8,Val9,Val10,Val11,Val12;}
}Vertices[VTXCount]<optimize=false>;
}STRMData[MRTSCount]<optimize=false>;
};
struct INDX {
uint32 INDXCount;
struct XDNI {
char Magic[9];uint32 FICount;char INDMagic[4];
struct FACEI {
short Fx,Fy,Fz;
}Faces[FICount/3];
}XDNIData[INDXCount]<optimize=false>;
};
struct MESH {
uint32 HSEMCount;
struct HSEM {
char Magic[8],SecMagic[8];
uint32 Val0,Val1,Val2,Val3,Val4,Val5,Val6;
local uint32 Val7_tmp=ReadUInt(FTell());
if (Val7_tmp != 1296388936)
uint32 Val7;
//local string s;
//SPrintf(s,"%u",(uint32)MatId);
}HSEMData[HSEMCount]<optimize=false>;
};
struct GEOM {
uint32 GEOMCount;
struct MOEG {
char Magic[4];
uint32 Flag,MeshStrLen;
string MeshName;
string FFFF;
float Posx,Posy,Posz;
byte Null[6];
uint32 Val0,Val1,Val2;
}MOEGData[GEOMCount]<optimize=false>;
};
struct TEXT_HDR {
char Magic[4];
uint32 Flag,TextSize,TexHeaderSize;
};
struct TEXT {
uint32 TEXTCount;
struct TXET {
char Magic[4];
uint32 ShaderStrLen;
string ShaderName;
uint32 TexNameStrLen;
string ExportedTextureName;
}TXETData[TEXTCount]<optimize=false>;
};
struct SHDR_HDR {
char Magic[4];
uint32 Flag,ShdrSize,ShdrHeaderSize;
};
struct SHDR {
uint32 SHDRCount;
struct RDHS {
char Magic[4];
uint32 RdhsStrLen;
string RdhsName;
}RDHSData[SHDRCount]<optimize=false>;
};
struct MATL_HDR {
char Magic[4];
uint32 Flag,MatlSize,MatlHeaderSize;
};
struct MATL {
byte MATL_Data[MATLHeader.MatlSize-MATLHeader.MatlHeaderSize];
};
struct SGRF_HDR {
char Magic[4];
uint32 Flag,SgrfSize,SgrfHeaderSize;
};
struct SGRF {
byte SGRF_Data[SGRFHeader.SgrfSize-SGRFHeader.SgrfHeaderSize];
};
struct CRWD_HDR {
char Magic[4];
uint32 Flag,CrwdSize,CrwdHeaderSize;
};
struct CRWD {
byte CRWD_Data[CRWDHeader.CrwdSize-CRWDHeader.CrwdHeaderSize];
};
struct SBVH_HDR {
char Magic[4];
uint32 Flag,SbvhSize,SbvhHeaderSize;
};
struct SBVH {
byte SBVH_Data[SBVHHeader.SbvhSize-SBVHHeader.SbvhHeaderSize];
};
FSR_HDR FSRHeader;
INFO_HDR INFOHeader;
INFO INFOData;
FSeek(startof(INFOHeader)+INFOHeader.InfoSize);
JOBN_HDR JOBNHeader;
JOBN JOBNData;
FSeek(startof(JOBNHeader)+JOBNHeader.JobnSize);
GEOM_HDR GEOMHeader;
TMFV TMFVData;
MRTS MRTSData;
INDX INDXData;
MESH MESHData;
GEOM GEOMData;
FSeek(startof(GEOMHeader)+GEOMHeader.TexHeaderOffset);
TEXT_HDR TEXTHeader;
TEXT TEXTData;
FSeek(startof(TEXTHeader)+TEXTHeader.TextSize);
SHDR_HDR SHDRHeader;
SHDR SHDRData;
FSeek(startof(SHDRHeader)+SHDRHeader.ShdrSize);
MATL_HDR MATLHeader;
MATL MATLData;
FSeek(startof(MATLHeader)+MATLHeader.MatlSize);
SGRF_HDR SGRFHeader;
SGRF SGRFData;
FSeek(startof(SGRFHeader)+SGRFHeader.SgrfSize);
CRWD_HDR CRWDHeader;
CRWD CRWDData;
FSeek(startof(CRWDHeader)+CRWDHeader.CrwdSize);
SBVH_HDR SBVHHeader;
SBVH SBVHData;