@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.
- package/dist/awd2Inflate.d.ts +4 -0
- package/dist/awd2Inflate.d.ts.map +1 -0
- package/dist/awd2Inflate.js +249 -0
- package/dist/awd2Inflate.js.map +1 -0
- package/dist/awd2Parse.d.ts +7 -0
- package/dist/awd2Parse.d.ts.map +1 -0
- package/dist/awd2Parse.js +1533 -0
- package/dist/awd2Parse.js.map +1 -0
- package/dist/awd2Schema.d.ts +44 -0
- package/dist/awd2Schema.d.ts.map +1 -0
- package/dist/awd2Schema.js +67 -0
- package/dist/awd2Schema.js.map +1 -0
- package/dist/gltfParse.d.ts +9 -0
- package/dist/gltfParse.d.ts.map +1 -0
- package/dist/gltfParse.js +1456 -0
- package/dist/gltfParse.js.map +1 -0
- package/dist/gltfPunctualLights.d.ts +3 -0
- package/dist/gltfPunctualLights.d.ts.map +1 -0
- package/dist/gltfPunctualLights.js +103 -0
- package/dist/gltfPunctualLights.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/md2Parse.d.ts +5 -0
- package/dist/md2Parse.d.ts.map +1 -0
- package/dist/md2Parse.js +408 -0
- package/dist/md2Parse.js.map +1 -0
- package/dist/md2Schema.d.ts +12 -0
- package/dist/md2Schema.d.ts.map +1 -0
- package/dist/md2Schema.js +193 -0
- package/dist/md2Schema.js.map +1 -0
- package/dist/md5AnimParse.d.ts +3 -0
- package/dist/md5AnimParse.d.ts.map +1 -0
- package/dist/md5AnimParse.js +385 -0
- package/dist/md5AnimParse.js.map +1 -0
- package/dist/md5Parse.d.ts +6 -0
- package/dist/md5Parse.d.ts.map +1 -0
- package/dist/md5Parse.js +635 -0
- package/dist/md5Parse.js.map +1 -0
- package/dist/mtlParse.d.ts +3 -0
- package/dist/mtlParse.d.ts.map +1 -0
- package/dist/mtlParse.js +256 -0
- package/dist/mtlParse.js.map +1 -0
- package/dist/objParse.d.ts +5 -0
- package/dist/objParse.d.ts.map +1 -0
- package/dist/objParse.js +464 -0
- package/dist/objParse.js.map +1 -0
- package/dist/sceneSkeleton.d.ts +3 -0
- package/dist/sceneSkeleton.d.ts.map +1 -0
- package/dist/sceneSkeleton.js +34 -0
- package/dist/sceneSkeleton.js.map +1 -0
- package/dist/shared.d.ts +18 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +143 -0
- package/dist/shared.js.map +1 -0
- package/dist/threeDsParse.d.ts +4 -0
- package/dist/threeDsParse.d.ts.map +1 -0
- package/dist/threeDsParse.js +718 -0
- package/dist/threeDsParse.js.map +1 -0
- package/package.json +55 -0
- package/src/awd2Inflate.test.ts +118 -0
- package/src/awd2Parse.test.ts +2431 -0
- package/src/gltfParse.test.ts +2339 -0
- package/src/gltfPunctualLights.test.ts +184 -0
- package/src/gltfTreeShaking.test.ts +45 -0
- package/src/md2Parse.test.ts +1033 -0
- package/src/md5AnimParse.test.ts +673 -0
- package/src/md5Parse.test.ts +1094 -0
- package/src/mtlParse.test.ts +244 -0
- package/src/objParse.test.ts +690 -0
- package/src/sceneSkeleton.test.ts +35 -0
- package/src/shared.test.ts +210 -0
- package/src/threeDsParse.test.ts +1089 -0
package/dist/md2Parse.js
ADDED
|
@@ -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
|