1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/// Mesh format.
///
/// ## Format Description
///
/// A placeholder description from <http://fabletlcmod.com>:
///
/// ```txt
/// Tagged Model Format
///
/// 3DMF: 3D Mesh File
/// 3DRT: (File Size of all Chunks)
/// MTLS: Material List (File Size of All MTRL Chunks)
/// MTRL: Material Description
/// MTLE: Extended Material Properties
/// MMAP: Mapping Info
/// SUBM: Sub-Mesh
/// TRFM: Transformation Matrix
/// PRIM: Primitive
/// TRIS: Triangle List
/// SMTH: Smoothing Groups
/// VERT: Vertex List
/// UNIV: Unique Vertex Information
/// VGRP: Vertex Group
/// BONE: Bone
/// CLTH: Cloth
/// HLPR: Helpers
/// HDMY: Dummy Object
/// HPNT: Helper Point
/// HCVL: Convex Volume
///
/// Compiled Model Format
///
/// char NullTerminatedString[x];
/// byte SkeletonPresent;
/// float floats[10]; //Model Origin?? Listed in .big Sub-header...
/// word HPNT_Count;
/// word HDMY_Count;
/// dword HLPR_Index_Uncompressed;
/// word padding;
/// word HPNT_Compressed;
/// Helper Points[HPNT_Count];
/// float Matrix[4]; //No Rotation
/// long hierarchy;
/// word HDMY_Compressed;
/// Helper Dummies[HDMY_Count];
/// float Matrix[13];
/// long hierarchy;
/// word HLPR_Index_Compressed;
/// word HPNT_IndexSize;
/// char HPNT_Index[HPNT_IndexSize-2]; //Subtract the size
/// char HDMY_Index[HLPR_Index_Uncompressed-HPNT_IndexSize]; //Rest of helper index deduced
/// dword NumberMaterials;
/// dword NumberSurfaces;
/// dword NumberBones;
/// dword SizeOfBoneIndex;
/// byte Unknown;
/// word Unknown;
/// word Unknown;
/// word Compressed;
/// word Bone_Index_Reference[NumberBones-1];
/// word BoneIndexCompressed;
/// char BoneIndex[SizeOfBoneIndex];
/// word CompressedSize;
/// Bones SUB CHUNK 1[NumberBones];
/// word CompressedSize;
/// Bones SUB CHUNK 2[NumberBones];
/// word CompressedSize;
/// Bones SUB CHUNK 3[NumberBones];
/// float Matrix[12]; //Transform Matrix
///
/// Bones
/// SUB CHUNK 1
/// long Index;
/// long Parent;
/// long nChild;
/// float Matrix[12];
/// SUB CHUNK 2
/// float Matrix[12];
/// SUB CHUNK 3
/// float Matrix[16];
///
/// Material List
/// dword Material_Index;
/// char NullTerminatedString[x];
/// dword Padding;
/// dword BASE_Texture_ID; //From Texture.big
/// dword BUMPMAP_Texture_ID; //From Texture.big
/// dword REFLECT_Texture_ID; //From Texture.big
/// dword Unknown;
/// dword Max_Texture_Layers;
/// dword Glow_Strength;
/// byte Unknown;
/// byte Alpha_Enabled;
/// byte Unknown;
/// word Ignored; //For degenerate Tri's
///
/// Sub-Mesh
/// dword Hierarchy;
/// dword DestroyableMeshLevels;
/// float floats[5];
/// dword nFaceVertexIndices;
/// dword nFaceVertexIndices_BoneIndice;
/// dword nVerts;
/// dword nFaces;
/// dword nSourceVerts;
/// dword Unknown;
/// dword Unknown;
/// dword Unknown;
/// struct structMTRLnFaceVertexIndices FaceIndices[nFaceVertexIndices];
/// struct structMTRLnFaceVertexIndicesBoneIndice Face_BoneIndices[nFaceVertexIndices_BoneIndice];
/// float floats[8];
/// dword sVert;
/// dword padding;
/// //Start of Mesh
///
/// Quick notes on sVert “Size Vertice Blocks”….
///
/// 20 - 28byte float coords, bones, packed normals, s11e4 tu tv
/// 6 - 28byte packed coords, bones, packed normals, s11e4 tu, tv, dword[2]
/// 4 - 36byte float coords, float normals, float tu tv, dword meshlevel
/// 22 - 36byte float coords, bones, packed normals, s11e4 tu,tv, dword[2]
/// 4 - 12byte packed coords, packed normals, s11e4 tu tv
/// 4 - 20byte packed coords, bones, packed normals, s11e4 tu tv
/// 20 - 20byte float coords, packed normals, s11e4 tu tv
/// Dynamic Clothing
///
/// struct CLTH
/// {
/// //DWORD SubMesh_ClothCount;
/// DWORD Cloth_ID;
/// DWORD ??_ID; //possibly material ID
/// DWORD sChunk; //Size of full clothing data
/// DWORD Unknown5;
/// DWORD sDistanceIndice;
/// CLTH_Distance* DistanceIndice;//[sDistanceIndice/28]; //Distance between two particles
/// float Unknown8;
/// float Unknown9;
/// float Unknown10;
/// DWORD sParticleIndice;
/// CLTH_Particle* ParticleIndice;//[sParticleIndice];
/// float* ParticleAlphaIndice;//[sParticleIndice]; //How "free" they are. 0.0 = Static and gets a duped // entry in verts
/// DWORD Unknown11;
/// float WindStrength; //strength
/// char EnableDragging; //enable
/// char RotationalDragging; //rotational
/// float StrengthDragging; //strength
/// char EnableAcceleration; //enable
/// float AccelerationDampening; //damping
/// DWORD nTriIndice;
/// CLTH_Tri* TriIndice;//[nTriIndice] Particles+"Unique" Verts
/// DWORD Unknown12; // looks like padding it
/// DWORD sTexIndice;
/// CLTH_Tex* TexIndice;//[sTexIndice]; //v1 = Particle/"unique" Vert, v2 = TexIndice
/// DWORD sVertexIndice;
/// CLTH_Vertex* VertexIndice;//[sVertexIndice];
/// DWORD sTexCoordIndice;
/// CLTH_TexCoord* TexCoordIndice;//[sTexCoordIndice];
/// DWORD sParticleMask;
/// CLTH_PartMask* ParticleMask;//[sParticleMask]; //Unique Particles in TriIndice
/// DWORD sVertMask;
/// CLTH_VertMask* Vertmask;//[sVertMask]; //Unique Verts in TriIndice
/// //9 bytes of padding
/// // 1 group for particles, 1 for verts
/// DWORD VGRPCount; // = Number of Bones
/// VGRP** VGRPs;
/// };
/// ```
///