-
Notifications
You must be signed in to change notification settings - Fork 0
Mesh_Z
Chum World MESH
ImZouna Mesh_Z
This has an associated Data Class.
struct Mesh_Z_Header {
Object_Z objectHeader;
PascalArray<crc32_t> crc32s;
// all the material crc32s followed by the mesh data crc32
float closeX;
// how close the camera is allowed to get to the mesh on the X axis before it pops out
// if closeX or closeY are 0 then the mesh will never pop out
float closeY;
// Unused
// Usually 1.5
// no effect
// the closeY value is never used, instead the allowable closeY is calculated from closeX and closeZ
// how close the camera is allowed to get to the mesh on the Y axis before it pops out
float closeZ;
// how close the camera is allowed to get to the mesh on the Z axis before it pops out
// if closeX or closeZ is 0 then the mesh will never pop out
PascalArray<struct DynPoint {
Sphere_Z point;
// point.radius unused?
std::uint32_t flags;
// 0x10000000 -
// 0x08000000 -
// 0x04000000 -
// 0x01000000 -
// 0x00010000 -
// 0x00000007 -
std::uint32_t nameCRC32;
// Observed values:
// * LOCAL_LOOKAT - 3243480878
// * LOCAL_ATTACH - 3355622209
// * LOCAL_LIMIT - 3448189790
// * DYN_POINT1 - 1178470142
// * DYN_POINT2 - 1266491431
// * DYN_POINT3 - 1337736592
// * DYN_POINT4 - 1375432085
// * DYN_POINT5 - 1429893154
// * DYN_POINT6 - 1484347131
// * DYN_POINT7 - 1555581772
// * DYN_POINT8 - 4092384112
// * DYN_POINT9 - 1614211910
// * DYN_POINT10 - 1631719061
// * DYN_POINT11 - 1703088930
// * DYN_POINT12 - 1757427195
// * DYN_POINT13 - 1812015180
// * DYN_POINT14 - 1917220937
// * DYN_POINT15 - 1988584958
// * DYN_POINT16 - 2076459815
}> dynPoints;
// May be referenced in UserDefines
// LOCAL_LOOKAT is required on vehicle chassis
PascalArray<struct DynBox {
Mat4 mat;
std::uint32_t flags;
// 0x10000000 -
// 0x08000000 -
// 0x04000000 -
// 0x01000000 -
// 0x00010000 -
// 0x00000007 -
crc32_t nameCRC32;
// Observed values:
// * SFX_FIRE1 - 4217370453
// * SFX_EXHAUST1 - 342724588
// * SFX_EXHAUST2 - 422488373
// * SFX_EXHAUST3 - 502248578
// * SFX_EXHAUST4 - 61400199
// * SFX_EXHAUST5 - 124385584
// * SFX_EXHAUST6 - 170581993
// * SFX_EXHAUST7 - 250331742
// * SFX_EXHAUST8 - 916750307
// * SFX_EXHAUST9 - 845505108
// * SFX_EXHAUST10 - 612613378
// * SFX_EXHAUST11 - 541237429
// * SFX_EXHAUST12 - 755074668
// * SFX_EXHAUST13 - 700488667
// * SFX_EXHAUST14 - 931646430
// * SFX_EXHAUST15 - 860280425
// * SFX_EXHAUST16 - 1040576688
// * DURL - 2234468230
// * DYN_DAMAGE - 917337438
// * DYN_XFILTER - 3491467995
// * DYN_YFILTER - 1699973321
// * DYN_ZFILTER - 354920422
// * DYN_TENSION - 1676256635
// * DYN_VCOL - 1062800321
// * DYN_WINDPOW - 795155901
// * DYN_EXTPOW - 318847781
// * DYN_MVRATIO - 3678433905
// * DYN_VISCOSITY - 3134916619
// * DYN_STATICROTATION - 1081475432
// * DYN_R - 320233663
// * DYN_L - 1669929925
// * DYN_BR - 2360085526
// * DYN_FR - 2821249261
// * DYN_BL - 4231231340
// * DYN_FL - 3635913623
}> dynBoxes;
// read only when spawning model into the world
// The following fields only appear in the CHALGE versions
std::uint32_t zero0;
std::uint32_t zero1;
std::uint32_t zero2;
std::uint32_t zero3;
};
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------
struct MeshZHeader {
struct Object_Z
{
uint32 friendlyNameCRC32;
uint32 dataCRC32;
float rot[4];
float transform[16];
float unknown2;
float unknown0;
uint16 unknown1;
} object;
uint32 crc32Count0;
uint32 crc32s0[crc32Count0];
uint32 unknown0;
float unknown1;
uint32 unknown2;
uint32 unknown3Count;
struct Unknown3
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
} unknown3s[unknown3Count];
uint32 unknown4Count;
struct Unknown4
{
float unknown0s[16];
uint32 unknown1;
uint32 unknown2;
} unknown4s[unknown4Count];
} meshheader;
MeshZHeaderAlt
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------
struct MeshZHeaderAlt {
struct Object_Z
{
uint32 friendlyNameCRC32;
uint32 crc32Count;
uint32 crc32s[crc32Count];
uint32 dataCRC32;
float rot[4];
float transform[16];
float unknown2;
float unknown0;
uint16 unknown1;
} object;
float unknown0s[3];
uint32 unknown1s[4];
uint32 unknown10Count;
struct Unknown10
{
uint32 unknown0;
float unknown2s[3];
uint32 unknown3s[2];
} unknown10s[unknown10Count] <optimize=false>;
uint32 unknown3s[2];
uint32 unknown4Count;
byte unknown4s[unknown4Count * 6];
uint32 unknown5Count;
uint32 unknown5s[unknown5Count * 8];
uint32 unknown6Count;
uint32 unknown6s[unknown6Count];
uint32 unknown7Count;
uint16 unknown7s[unknown7Count];
uint32 unknown8Count;
struct Unknown8
{
uint32 nameSize;
byte name[nameSize];
uint32 unknown0;
uint16 unknown0flag;
uint32 unknown0Count;
uint16 unknown0s[unknown0Count];
uint32 unknown1Count;
float unknown1s[unknown1Count * 4];
} unknown8s[unknown8Count] <optimize=false>;
} meshheader;
struct Mesh_Z : Points_Z {
PascalArray<Vec3f> stripVertices;
// always empty
PascalArray<struct Unused0 {
std::uint32_t unknown0;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
}> unused0s;
// always empty
PascalArray<Vec2f> texcoords;
// always empty
PascalArray<Vec3f> normals;
// always empty
PascalArray<struct Strip {
PascalArray<std::uint16_t> stripVerticesIndices;
std::uint32_t materialCRC32;
std::uint32_t triOrder;
// 1/2
}> strips;
// always empty
// if (objectHeader.unknown0 & 2 != 0)
// {
// PascalArray<std::uint32_t> unknown3s;
// }
// This condition is never true
PascalArray<struct Unused4 {
PascalArray<struct Unused0 {
std::uint32_t unused0;
std::uint32_t unused1;
}> unused0s;
}> unused4s;
// always empty
PascalArray<crc32_t> materialCRC32s;
PascalArray<struct AABBCol {
Vec3f min;
std::uint16_t cylindreColsIndexBegin;
std::uint16_t cylindreColsIndexEnd;
// range of AABBs contained directly by this one
Vec3f max;
std::uint16_t unknown7sIndex;
std::uint16_t unknown7sIndicesCount;
// 0 if this AABB only contains other AABB and no faces
// range of CollisionFaces contained directly by this AABB
}> cylindreCols;
PascalArray<struct CollisionFace {
std::uint16_t unknown12Index0;
std::uint16_t unknown12Index1;
std::uint16_t unknown12Index2;
// Indices that make up the tri face
std::uint16_t option;
// 0/1
// not winding order
// double sided?
}> unknown7s;
PascalArray<struct Unused8 {
std::uint32_t unused0;
std::uint32_t unused1;
std::uint32_t unused2;
std::uint32_t unused3;
std::uint32_t unused4;
std::uint32_t unused5;
std::uint32_t unused6;
std::uint32_t unused7;
}> unused8s;
// always empty
struct MeshBuffers {
PascalArray<struct VertexBufferExt {
std::uint32_t vertexCount;
std::uint32_t vertexSize;
std::uint32_t subMeshID;
std::uint8_t data[vertexCount * vertexSize];
}> subMeshes;
// If one of the buffers is required by the morpher and it is removed then the game will crash while loading
PascalArray<struct IndexBufferExt {
std::uint32_t indexCount;
std::uint32_t subMeshID;
std::uint16_t data[indexCount];
}> indices;
PascalArray<struct WeirdQuad {
Vec3f vertex0;
Vec3f vertex1;
Vec3f vertex2;
Vec3f vertex3;
// Vertices that make up the quad face
// duplicated in unknown12s for some reason
Vec3f facing;
}> unknown11s;
// Occlusion test quad?
PascalArray<struct VertexGroup {
std::uint32_t vertexBufferIndex;
std::uint32_t indexBufferIndex;
std::uint32_t zero;
std::uint32_t zero1;
std::uint32_t flags;
// 0x00000004 - visible
// 0x00080000 - has morph
std::uint16_t vertexBufferIndexBegin;
std::uint16_t vertexBufferIndexEnd;
std::uint32_t vertexCount;
std::uint32_t indexBufferIndexBegin;
std::uint32_t faceCount;
std::uint32_t zero2;
std::uint32_t zero3;
std::uint16_t vertexSize;
std::uint16_t materialIndex;
PascalArray<struct Unused1 {
std::uint32_t unused0;
std::uint32_t unused1;
std::uint32_t unused2;
std::uint32_t unused3;
std::uint32_t unused4;
std::uint32_t unused5;
std::uint32_t unused6;
}> unused1s;
}> vertexGroups;
// composes vertex and index buffer
// when removed the mesh disapears but the game still runs as expected
// in wireframe debug view the mesh is not there but that could be a result of no material
// does NOT contain collision data
struct Morpher {
PascalArray<struct AABBMorphTrigger {
Vec3f min;
std::uint16_t unknown16IndexBegin;
std::uint16_t unknown16IndexEnd;
// range of AABBMorphTriggers contained directly by this one
Vec3f max;
std::uint16_t pairIndex;
std::uint16_t pairsIndicesCount;
// 0 if this AABBMorphTrigger only contains other AABBMorphTriggers and no pairs
// range of pairs contained by this AABBMorphTrigger
}> unknown16s;
// removing this has no effect
// relatively small
Map<std::uint16_t, std::uint16_t> map;
// Mapping from unknown12sIndex to unknown15sIndicesIndex
// removing this causes the game to crash when a collision with a static body occurs while MorphTargetDesc exists
// one element smaller than unknown12s
PascalArray<std::uint16_t> unknown15sIndices;
// smaller than unknown15s but much larger than any vertex buffer or pairs
PascalArray<struct MorphTargetDesc {
PascalString name;
std::uint32_t baseVertexBufferId;
// The vertexBufferId of the vertex buffer containing the visible mesh vertices
std::uint16_t displacementVertexBufferIndex;
// The index of the vertex buffer containing the displacement vectors
// Must be the same size as the base vertex buffer
// Editing this buffer doesnt seem to do anything
PascalArray<std::uint16_t> unknown15Indicies;
// Must be the same size as the base vertex buffer
// maps vertices in the base vertex buffer to displacement vectors
PascalArray<struct DisplacementVector {
std::int16_t x;
// multiply by 0.0009765625 = 0.5^10
std::int16_t y;
// multiply by 0.0009765625 = 0.5^10
std::int16_t z;
// multiply by 0.0009765625 = 0.5^10
std::uint16_t unknown15SelfIndex;
// current struct's Unknown15 index
}> unknown15s;
// much larger than any of the vertex buffers
// zeroing this array will make it so the deformation never happens
// This array contains displacements
}> morphs;
// always 0 or 1 but a loop is used to load it so it is a PascalArray and not an Option
// the game will run as normal when removed
// some pieces, as defined in VertexGroup, will be missing
} morpher;
} meshBuffers;
PascalArray<struct ShortVecWeird {
std::int16_t x;
std::int16_t y;
std::int16_t z;
}> unknown12s;
// 0x007b3800
// multiply every element by 0.0009765625 = 0.5^10
// related to the Col structs
// game crashes on collision with static body if empty while MorphTargetDesc exists
// no effect if same size but 0ed out data
// all overlap with various vertices in the last vertex buffer
};
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------
struct Mesh_Z
{
uint32 vecCount;
float vecs[vecCount * 3];
uint32 unknown0Count;
struct Unknown0
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
} unknown0s[unknown0Count];
uint32 unknown1Count;
struct Unknown1
{
uint32 unknown0;
uint32 unknown1;
} unknown1s[unknown1Count];
uint32 vertexCount;
float vertices1[vertexCount * 3];
uint32 unknown2Count;
struct Unknown2
{
uint32 unknown0Count;
uint16 unknown0s[unknown0Count];
uint32 unknown1;
uint32 unknown2;
} unknown2s[unknown2Count] <optimize=false>;
uint32 unknown4Count;
struct Unknown4
{
uint32 unknown0Count;
struct Unknown4Unknown0
{
uint32 unknown0;
uint32 unknown1;
} unknown0s[unknown0Count];
} unknown4s[unknown4Count] <optimize=false>;
uint32 materialCRC32Count;
uint32 materialCRC32s[materialCRC32Count];
uint32 unknown6Count;
struct Unknown6
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
uint32 unknown7;
} unknown6s[unknown6Count];
uint32 unknown7Count;
struct Unknown7
{
uint16 unknown0;
uint16 unknown1;
uint16 unknown2;
uint16 unknown3;
} unknown7s[unknown7Count];
uint32 unknown8Count;
struct Unknown8
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
uint32 unknown7;
} unknown8s[unknown8Count];
uint32 subMeshCount;
struct SubMesh
{
uint32 vertexCount;
uint32 vertexSize;
uint32 vertexGroupCRC32;
struct
{
float pos[3];
ubyte normx<read=byteToFloat,optimize=false>;
ubyte normy<read=byteToFloat,optimize=false>;
ubyte normz<read=byteToFloat,optimize=false>;
ubyte normp;
ubyte tanx<read=byteToFloat,optimize=false>;
ubyte tany<read=byteToFloat,optimize=false>;
ubyte tanz<read=byteToFloat,optimize=false>;
ubyte tanp;
float uvs[2];
ubyte x[vertexSize - 12 - 4 - 4 - 8];
} data[vertexCount];
} subMeshes[subMeshCount] <optimize=false>;
uint32 indicesCount;
struct Indices
{
uint32 indexCount;
uint32 vertexGroupCRC32;
uint16 data[indexCount];
} indices[indicesCount] <optimize=false>;
uint32 unknown11Count;
struct Unknown11
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
uint32 unknown7;
uint32 unknown8;
uint32 unknown9;
uint32 unknown10;
uint32 unknown11;
uint32 unknown12;
uint32 unknown13;
uint32 unknown14;
} unknown11s[unknown11Count];
uint32 unknown13Count;
struct Unknown13
{
uint32 vertexBufferIndex;
uint32 indexBufferIndex;
uint32 zero;
uint32 zero1;
uint32 flags;
uint16 vertexBufferIndexBegin;
uint16 vertexBufferIndexEnd;
uint32 vertexCount;
uint32 indexBufferIndexBegin;
uint32 faceCount;
uint32 zero2;
uint32 zero3;
uint16 vertexSize;
uint16 materialIndex;
uint32 unknown1Count;
struct Unknown13Unknown1
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
} unknown1s[unknown1Count];
} unknown13s[unknown13Count] <optimize=false>;
uint32 unknown16Count;
struct Unknown16
{
float unknown0;
float unknown1;
float unknown2;
uint16 unknown30;
uint16 unknown31;
float unknown4;
float unknown5;
float unknown6;
uint16 unknown70;
uint16 unknown71;
} unknown16s[unknown16Count];
uint32 pairCount;
struct Pair
{
uint16 first;
uint16 second;
} pairs[pairCount];
uint32 unknown18Count;
uint16 unknown18s[unknown18Count];
uint32 unknown14Count;
struct Unknown14
{
uint32 nameSize;
byte name[nameSize];
uint32 unknown1;
uint16 unknown2;
uint32 unknown4Count;
uint16 unknown4s[unknown4Count];
uint32 unknown15Count;
struct Unknown14Unknown15
{
int16 unknown0;
int16 unknown1;
int16 unknown2;
int16 unknown3;
} unknown15s[unknown15Count];
} unknown14s[unknown14Count] <optimize=false>;
uint32 unknown12Count;
struct Unknown12
{
uint16 u0;
uint16 u1;
uint16 u2;
} unknown12s[unknown12Count];
} mesh;
string byteToFloat(ubyte& value )
{
local string str = "";
local float normalByteToD3DColorComponent = ((value/255.0));
local float normalByteToFloat = ((normalByteToD3DColorComponent * 2) - 1);
SPrintf(str, "%f",normalByteToFloat);
return str;
}
Mesh_Z_Alt
struct Mesh_Z_Alt : Points_Z
{
PascalArray<Vec3f> vecs;
std::uint32_t unknown0Count;
struct Unknown0
{
std::uint32_t unknown0;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
} unknown0s[unknown0Count];
std::uint32_t unknown1Count;
struct Unknown1
{
std::uint32_t unknown0;
std::uint32_t unknown1;
} unknown1s[unknown1Count];
PascalArray<Vec3f> vertices1;
std::uint32_t unknown2Count;
struct Unknown2
{
PascalArray<std::uint16_t> unknown0s;
std::uint32_t unknown1;
std::uint32_t unknown2;
} unknown2s[unknown2Count];
// if (objectHeader.unknown1 & 2 != 0)
// {
// PascalArray<std::uint32_t> unknown3s;
// }
// This condition is never true
std::uint32_t unknown4Count;
struct Unknown4
{
std::uint32_t unknown0Count;
struct Unknown0
{
std::uint32_t unknown0;
std::uint32_t unknown1;
} unknown0s[unknown0Count];
} unknown4s[unknown4Count];
PascalArray<crc32_t> materialCRC32s;
std::uint32_t unknown6Count;
struct Unknown6
{
std::uint32_t unknown0;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
std::uint32_t unknown4;
std::uint32_t unknown5;
std::uint32_t unknown6;
std::uint32_t unknown7;
} unknown6s[unknown6Count];
std::uint32_t unknown7Count;
struct Unknown7
{
std::uint16_t unknown0;
std::uint16_t unknown1;
std::uint16_t unknown2;
std::uint16_t unknown3;
} unknown7s[unknown7Count];
std::uint32_t unknown8Count;
struct Unknown8
{
std::uint32_t unknown0;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
std::uint32_t unknown4;
std::uint32_t unknown5;
std::uint32_t unknown6;
std::uint32_t unknown7;
} unknown8s[unknown8Count];
std::uint32_t subMeshCount;
struct SubMesh
{
std::uint32_t vertexCount;
std::uint32_t vertexSize;
std::uint32_t vertexGroupCRC32;
std::uint8_t data[vertexCount * vertexSize];
} subMeshes[subMeshCount];
std::uint32_t indicesCount;
struct Indices
{
std::uint32_t indexCount;
std::uint32_t vertexGroupCRC32;
std::uint16_t data[indexCount];
} indices[indicesCount];
std::uint32_t unknown11Count;
struct Unknown11
{
std::uint32_t unknown0;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
std::uint32_t unknown4;
std::uint32_t unknown5;
std::uint32_t unknown6;
std::uint32_t unknown7;
std::uint32_t unknown8;
std::uint32_t unknown9;
std::uint32_t unknown10;
std::uint32_t unknown11;
std::uint32_t unknown12;
std::uint32_t unknown13;
std::uint32_t unknown14;
} unknown11s[unknown11Count];
std::uint32_t unknown13Count;
struct Unknown13
{
std::uint32_t unknown0s[12];
std::uint32_t unknown1Count;
struct Unknown1
{
std::uint32_t unknown0;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
std::uint32_t unknown4;
std::uint32_t unknown5;
std::uint32_t unknown6;
} unknown1s[unknown1Count];
} unknown13s[unknown13Count];
std::uint32_t unknown12Count;
struct Unknown12
{
std::uint16_t u0;
std::uint32_t u1;
} unknown12s[unknown12Count];
};
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//------------------------------------------------
struct Mesh_Z_Alt
{
uint32 vecCount;
float vecs[vecCount * 3];
uint32 unknown0Count;
struct Unknown0
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
} unknown0s[unknown0Count];
uint32 unknown1Count;
struct Unknown1
{
uint32 unknown0;
uint32 unknown1;
} unknown1s[unknown1Count];
uint32 vertexCount;
float vertices1[vertexCount * 3];
uint32 unknown2Count;
struct Unknown2
{
uint32 unknown0Count;
uint16 unknown0s[unknown0Count];
uint32 unknown1;
uint32 unknown2;
} unknown2s[unknown2Count] <optimize=false>;
// if (someHeaderValue)
// {
// PascalArray<uint32> unknown3s;
// }
uint32 unknown4Count;
struct Unknown4
{
uint32 unknown0Count;
struct Unknown4Unknown0
{
uint32 unknown0;
uint32 unknown1;
} unknown0s[unknown0Count];
} unknown4s[unknown4Count] <optimize=false>;
uint32 materialCRC32Count;
uint32 materialCRC32s[materialCRC32Count];
uint32 unknown6Count;
struct Unknown6
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
uint32 unknown7;
} unknown6s[unknown6Count];
uint32 unknown7Count;
struct Unknown7
{
uint16 unknown0;
uint16 unknown1;
uint16 unknown2;
uint16 unknown3;
} unknown7s[unknown7Count];
uint32 unknown8Count;
struct Unknown8
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
uint32 unknown7;
} unknown8s[unknown8Count];
uint32 subMeshCount;
struct SubMesh
{
uint32 vertexCount;
uint32 vertexSize;
uint32 vertexGroupCRC32;
byte data[vertexCount * vertexSize];
} subMeshes[subMeshCount] <optimize=false>;
uint32 indicesCount;
struct Indices
{
uint32 indexCount;
uint32 vertexGroupCRC32;
uint16 data[indexCount];
} indices[indicesCount] <optimize=false>;
uint32 unknown11Count;
struct Unknown11
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
uint32 unknown7;
uint32 unknown8;
uint32 unknown9;
uint32 unknown10;
uint32 unknown11;
uint32 unknown12;
uint32 unknown13;
uint32 unknown14;
} unknown11s[unknown11Count];
uint32 unknown13Count;
struct Unknown13
{
uint32 unknown0s[12];
uint32 unknown1Count;
struct Unknown13Unknown1
{
uint32 unknown0;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
uint32 unknown6;
} unknown1s[unknown1Count];
} unknown13s[unknown13Count] <optimize=false>;
uint32 unknown12Count;
struct Unknown12
{
uint16 u0;
uint32 u1;
} unknown12s[unknown12Count];
} mesh;
The vertex format is the lower vertexSize
bytes from the folowing structure.
struct Vertex {
Vec3f position;
std::uint8_t normal[3];
// Each byte is transformed to float via
// (normal[i] / 255.0) * 2.0 - 1.0
std::uint8_t normalPadding;
// Always? 255
std::uint8_t tangent[3];
// Each byte is transformed to float via
// (normal[i] / 255.0) * 2.0 - 1.0
// Always orthogonal to normal i.e. normal dot tangent == 0 aprox
std::uint8_t tangentPadding;
// Always? 255
Vec2f uvs[2];
// ...
};
For FMTK Users and Mod Developers
For FMTK Developers
Asobo BigFile Format Specification
Asobo Classes
Animation_Z
Binary_Z
Bitmap_Z
Camera_Z
CollisionVol_Z
Fonts_Z
GameObj_Z
GenWorld_Z
GwRoad_Z
Keyframer*_Z
Light_Z
LightData_Z
Lod_Z
LodData_Z
Material_Z
MaterialAnim_Z
MaterialObj_Z
Mesh_Z
MeshData_Z
Node_Z
Omni_Z
Particles_Z
ParticlesData_Z
RotShape_Z
RotShapeData_Z
Rtc_Z
Skel_Z
Skin_Z
Sound_Z
Spline_Z
SplineGraph_Z
Surface_Z
SurfaceDatas_Z
UserDefine_Z
Warp_Z
World_Z
WorldRef_Z
Asobo File Format Idioms
Asobo CRC32
Asobo LZ Compression
Asobo Arithmetic Coding Compression
Asobo Save Game File Format Specification
Asobo Audio Formats
TotemTech/ToonTech/Zouna/ACE/BSSTech/Opal Timeline
Zouna Modding Resources
Miscellaneous