three-stdlib
Version:
stand-alone library of threejs examples
361 lines (360 loc) • 11.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const THREE = require("three");
const _normalData = [
[-0.525731, 0, 0.850651],
[-0.442863, 0.238856, 0.864188],
[-0.295242, 0, 0.955423],
[-0.309017, 0.5, 0.809017],
[-0.16246, 0.262866, 0.951056],
[ ],
[ ],
[-0.147621, 0.716567, 0.681718],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[-0.681718, 0.147621, 0.716567],
[-0.809017, 0.309017, 0.5],
[-0.587785, 0.425325, 0.688191],
[-0.850651, 0.525731, 0],
[-0.864188, 0.442863, 0.238856],
[-0.716567, 0.681718, 0.147621],
[-0.688191, 0.587785, 0.425325],
[-0.5, 0.809017, 0.309017],
[-0.238856, 0.864188, 0.442863],
[-0.425325, 0.688191, 0.587785],
[-0.716567, 0.681718, -0.147621],
[-0.5, 0.809017, -0.309017],
[-0.525731, 0.850651, 0],
[ ],
[-0.238856, 0.864188, -0.442863],
[ ],
[-0.262866, 0.951056, -0.16246],
[ ],
[ ],
[-0.262866, 0.951056, 0.16246],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[-0.147621, 0.716567, -0.681718],
[-0.309017, 0.5, -0.809017],
[ ],
[-0.525731, 0, -0.850651],
[-0.442863, 0.238856, -0.864188],
[-0.295242, 0, -0.955423],
[-0.16246, 0.262866, -0.951056],
[ ],
[ ],
[ ],
[-0.442863, -0.238856, -0.864188],
[-0.309017, -0.5, -0.809017],
[-0.16246, -0.262866, -0.951056],
[ ],
[-0.147621, -0.716567, -0.681718],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[-0.238856, -0.864188, -0.442863],
[-0.5, -0.809017, -0.309017],
[-0.262866, -0.951056, -0.16246],
[-0.850651, -0.525731, 0],
[-0.716567, -0.681718, -0.147621],
[-0.716567, -0.681718, 0.147621],
[-0.525731, -0.850651, 0],
[-0.5, -0.809017, 0.309017],
[-0.238856, -0.864188, 0.442863],
[-0.262866, -0.951056, 0.16246],
[-0.864188, -0.442863, 0.238856],
[-0.809017, -0.309017, 0.5],
[-0.688191, -0.587785, 0.425325],
[-0.681718, -0.147621, 0.716567],
[-0.442863, -0.238856, 0.864188],
[-0.587785, -0.425325, 0.688191],
[-0.309017, -0.5, 0.809017],
[-0.147621, -0.716567, 0.681718],
[-0.425325, -0.688191, 0.587785],
[-0.16246, -0.262866, 0.951056],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[-0.955423, 0.295242, 0],
[-0.951056, 0.16246, 0.262866],
[-1, 0, 0],
[-0.850651, 0, 0.525731],
[-0.955423, -0.295242, 0],
[-0.951056, -0.16246, 0.262866],
[-0.864188, 0.442863, -0.238856],
[-0.951056, 0.16246, -0.262866],
[-0.809017, 0.309017, -0.5],
[-0.864188, -0.442863, -0.238856],
[-0.951056, -0.16246, -0.262866],
[-0.809017, -0.309017, -0.5],
[-0.681718, 0.147621, -0.716567],
[-0.681718, -0.147621, -0.716567],
[-0.850651, 0, -0.525731],
[-0.688191, 0.587785, -0.425325],
[-0.587785, 0.425325, -0.688191],
[-0.425325, 0.688191, -0.587785],
[-0.425325, -0.688191, -0.587785],
[-0.587785, -0.425325, -0.688191],
[-0.688191, -0.587785, -0.425325]
];
class MD2Loader extends THREE.Loader {
constructor(manager) {
super(manager);
}
load(url, onLoad, onProgress, onError) {
const scope = this;
const loader = new THREE.FileLoader(scope.manager);
loader.setPath(scope.path);
loader.setResponseType("arraybuffer");
loader.setRequestHeader(scope.requestHeader);
loader.setWithCredentials(scope.withCredentials);
loader.load(
url,
function(buffer) {
try {
onLoad(scope.parse(buffer));
} catch (e) {
if (onError) {
onError(e);
} else {
console.error(e);
}
scope.manager.itemError(url);
}
},
onProgress,
onError
);
}
parse(buffer) {
const data = new DataView(buffer);
const header = {};
const headerNames = [
"ident",
"version",
"skinwidth",
"skinheight",
"framesize",
"num_skins",
"num_vertices",
"num_st",
"num_tris",
"num_glcmds",
"num_frames",
"offset_skins",
"offset_st",
"offset_tris",
"offset_frames",
"offset_glcmds",
"offset_end"
];
for (let i = 0; i < headerNames.length; i++) {
header[headerNames[i]] = data.getInt32(i * 4, true);
}
if (header.ident !== 844121161 || header.version !== 8) {
console.error("Not a valid MD2 file");
return;
}
if (header.offset_end !== data.byteLength) {
console.error("Corrupted MD2 file");
return;
}
const geometry = new THREE.BufferGeometry();
const uvsTemp = [];
let offset = header.offset_st;
for (let i = 0, l = header.num_st; i < l; i++) {
const u = data.getInt16(offset + 0, true);
const v = data.getInt16(offset + 2, true);
uvsTemp.push(u / header.skinwidth, 1 - v / header.skinheight);
offset += 4;
}
offset = header.offset_tris;
const vertexIndices = [];
const uvIndices = [];
for (let i = 0, l = header.num_tris; i < l; i++) {
vertexIndices.push(
data.getUint16(offset + 0, true),
data.getUint16(offset + 2, true),
data.getUint16(offset + 4, true)
);
uvIndices.push(
data.getUint16(offset + 6, true),
data.getUint16(offset + 8, true),
data.getUint16(offset + 10, true)
);
offset += 12;
}
const translation = new THREE.Vector3();
const scale = new THREE.Vector3();
const string = [];
const frames = [];
offset = header.offset_frames;
for (let i = 0, l = header.num_frames; i < l; i++) {
scale.set(data.getFloat32(offset + 0, true), data.getFloat32(offset + 4, true), data.getFloat32(offset + 8, true));
translation.set(
data.getFloat32(offset + 12, true),
data.getFloat32(offset + 16, true),
data.getFloat32(offset + 20, true)
);
offset += 24;
for (let j = 0; j < 16; j++) {
const character = data.getUint8(offset + j, true);
if (character === 0)
break;
string[j] = character;
}
const frame = {
name: String.fromCharCode.apply(null, string),
vertices: [],
normals: []
};
offset += 16;
for (let j = 0; j < header.num_vertices; j++) {
let x = data.getUint8(offset++, true);
let y = data.getUint8(offset++, true);
let z = data.getUint8(offset++, true);
const n = _normalData[data.getUint8(offset++, true)];
x = x * scale.x + translation.x;
y = y * scale.y + translation.y;
z = z * scale.z + translation.z;
frame.vertices.push(x, z, y);
frame.normals.push(n[0], n[2], n[1]);
}
frames.push(frame);
}
const positions = [];
const normals = [];
const uvs = [];
const verticesTemp = frames[0].vertices;
const normalsTemp = frames[0].normals;
for (let i = 0, l = vertexIndices.length; i < l; i++) {
const vertexIndex = vertexIndices[i];
let stride = vertexIndex * 3;
const x = verticesTemp[stride];
const y = verticesTemp[stride + 1];
const z = verticesTemp[stride + 2];
positions.push(x, y, z);
const nx = normalsTemp[stride];
const ny = normalsTemp[stride + 1];
const nz = normalsTemp[stride + 2];
normals.push(nx, ny, nz);
const uvIndex = uvIndices[i];
stride = uvIndex * 2;
const u = uvsTemp[stride];
const v = uvsTemp[stride + 1];
uvs.push(u, v);
}
geometry.setAttribute("position", new THREE.Float32BufferAttribute(positions, 3));
geometry.setAttribute("normal", new THREE.Float32BufferAttribute(normals, 3));
geometry.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2));
const morphPositions = [];
const morphNormals = [];
for (let i = 0, l = frames.length; i < l; i++) {
const frame = frames[i];
const attributeName = frame.name;
if (frame.vertices.length > 0) {
const positions2 = [];
for (let j = 0, jl = vertexIndices.length; j < jl; j++) {
const vertexIndex = vertexIndices[j];
const stride = vertexIndex * 3;
const x = frame.vertices[stride];
const y = frame.vertices[stride + 1];
const z = frame.vertices[stride + 2];
positions2.push(x, y, z);
}
const positionAttribute = new THREE.Float32BufferAttribute(positions2, 3);
positionAttribute.name = attributeName;
morphPositions.push(positionAttribute);
}
if (frame.normals.length > 0) {
const normals2 = [];
for (let j = 0, jl = vertexIndices.length; j < jl; j++) {
const vertexIndex = vertexIndices[j];
const stride = vertexIndex * 3;
const nx = frame.normals[stride];
const ny = frame.normals[stride + 1];
const nz = frame.normals[stride + 2];
normals2.push(nx, ny, nz);
}
const normalAttribute = new THREE.Float32BufferAttribute(normals2, 3);
normalAttribute.name = attributeName;
morphNormals.push(normalAttribute);
}
}
geometry.morphAttributes.position = morphPositions;
geometry.morphAttributes.normal = morphNormals;
geometry.morphTargetsRelative = false;
geometry.animations = THREE.AnimationClip.CreateClipsFromMorphTargetSequences(frames, 10);
return geometry;
}
}
exports.MD2Loader = MD2Loader;
//# sourceMappingURL=MD2Loader.cjs.map