@flighthq/scene3d-formats 0.2.1-next.840.857425c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/awd2Inflate.d.ts +4 -0
  2. package/dist/awd2Inflate.d.ts.map +1 -0
  3. package/dist/awd2Inflate.js +249 -0
  4. package/dist/awd2Inflate.js.map +1 -0
  5. package/dist/awd2Parse.d.ts +7 -0
  6. package/dist/awd2Parse.d.ts.map +1 -0
  7. package/dist/awd2Parse.js +1533 -0
  8. package/dist/awd2Parse.js.map +1 -0
  9. package/dist/awd2Schema.d.ts +44 -0
  10. package/dist/awd2Schema.d.ts.map +1 -0
  11. package/dist/awd2Schema.js +67 -0
  12. package/dist/awd2Schema.js.map +1 -0
  13. package/dist/gltfParse.d.ts +9 -0
  14. package/dist/gltfParse.d.ts.map +1 -0
  15. package/dist/gltfParse.js +1456 -0
  16. package/dist/gltfParse.js.map +1 -0
  17. package/dist/gltfPunctualLights.d.ts +3 -0
  18. package/dist/gltfPunctualLights.d.ts.map +1 -0
  19. package/dist/gltfPunctualLights.js +103 -0
  20. package/dist/gltfPunctualLights.js.map +1 -0
  21. package/dist/index.d.ts +12 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/md2Parse.d.ts +5 -0
  26. package/dist/md2Parse.d.ts.map +1 -0
  27. package/dist/md2Parse.js +408 -0
  28. package/dist/md2Parse.js.map +1 -0
  29. package/dist/md2Schema.d.ts +12 -0
  30. package/dist/md2Schema.d.ts.map +1 -0
  31. package/dist/md2Schema.js +193 -0
  32. package/dist/md2Schema.js.map +1 -0
  33. package/dist/md5AnimParse.d.ts +3 -0
  34. package/dist/md5AnimParse.d.ts.map +1 -0
  35. package/dist/md5AnimParse.js +385 -0
  36. package/dist/md5AnimParse.js.map +1 -0
  37. package/dist/md5Parse.d.ts +6 -0
  38. package/dist/md5Parse.d.ts.map +1 -0
  39. package/dist/md5Parse.js +635 -0
  40. package/dist/md5Parse.js.map +1 -0
  41. package/dist/mtlParse.d.ts +3 -0
  42. package/dist/mtlParse.d.ts.map +1 -0
  43. package/dist/mtlParse.js +256 -0
  44. package/dist/mtlParse.js.map +1 -0
  45. package/dist/objParse.d.ts +5 -0
  46. package/dist/objParse.d.ts.map +1 -0
  47. package/dist/objParse.js +464 -0
  48. package/dist/objParse.js.map +1 -0
  49. package/dist/sceneSkeleton.d.ts +3 -0
  50. package/dist/sceneSkeleton.d.ts.map +1 -0
  51. package/dist/sceneSkeleton.js +34 -0
  52. package/dist/sceneSkeleton.js.map +1 -0
  53. package/dist/shared.d.ts +18 -0
  54. package/dist/shared.d.ts.map +1 -0
  55. package/dist/shared.js +143 -0
  56. package/dist/shared.js.map +1 -0
  57. package/dist/threeDsParse.d.ts +4 -0
  58. package/dist/threeDsParse.d.ts.map +1 -0
  59. package/dist/threeDsParse.js +718 -0
  60. package/dist/threeDsParse.js.map +1 -0
  61. package/package.json +55 -0
  62. package/src/awd2Inflate.test.ts +118 -0
  63. package/src/awd2Parse.test.ts +2431 -0
  64. package/src/gltfParse.test.ts +2339 -0
  65. package/src/gltfPunctualLights.test.ts +184 -0
  66. package/src/gltfTreeShaking.test.ts +45 -0
  67. package/src/md2Parse.test.ts +1033 -0
  68. package/src/md5AnimParse.test.ts +673 -0
  69. package/src/md5Parse.test.ts +1094 -0
  70. package/src/mtlParse.test.ts +244 -0
  71. package/src/objParse.test.ts +690 -0
  72. package/src/sceneSkeleton.test.ts +35 -0
  73. package/src/shared.test.ts +210 -0
  74. package/src/threeDsParse.test.ts +1089 -0
@@ -0,0 +1,408 @@
1
+ import { createAnimationTrack } from '@flighthq/animation';
2
+ import { createTransform3D } from '@flighthq/geometry';
3
+ import { reportImportDiagnostic } from '@flighthq/importdiagnostics';
4
+ import { createBlinnPhongMaterial } from '@flighthq/materials';
5
+ import { createMeshGeometry } from '@flighthq/mesh';
6
+ import { createScene3DFromDocument } from '@flighthq/scene3d';
7
+ import { ImportDiagnosticSeverity, MeshKind, Scene3DAnimationPathWeights } from '@flighthq/types';
8
+ import { MD2_ANORMS, MD2_COMPRESSED_VERTEX_SIZE, MD2_FRAME_HEADER_SIZE, MD2_FRAME_FPS, MD2_FRAME_NAME_SIZE, MD2_HEADER_SIZE, MD2_MAGIC, MD2_SKIN_SIZE, MD2_TEXCOORD_SIZE, MD2_TRIANGLE_SIZE, MD2_VERSION, } from './md2Schema';
9
+ import { CANONICAL_FLOATS_PER_VERTEX, CANONICAL_LAYOUT, createExternalTextureRef } from './shared';
10
+ // Parses an id Software MD2 (Quake 2) binary model into a Scene3D. Frame 0 is the base pose of a single
11
+ // Mesh node; every subsequent frame becomes a morph target (position/normal deltas from frame 0), so
12
+ // the mesh carries a MeshMorph for its vertex-frame animation (createScene3DFromMd2 folds the clip that drives it
13
+ // — see agents/morph-target-animation.md, where MD2 is the legacy validation case for the morph
14
+ // deformer). Compressed vertices are decompressed using each frame's scale and translate vectors, and
15
+ // normals are resolved from the 162-entry Anorms lookup table. UV coordinates are scaled from integer
16
+ // texture-space values to 0-1 using the header's skinWidth and skinHeight.
17
+ //
18
+ // Because MD2 triangles reference vertex and texcoord indices independently (like OBJ), the parser
19
+ // re-indexes using a dedup map keyed by "vertIdx/texIdx" to build the canonical interleaved vertex
20
+ // buffer, remembering each deduped vertex's source MD2 vertex index so the per-frame morph deltas map
21
+ // through the same re-indexing. MD2's oddities — byte-quantized frames, the normal LUT, and the Z-up→
22
+ // Y-up reflection — stay quarantined here; the emitted morph targets are plain Y-up float deltas.
23
+ //
24
+ // Malformed input records an ImportDiagnostic (into an engaged collector) and returns an empty Scene3D rather than throwing. Convenience over
25
+ // `createScene3DFromDocument(parseMd2(bytes))`.
26
+ export function createScene3DFromMd2(bytes, diagnostics) {
27
+ return createScene3DFromDocument(parseMd2(bytes, diagnostics));
28
+ }
29
+ // Parses an id Software MD2 (Quake 2) binary model into a format-neutral Scene3DDocument: one Mesh node
30
+ // whose base pose is frame 0 and whose per-frame vertex animation is carried as a MeshMorph (each later
31
+ // frame a position/normal delta target), plus one weights animation driving that morph. Assemble into a
32
+ // live Scene3D with `createScene3DFromDocument`. Malformed input returns an empty document, recording an ImportDiagnostic when a collector is engaged.
33
+ export function parseMd2(bytes, diagnostics) {
34
+ if (bytes.length < MD2_HEADER_SIZE) {
35
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.header-too-short', 'parseMd2', {
36
+ byteLength: bytes.length,
37
+ });
38
+ return emptyMd2Document();
39
+ }
40
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
41
+ const magic = view.getInt32(0, true);
42
+ if (magic !== MD2_MAGIC) {
43
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.bad-magic', 'parseMd2', {
44
+ magic: (magic >>> 0).toString(16),
45
+ });
46
+ return emptyMd2Document();
47
+ }
48
+ const version = view.getInt32(4, true);
49
+ if (version !== MD2_VERSION) {
50
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.unsupported-version', 'parseMd2', {
51
+ version,
52
+ });
53
+ return emptyMd2Document();
54
+ }
55
+ const skinWidth = view.getInt32(8, true);
56
+ const skinHeight = view.getInt32(12, true);
57
+ const numSkins = view.getInt32(20, true);
58
+ const numVertices = view.getInt32(24, true);
59
+ const numTexCoords = view.getInt32(28, true);
60
+ const numTriangles = view.getInt32(32, true);
61
+ const numFrames = view.getInt32(40, true);
62
+ const offSkins = view.getInt32(44, true);
63
+ const offTexCoords = view.getInt32(48, true);
64
+ const offTriangles = view.getInt32(52, true);
65
+ const offFrames = view.getInt32(56, true);
66
+ if (numFrames < 1) {
67
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.no-frames', 'parseMd2');
68
+ return emptyMd2Document();
69
+ }
70
+ if (numTriangles < 1) {
71
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.no-triangles', 'parseMd2');
72
+ return emptyMd2Document();
73
+ }
74
+ // Validate that the buffer contains the data regions we need — including every frame (each frame is
75
+ // its own header + compressed-vertex block, laid contiguously from offFrames).
76
+ const frameStride = MD2_FRAME_HEADER_SIZE + numVertices * MD2_COMPRESSED_VERTEX_SIZE;
77
+ const texCoordsEnd = offTexCoords + numTexCoords * MD2_TEXCOORD_SIZE;
78
+ const trianglesEnd = offTriangles + numTriangles * MD2_TRIANGLE_SIZE;
79
+ const allFramesEnd = offFrames + numFrames * frameStride;
80
+ if (texCoordsEnd > bytes.length || trianglesEnd > bytes.length || allFramesEnd > bytes.length) {
81
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.truncated-data-region', 'parseMd2', {
82
+ byteLength: bytes.length,
83
+ });
84
+ return emptyMd2Document();
85
+ }
86
+ // Read texcoords: int16 s, int16 t per entry. Scale to 0-1 using skinWidth/skinHeight.
87
+ const uvScaleS = skinWidth > 0 ? 1 / skinWidth : 0;
88
+ const uvScaleT = skinHeight > 0 ? 1 / skinHeight : 0;
89
+ const texS = new Float32Array(numTexCoords);
90
+ const texT = new Float32Array(numTexCoords);
91
+ for (let i = 0; i < numTexCoords; i++) {
92
+ const base = offTexCoords + i * MD2_TEXCOORD_SIZE;
93
+ texS[i] = view.getInt16(base, true) * uvScaleS;
94
+ texT[i] = view.getInt16(base + 2, true) * uvScaleT;
95
+ }
96
+ // Decompress every frame into per-vertex Y-up positions + Anorms-decoded normals. Frame 0 is the base
97
+ // pose; the rest become morph targets. Each frame carries its own quantization scale/translate, so
98
+ // dequantization is per-frame; the Z-up→Y-up reflection is applied here so the morph deltas below are
99
+ // computed entirely in Flight's Y-up space.
100
+ const frames = readMd2Frames(bytes, view, offFrames, numFrames, numVertices, frameStride, diagnostics);
101
+ const base = frames[0];
102
+ // Re-index triangles. Each MD2 triangle has 3 vertex indices and 3 texcoord indices (independent
103
+ // indexing like OBJ). Build a dedup map keyed by "vertIdx/texIdx", remembering each deduped vertex's
104
+ // source MD2 vertex index so the per-frame morph deltas map through the same re-indexing.
105
+ const dedup = new Map();
106
+ const interleavedVertices = [];
107
+ const sourceVertexIndices = [];
108
+ const indices = [];
109
+ // Out-of-range triangle indices are aggregated and reported once after the loop rather than per corner
110
+ // — the perf contract keeps the hot per-corner loop free of per-element seam calls (a well-formed model
111
+ // reaches neither counter).
112
+ let outOfRangeVertexCorners = 0;
113
+ let outOfRangeTexCoordCorners = 0;
114
+ for (let t = 0; t < numTriangles; t++) {
115
+ const triBase = offTriangles + t * MD2_TRIANGLE_SIZE;
116
+ for (let c = 0; c < 3; c++) {
117
+ const vertIdx = view.getUint16(triBase + c * 2, true);
118
+ const texIdx = view.getUint16(triBase + 6 + c * 2, true);
119
+ if (vertIdx >= numVertices) {
120
+ outOfRangeVertexCorners++;
121
+ continue;
122
+ }
123
+ if (texIdx >= numTexCoords) {
124
+ outOfRangeTexCoordCorners++;
125
+ continue;
126
+ }
127
+ const key = `${vertIdx}/${texIdx}`;
128
+ let idx = dedup.get(key);
129
+ if (idx === undefined) {
130
+ idx = interleavedVertices.length / CANONICAL_FLOATS_PER_VERTEX;
131
+ const p = vertIdx * 3;
132
+ // Position (3 floats), base-frame Y-up.
133
+ interleavedVertices.push(base.positions[p], base.positions[p + 1], base.positions[p + 2]);
134
+ // Normal (3 floats), base-frame Y-up.
135
+ interleavedVertices.push(base.normals[p], base.normals[p + 1], base.normals[p + 2]);
136
+ // Tangent (4 floats) — MD2 does not carry tangents; zero-filled.
137
+ interleavedVertices.push(0, 0, 0, 0);
138
+ // UV (2 floats).
139
+ interleavedVertices.push(texS[texIdx], texT[texIdx]);
140
+ sourceVertexIndices.push(vertIdx);
141
+ dedup.set(key, idx);
142
+ }
143
+ indices.push(idx);
144
+ }
145
+ }
146
+ if (outOfRangeVertexCorners > 0) {
147
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Drop, 'md2.triangle-vertex-index-out-of-range', 'parseMd2', {
148
+ corners: outOfRangeVertexCorners,
149
+ });
150
+ }
151
+ if (outOfRangeTexCoordCorners > 0) {
152
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Drop, 'md2.triangle-texcoord-index-out-of-range', 'parseMd2', {
153
+ corners: outOfRangeTexCoordCorners,
154
+ });
155
+ }
156
+ if (indices.length === 0) {
157
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Reject, 'md2.no-valid-triangles', 'parseMd2');
158
+ return emptyMd2Document();
159
+ }
160
+ // MD2 has no lighting-model parameters — each skin is a texture path, and a model's several skins are
161
+ // alternate diffuse textures for the same mesh (one active at a time). Emit every skin as a
162
+ // BlinnPhongMaterial in the document's materials table so a caller can swap alternates in, and bind the
163
+ // first to the mesh's single subset. MD2's own shading is diffuse-textured.
164
+ const document = emptyMd2Document();
165
+ const meshMaterials = [];
166
+ // Empty (all-null path) skin records are counted in numSkins but yield no material; tally them and flush
167
+ // one crumb after the loop rather than reporting per skin (aggregate-once).
168
+ let emptySkinCount = 0;
169
+ let firstEmptySkin = -1;
170
+ for (let s = 0; s < numSkins; s++) {
171
+ const skinOffset = offSkins + s * MD2_SKIN_SIZE;
172
+ if (skinOffset + MD2_SKIN_SIZE > bytes.length) {
173
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Drop, 'md2.skin-record-truncated', 'parseMd2', {
174
+ skin: s,
175
+ });
176
+ break;
177
+ }
178
+ const skinName = readMd2SkinName(bytes, skinOffset);
179
+ if (skinName.length === 0) {
180
+ if (emptySkinCount === 0)
181
+ firstEmptySkin = s;
182
+ emptySkinCount++;
183
+ continue;
184
+ }
185
+ const material = createBlinnPhongMaterial({
186
+ diffuseMap: createExternalTextureRef(skinName, null, document.resources),
187
+ });
188
+ // MD2's skin path is the material's authored identity — preserve it as the name.
189
+ material.name = skinName;
190
+ const index = document.materials.length;
191
+ document.materials.push(material);
192
+ // Bind the first non-empty skin to the mesh; the rest stay available as alternates.
193
+ if (meshMaterials.length === 0)
194
+ meshMaterials.push(index);
195
+ }
196
+ if (emptySkinCount > 0) {
197
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Drop, 'md2.skin-empty-path', 'parseMd2', {
198
+ count: emptySkinCount,
199
+ firstSkin: firstEmptySkin,
200
+ });
201
+ }
202
+ const vertices = new Float32Array(interleavedVertices);
203
+ const indexArray = Uint32Array.from(indices);
204
+ const geometry = createMeshGeometry({ indices: indexArray, layout: CANONICAL_LAYOUT, vertices });
205
+ const morph = buildMd2Morph(frames, sourceVertexIndices);
206
+ const documentMesh = { geometry, materials: meshMaterials };
207
+ if (morph !== null)
208
+ documentMesh.morph = morph;
209
+ document.meshes.push(documentMesh);
210
+ document.nodes.push({ children: [], kind: MeshKind, mesh: 0, transform: createTransform3D() });
211
+ document.scenes[0].rootNodes.push(0);
212
+ // Realize MD2's per-frame vertex animation as weight-track channels on the generic morph substrate.
213
+ // MD2 encodes named sub-animations by frame-name prefix ("stand01".."run06".."attack01"..), so the
214
+ // frames are segmented into one named clip per contiguous same-prefix run rather than a single clip.
215
+ // Within a clip, adjacent-frame weights form the two-frame lerp (a hat function) MD2 semantics call
216
+ // for. A single-frame model has no motion and leaves `animations` empty. Channels bind mesh node 0.
217
+ document.animations.push(...buildMd2MorphAnimations(frames, morph));
218
+ return document;
219
+ }
220
+ // Decompresses every MD2 frame into Y-up positions + Anorms-decoded normals, indexed by the raw MD2
221
+ // vertex index. Each frame carries its own byte-quantization scale/translate (position = compressed *
222
+ // scale + translate); normals are the 162-entry Anorms unit vectors. Both are reflected Z-up→Y-up
223
+ // (x, y, z) → (x, z, -y) so all downstream morph math is in Flight's space. This is where MD2's three
224
+ // quantization/LUT/handedness oddities are quarantined.
225
+ function readMd2Frames(bytes, view, offFrames, numFrames, numVertices, frameStride, diagnostics) {
226
+ const frames = [];
227
+ // uint8 normal indices can exceed the 162-entry table in malformed files; collect the distinct
228
+ // offenders and report once rather than per-vertex. Only allocated when a collector is engaged.
229
+ const outOfRangeNormals = diagnostics ? new Set() : null;
230
+ for (let f = 0; f < numFrames; f++) {
231
+ const frameBase = offFrames + f * frameStride;
232
+ const scaleX = view.getFloat32(frameBase, true);
233
+ const scaleY = view.getFloat32(frameBase + 4, true);
234
+ const scaleZ = view.getFloat32(frameBase + 8, true);
235
+ const translateX = view.getFloat32(frameBase + 12, true);
236
+ const translateY = view.getFloat32(frameBase + 16, true);
237
+ const translateZ = view.getFloat32(frameBase + 20, true);
238
+ // The frame name (its sub-animation label) is the 16-byte field after the scale+translate vectors.
239
+ const name = readMd2FrameName(bytes, frameBase + 24);
240
+ const verticesBase = frameBase + MD2_FRAME_HEADER_SIZE;
241
+ const positions = new Float32Array(numVertices * 3);
242
+ const normals = new Float32Array(numVertices * 3);
243
+ for (let i = 0; i < numVertices; i++) {
244
+ const b = verticesBase + i * MD2_COMPRESSED_VERTEX_SIZE;
245
+ const px = bytes[b] * scaleX + translateX;
246
+ const py = bytes[b + 1] * scaleY + translateY;
247
+ const pz = bytes[b + 2] * scaleZ + translateZ;
248
+ const p = i * 3;
249
+ // Z-up → Y-up: (x, y, z) → (x, z, -y).
250
+ positions[p] = px;
251
+ positions[p + 1] = pz;
252
+ positions[p + 2] = -py;
253
+ const ni = bytes[b + 3];
254
+ if (ni < MD2_ANORMS.length) {
255
+ const n = MD2_ANORMS[ni];
256
+ normals[p] = n[0];
257
+ normals[p + 1] = n[2];
258
+ normals[p + 2] = -n[1];
259
+ }
260
+ else if (outOfRangeNormals !== null) {
261
+ outOfRangeNormals.add(ni);
262
+ }
263
+ }
264
+ frames.push({ name, normals, positions });
265
+ }
266
+ if (outOfRangeNormals !== null && outOfRangeNormals.size > 0) {
267
+ // Recover, not Drop: the geometry survives with those normals left zero.
268
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Recover, 'md2.normal-index-out-of-range', 'readMd2Frames', {
269
+ distinctIndices: outOfRangeNormals.size,
270
+ firstIndex: Math.min(...outOfRangeNormals),
271
+ });
272
+ }
273
+ return frames;
274
+ }
275
+ // Builds a MeshMorph whose targets are frames 1..N as position/normal deltas from frame 0 (the base),
276
+ // re-indexed to the deduped vertex order via `sourceVertexIndices`. Returns null for a single-frame
277
+ // model (no motion, so no morph). The weight array starts all-zero (the base pose); the folded clip
278
+ // drives it. tangentDeltas is always null — MD2 carries no tangents.
279
+ function buildMd2Morph(frames, sourceVertexIndices) {
280
+ if (frames.length < 2)
281
+ return null;
282
+ const base = frames[0];
283
+ const vertexCount = sourceVertexIndices.length;
284
+ const targets = [];
285
+ for (let f = 1; f < frames.length; f++) {
286
+ const frame = frames[f];
287
+ const positionDeltas = new Float32Array(vertexCount * 3);
288
+ const normalDeltas = new Float32Array(vertexCount * 3);
289
+ for (let v = 0; v < vertexCount; v++) {
290
+ const src = sourceVertexIndices[v] * 3;
291
+ const dst = v * 3;
292
+ positionDeltas[dst] = frame.positions[src] - base.positions[src];
293
+ positionDeltas[dst + 1] = frame.positions[src + 1] - base.positions[src + 1];
294
+ positionDeltas[dst + 2] = frame.positions[src + 2] - base.positions[src + 2];
295
+ normalDeltas[dst] = frame.normals[src] - base.normals[src];
296
+ normalDeltas[dst + 1] = frame.normals[src + 1] - base.normals[src + 1];
297
+ normalDeltas[dst + 2] = frame.normals[src + 2] - base.normals[src + 2];
298
+ }
299
+ targets.push({ normalDeltas, positionDeltas, tangentDeltas: null });
300
+ }
301
+ return { targets, weights: new Float32Array(targets.length) };
302
+ }
303
+ // Segments MD2's frames into named vertex-morph clips, one per contiguous run of same-action frames.
304
+ // MD2 stores each sub-animation as a run of frames whose names share an action prefix and end in a
305
+ // frame number ("stand01".."stand40"); `md2FrameActionName` recovers that prefix, and contiguous
306
+ // same-prefix frames become one `Scene3DDocumentAnimation`. Returns an empty array for a model with no
307
+ // morph (single frame). A model whose frames carry no names collapses to one clip named 'default',
308
+ // identical to MD2's implicit single animation. Each clip binds mesh node 0.
309
+ function buildMd2MorphAnimations(frames, morph) {
310
+ if (morph === null)
311
+ return [];
312
+ const targetCount = morph.targets.length;
313
+ if (targetCount === 0)
314
+ return [];
315
+ const animations = [];
316
+ const usedNames = new Set();
317
+ let runStart = 0;
318
+ for (let k = 1; k <= frames.length; k++) {
319
+ const runAction = md2FrameActionName(frames[runStart].name);
320
+ // Close the run at the buffer end or when the next frame's action prefix differs.
321
+ if (k < frames.length && md2FrameActionName(frames[k].name) === runAction)
322
+ continue;
323
+ animations.push(buildMd2ActionClip(runAction, runStart, k - 1, targetCount, usedNames));
324
+ runStart = k;
325
+ }
326
+ return animations;
327
+ }
328
+ // Builds one named clip for the contiguous frame run [startFrame..endFrame] (absolute frame indices).
329
+ // Frame 0 is the morph base pose (all weights zero); frame k≥1 is morph target k-1. The clip's weight
330
+ // track has one keyframe per frame at clip-local time (i / MD2_FRAME_FPS), each keyframe's full-width
331
+ // value vector activating only that frame's target — linear interpolation between adjacent keyframes
332
+ // then blends frame → frame+1, the two-frame lerp MD2 semantics call for. The track width stays the
333
+ // mesh's full morph-target count because a `weights` channel drives the whole weight array.
334
+ function buildMd2ActionClip(action, startFrame, endFrame, targetCount, usedNames) {
335
+ const count = endFrame - startFrame + 1;
336
+ const times = new Float32Array(count);
337
+ const values = new Float32Array(count * targetCount);
338
+ for (let i = 0; i < count; i++) {
339
+ const frame = startFrame + i;
340
+ times[i] = i / MD2_FRAME_FPS;
341
+ if (frame >= 1)
342
+ values[i * targetCount + (frame - 1)] = 1;
343
+ }
344
+ const track = createAnimationTrack({ components: targetCount, interpolation: 'Linear', times, values });
345
+ return {
346
+ channels: [{ node: 0, path: Scene3DAnimationPathWeights, track }],
347
+ duration: times[count - 1],
348
+ name: uniqueMd2ClipName(action, usedNames),
349
+ };
350
+ }
351
+ // Recovers the sub-animation action name from a frame name by stripping the trailing frame-number run
352
+ // ("stand01" → "stand", "run1" → "run"). Returns '' for a name that is empty or purely numeric, which
353
+ // callers map to the 'default' clip. This is the frame-name convention id Software's MD2 exporters use
354
+ // to pack multiple actions into one contiguous frame list.
355
+ function md2FrameActionName(frameName) {
356
+ return frameName.trim().replace(/\d+$/, '');
357
+ }
358
+ // Produces a clip name unique within this document. An empty action prefix becomes 'default'; a name
359
+ // already taken (two non-adjacent runs of the same action) gets a numeric suffix so name-keyed scene
360
+ // animation maps never collide.
361
+ function uniqueMd2ClipName(action, usedNames) {
362
+ const base = action.length > 0 ? action : 'default';
363
+ let name = base;
364
+ for (let n = 2; usedNames.has(name); n++)
365
+ name = `${base}.${n}`;
366
+ usedNames.add(name);
367
+ return name;
368
+ }
369
+ // The empty Scene3DDocument returned when MD2 parsing fails or before assembly begins — every table present.
370
+ function emptyMd2Document() {
371
+ return {
372
+ animations: [],
373
+ cameras: [],
374
+ lights: [],
375
+ materials: [],
376
+ meshes: [],
377
+ metadata: null,
378
+ nodes: [],
379
+ resources: [],
380
+ scenes: [{ rootNodes: [] }],
381
+ skins: [],
382
+ };
383
+ }
384
+ // Reads the fixed 16-byte null-padded ASCII frame-name field starting at `offset`, stopping at the
385
+ // first null terminator. The name encodes the frame's sub-animation (an action prefix + frame number).
386
+ function readMd2FrameName(bytes, offset) {
387
+ const limit = offset + MD2_FRAME_NAME_SIZE;
388
+ let end = offset;
389
+ while (end < limit && bytes[end] !== 0)
390
+ end++;
391
+ let name = '';
392
+ for (let i = offset; i < end; i++)
393
+ name += String.fromCharCode(bytes[i]);
394
+ return name;
395
+ }
396
+ // Reads a fixed 64-byte null-padded ASCII skin path record starting at `offset`, stopping at the
397
+ // first null terminator.
398
+ function readMd2SkinName(bytes, offset) {
399
+ const limit = offset + MD2_SKIN_SIZE;
400
+ let end = offset;
401
+ while (end < limit && bytes[end] !== 0)
402
+ end++;
403
+ let name = '';
404
+ for (let i = offset; i < end; i++)
405
+ name += String.fromCharCode(bytes[i]);
406
+ return name;
407
+ }
408
+ //# sourceMappingURL=md2Parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md2Parse.js","sourceRoot":"","sources":["../src/md2Parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const MD2_MAGIC = 844121161;
2
+ export declare const MD2_VERSION = 8;
3
+ export declare const MD2_HEADER_SIZE = 68;
4
+ export declare const MD2_SKIN_SIZE = 64;
5
+ export declare const MD2_TRIANGLE_SIZE = 12;
6
+ export declare const MD2_TEXCOORD_SIZE = 4;
7
+ export declare const MD2_COMPRESSED_VERTEX_SIZE = 4;
8
+ export declare const MD2_FRAME_HEADER_SIZE = 40;
9
+ export declare const MD2_FRAME_NAME_SIZE = 16;
10
+ export declare const MD2_FRAME_FPS = 10;
11
+ export declare const MD2_ANORMS: readonly (readonly [number, number, number])[];
12
+ //# sourceMappingURL=md2Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md2Schema.d.ts","sourceRoot":"","sources":["../src/md2Schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS,YAAa,CAAC;AAGpC,eAAO,MAAM,WAAW,IAAI,CAAC;AAG7B,eAAO,MAAM,eAAe,KAAK,CAAC;AAGlC,eAAO,MAAM,aAAa,KAAK,CAAC;AAGhC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAGpC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAGnC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAG5C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAIxC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAItC,eAAO,MAAM,aAAa,KAAK,CAAC;AAMhC,eAAO,MAAM,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAmKpE,CAAC"}
@@ -0,0 +1,193 @@
1
+ // id Software MD2 (Quake 2 / id Tech 2) wire-format constants. These are format-internal and not
2
+ // re-exported from the package barrel.
3
+ // Header magic: "IDP2" as a little-endian int32.
4
+ export const MD2_MAGIC = 0x32504449;
5
+ // Expected version field in the header.
6
+ export const MD2_VERSION = 8;
7
+ // Fixed header size in bytes: 17 int32 fields = 68 bytes.
8
+ export const MD2_HEADER_SIZE = 68;
9
+ // Bytes per skin record: a fixed 64-byte null-padded ASCII texture path.
10
+ export const MD2_SKIN_SIZE = 64;
11
+ // Bytes per triangle record: 3 uint16 vertex indices + 3 uint16 texcoord indices = 12 bytes.
12
+ export const MD2_TRIANGLE_SIZE = 12;
13
+ // Bytes per texcoord record: int16 s + int16 t = 4 bytes.
14
+ export const MD2_TEXCOORD_SIZE = 4;
15
+ // Bytes per compressed vertex within a frame: uint8 x + uint8 y + uint8 z + uint8 normalIndex = 4.
16
+ export const MD2_COMPRESSED_VERTEX_SIZE = 4;
17
+ // Bytes for the per-frame header (scale + translate + name): 3*float32 + 3*float32 + 16 chars = 40.
18
+ export const MD2_FRAME_HEADER_SIZE = 40;
19
+ // Bytes of the per-frame name field (a null-padded ASCII label encoding the frame's sub-animation).
20
+ // It follows the scale+translate vectors, at frameBase + 24.
21
+ export const MD2_FRAME_NAME_SIZE = 16;
22
+ // The frame playback rate MD2 animation is authored against (Quake 2 plays model frames at ~10 fps).
23
+ // Used to derive the morph keyframe times (frameIndex / fps) when building the vertex-morph clip.
24
+ export const MD2_FRAME_FPS = 10;
25
+ // The 162-entry Anorms table of pre-computed unit normals used by Quake 2 MD2 models. Each
26
+ // compressed vertex stores an 8-bit index into this table. Values are the canonical id Software
27
+ // anorms table (quake2/anorms.h), verbatim and in the original order — MD2 normal indices are
28
+ // indices into exactly this list, so both membership and ordering are load-bearing.
29
+ export const MD2_ANORMS = [
30
+ [-0.525731, 0.0, 0.850651],
31
+ [-0.442863, 0.238856, 0.864188],
32
+ [-0.295242, 0.0, 0.955423],
33
+ [-0.309017, 0.5, 0.809017],
34
+ [-0.16246, 0.262866, 0.951056],
35
+ [0.0, 0.0, 1.0],
36
+ [0.0, 0.850651, 0.525731],
37
+ [-0.147621, 0.716567, 0.681718],
38
+ [0.147621, 0.716567, 0.681718],
39
+ [0.0, 0.525731, 0.850651],
40
+ [0.309017, 0.5, 0.809017],
41
+ [0.525731, 0.0, 0.850651],
42
+ [0.295242, 0.0, 0.955423],
43
+ [0.442863, 0.238856, 0.864188],
44
+ [0.16246, 0.262866, 0.951056],
45
+ [-0.681718, 0.147621, 0.716567],
46
+ [-0.809017, 0.309017, 0.5],
47
+ [-0.587785, 0.425325, 0.688191],
48
+ [-0.850651, 0.525731, 0.0],
49
+ [-0.864188, 0.442863, 0.238856],
50
+ [-0.716567, 0.681718, 0.147621],
51
+ [-0.688191, 0.587785, 0.425325],
52
+ [-0.5, 0.809017, 0.309017],
53
+ [-0.238856, 0.864188, 0.442863],
54
+ [-0.425325, 0.688191, 0.587785],
55
+ [-0.716567, 0.681718, -0.147621],
56
+ [-0.5, 0.809017, -0.309017],
57
+ [-0.525731, 0.850651, 0.0],
58
+ [0.0, 0.850651, -0.525731],
59
+ [-0.238856, 0.864188, -0.442863],
60
+ [0.0, 0.955423, -0.295242],
61
+ [-0.262866, 0.951056, -0.16246],
62
+ [0.0, 1.0, 0.0],
63
+ [0.0, 0.955423, 0.295242],
64
+ [-0.262866, 0.951056, 0.16246],
65
+ [0.238856, 0.864188, 0.442863],
66
+ [0.262866, 0.951056, 0.16246],
67
+ [0.5, 0.809017, 0.309017],
68
+ [0.238856, 0.864188, -0.442863],
69
+ [0.262866, 0.951056, -0.16246],
70
+ [0.5, 0.809017, -0.309017],
71
+ [0.850651, 0.525731, 0.0],
72
+ [0.716567, 0.681718, 0.147621],
73
+ [0.716567, 0.681718, -0.147621],
74
+ [0.525731, 0.850651, 0.0],
75
+ [0.425325, 0.688191, 0.587785],
76
+ [0.864188, 0.442863, 0.238856],
77
+ [0.688191, 0.587785, 0.425325],
78
+ [0.809017, 0.309017, 0.5],
79
+ [0.681718, 0.147621, 0.716567],
80
+ [0.587785, 0.425325, 0.688191],
81
+ [0.955423, 0.295242, 0.0],
82
+ [1.0, 0.0, 0.0],
83
+ [0.951056, 0.16246, 0.262866],
84
+ [0.850651, -0.525731, 0.0],
85
+ [0.955423, -0.295242, 0.0],
86
+ [0.864188, -0.442863, 0.238856],
87
+ [0.951056, -0.16246, 0.262866],
88
+ [0.809017, -0.309017, 0.5],
89
+ [0.681718, -0.147621, 0.716567],
90
+ [0.850651, 0.0, 0.525731],
91
+ [0.864188, 0.442863, -0.238856],
92
+ [0.809017, 0.309017, -0.5],
93
+ [0.951056, 0.16246, -0.262866],
94
+ [0.525731, 0.0, -0.850651],
95
+ [0.681718, 0.147621, -0.716567],
96
+ [0.681718, -0.147621, -0.716567],
97
+ [0.850651, 0.0, -0.525731],
98
+ [0.809017, -0.309017, -0.5],
99
+ [0.864188, -0.442863, -0.238856],
100
+ [0.951056, -0.16246, -0.262866],
101
+ [0.147621, 0.716567, -0.681718],
102
+ [0.309017, 0.5, -0.809017],
103
+ [0.425325, 0.688191, -0.587785],
104
+ [0.442863, 0.238856, -0.864188],
105
+ [0.587785, 0.425325, -0.688191],
106
+ [0.688191, 0.587785, -0.425325],
107
+ [-0.147621, 0.716567, -0.681718],
108
+ [-0.309017, 0.5, -0.809017],
109
+ [0.0, 0.525731, -0.850651],
110
+ [-0.525731, 0.0, -0.850651],
111
+ [-0.442863, 0.238856, -0.864188],
112
+ [-0.295242, 0.0, -0.955423],
113
+ [-0.16246, 0.262866, -0.951056],
114
+ [0.0, 0.0, -1.0],
115
+ [0.295242, 0.0, -0.955423],
116
+ [0.16246, 0.262866, -0.951056],
117
+ [-0.442863, -0.238856, -0.864188],
118
+ [-0.309017, -0.5, -0.809017],
119
+ [-0.16246, -0.262866, -0.951056],
120
+ [0.0, -0.850651, -0.525731],
121
+ [-0.147621, -0.716567, -0.681718],
122
+ [0.147621, -0.716567, -0.681718],
123
+ [0.0, -0.525731, -0.850651],
124
+ [0.309017, -0.5, -0.809017],
125
+ [0.442863, -0.238856, -0.864188],
126
+ [0.16246, -0.262866, -0.951056],
127
+ [0.238856, -0.864188, -0.442863],
128
+ [0.5, -0.809017, -0.309017],
129
+ [0.425325, -0.688191, -0.587785],
130
+ [0.716567, -0.681718, -0.147621],
131
+ [0.688191, -0.587785, -0.425325],
132
+ [0.587785, -0.425325, -0.688191],
133
+ [0.0, -0.955423, -0.295242],
134
+ [0.0, -1.0, 0.0],
135
+ [0.262866, -0.951056, -0.16246],
136
+ [0.0, -0.850651, 0.525731],
137
+ [0.0, -0.955423, 0.295242],
138
+ [0.238856, -0.864188, 0.442863],
139
+ [0.262866, -0.951056, 0.16246],
140
+ [0.5, -0.809017, 0.309017],
141
+ [0.716567, -0.681718, 0.147621],
142
+ [0.525731, -0.850651, 0.0],
143
+ [-0.238856, -0.864188, -0.442863],
144
+ [-0.5, -0.809017, -0.309017],
145
+ [-0.262866, -0.951056, -0.16246],
146
+ [-0.850651, -0.525731, 0.0],
147
+ [-0.716567, -0.681718, -0.147621],
148
+ [-0.716567, -0.681718, 0.147621],
149
+ [-0.525731, -0.850651, 0.0],
150
+ [-0.5, -0.809017, 0.309017],
151
+ [-0.238856, -0.864188, 0.442863],
152
+ [-0.262866, -0.951056, 0.16246],
153
+ [-0.864188, -0.442863, 0.238856],
154
+ [-0.809017, -0.309017, 0.5],
155
+ [-0.688191, -0.587785, 0.425325],
156
+ [-0.681718, -0.147621, 0.716567],
157
+ [-0.442863, -0.238856, 0.864188],
158
+ [-0.587785, -0.425325, 0.688191],
159
+ [-0.309017, -0.5, 0.809017],
160
+ [-0.147621, -0.716567, 0.681718],
161
+ [-0.425325, -0.688191, 0.587785],
162
+ [-0.16246, -0.262866, 0.951056],
163
+ [0.442863, -0.238856, 0.864188],
164
+ [0.16246, -0.262866, 0.951056],
165
+ [0.309017, -0.5, 0.809017],
166
+ [0.147621, -0.716567, 0.681718],
167
+ [0.0, -0.525731, 0.850651],
168
+ [0.425325, -0.688191, 0.587785],
169
+ [0.587785, -0.425325, 0.688191],
170
+ [0.688191, -0.587785, 0.425325],
171
+ [-0.955423, 0.295242, 0.0],
172
+ [-0.951056, 0.16246, 0.262866],
173
+ [-1.0, 0.0, 0.0],
174
+ [-0.850651, 0.0, 0.525731],
175
+ [-0.955423, -0.295242, 0.0],
176
+ [-0.951056, -0.16246, 0.262866],
177
+ [-0.864188, 0.442863, -0.238856],
178
+ [-0.951056, 0.16246, -0.262866],
179
+ [-0.809017, 0.309017, -0.5],
180
+ [-0.864188, -0.442863, -0.238856],
181
+ [-0.951056, -0.16246, -0.262866],
182
+ [-0.809017, -0.309017, -0.5],
183
+ [-0.681718, 0.147621, -0.716567],
184
+ [-0.681718, -0.147621, -0.716567],
185
+ [-0.850651, 0.0, -0.525731],
186
+ [-0.688191, 0.587785, -0.425325],
187
+ [-0.587785, 0.425325, -0.688191],
188
+ [-0.425325, 0.688191, -0.587785],
189
+ [-0.425325, -0.688191, -0.587785],
190
+ [-0.587785, -0.425325, -0.688191],
191
+ [-0.688191, -0.587785, -0.425325],
192
+ ];
193
+ //# sourceMappingURL=md2Schema.js.map