and the submeshes would require bone parenting to reach to their correct positions.

It would be a really tedious task to support them so I'll just leave here the structures of the unpacked *.d files resulting from the tag model:

**TriMesh (Non-stripped)**

Code: Select all

```
long MeshCount;
for (int i = 0; i < MeshCount; i++)
{
ULONG64 Null;
long Vcount;
long FaceCount;
for (int j = 0; j < Vcount; j++)
{
float position[3];
float normals[3];
float texcoord[2];
BYTE vertexColorRGBA[4];
}
for (int j = 0; j < FaceCount; j++)
{
long AlignmentMark;
long TriangleIdx[3];
}
}
```

**TriMesh (Stripped)**

Code: Select all

```
long MeshCount;
for (int i = 0; i < MeshCount; i++)
{
ULONG64 Null;
long Vcount;
long StrippedGroupCount;
long ChunkSize; //IndexChunk + VertexChunk + Header
long IndexChunkAndHeaderSize;
float Unknown[6];
for (int j = 0; j < StrippedGroupCount; j++)
{
ULONG64 StrippedIndexCount;
long TriangleStrippedIdx[StrippedIndexCount];
}
for (int j = 0; j < Vcount; j++)
{
float position[3];
float normals[3];
float texcoord[2];
BYTE vertexColorRGBA[4];
}
}
```

**MaterialUV/MaterialUVStripped**

Code: Select all

```
long MeshCount;
for (int i = 0; i < MeshCount; i++)
{
long ChunkSize;
long Count;
long Vcount;
long Unknown[Count];
for (int j = 0; j < Vcount; j++)
{
long isMaterialUV; // always == 1
float texcoord[2];
}
}
```

**Node**

Code: Select all

```
long NodeCount;
for (int i = 0; i < NodeCount; i++)
{
long parentID;
long Unknown1;
long Unknown2;
char NodeName[64];
long NodeID; // Mapping to MeshID. Some nodes share the same ID
float Matrix4x4[16];
}
```