(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "three"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("three")); } else { var mod = { exports: {} }; factory(mod.exports, global.three); global.MD2Loader = mod.exports; } })(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _three) { "use strict"; Object.defineProperty(_exports, "__esModule", { value: true }); _exports.MD2Loader = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } Object.defineProperty(subClass, "prototype", { value: Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }), writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var _normalData = [[-0.525731, 0.000000, 0.850651], [-0.442863, 0.238856, 0.864188], [-0.295242, 0.000000, 0.955423], [-0.309017, 0.500000, 0.809017], [-0.162460, 0.262866, 0.951056], [0.000000, 0.000000, 1.000000], [0.000000, 0.850651, 0.525731], [-0.147621, 0.716567, 0.681718], [0.147621, 0.716567, 0.681718], [0.000000, 0.525731, 0.850651], [0.309017, 0.500000, 0.809017], [0.525731, 0.000000, 0.850651], [0.295242, 0.000000, 0.955423], [0.442863, 0.238856, 0.864188], [0.162460, 0.262866, 0.951056], [-0.681718, 0.147621, 0.716567], [-0.809017, 0.309017, 0.500000], [-0.587785, 0.425325, 0.688191], [-0.850651, 0.525731, 0.000000], [-0.864188, 0.442863, 0.238856], [-0.716567, 0.681718, 0.147621], [-0.688191, 0.587785, 0.425325], [-0.500000, 0.809017, 0.309017], [-0.238856, 0.864188, 0.442863], [-0.425325, 0.688191, 0.587785], [-0.716567, 0.681718, -0.147621], [-0.500000, 0.809017, -0.309017], [-0.525731, 0.850651, 0.000000], [0.000000, 0.850651, -0.525731], [-0.238856, 0.864188, -0.442863], [0.000000, 0.955423, -0.295242], [-0.262866, 0.951056, -0.162460], [0.000000, 1.000000, 0.000000], [0.000000, 0.955423, 0.295242], [-0.262866, 0.951056, 0.162460], [0.238856, 0.864188, 0.442863], [0.262866, 0.951056, 0.162460], [0.500000, 0.809017, 0.309017], [0.238856, 0.864188, -0.442863], [0.262866, 0.951056, -0.162460], [0.500000, 0.809017, -0.309017], [0.850651, 0.525731, 0.000000], [0.716567, 0.681718, 0.147621], [0.716567, 0.681718, -0.147621], [0.525731, 0.850651, 0.000000], [0.425325, 0.688191, 0.587785], [0.864188, 0.442863, 0.238856], [0.688191, 0.587785, 0.425325], [0.809017, 0.309017, 0.500000], [0.681718, 0.147621, 0.716567], [0.587785, 0.425325, 0.688191], [0.955423, 0.295242, 0.000000], [1.000000, 0.000000, 0.000000], [0.951056, 0.162460, 0.262866], [0.850651, -0.525731, 0.000000], [0.955423, -0.295242, 0.000000], [0.864188, -0.442863, 0.238856], [0.951056, -0.162460, 0.262866], [0.809017, -0.309017, 0.500000], [0.681718, -0.147621, 0.716567], [0.850651, 0.000000, 0.525731], [0.864188, 0.442863, -0.238856], [0.809017, 0.309017, -0.500000], [0.951056, 0.162460, -0.262866], [0.525731, 0.000000, -0.850651], [0.681718, 0.147621, -0.716567], [0.681718, -0.147621, -0.716567], [0.850651, 0.000000, -0.525731], [0.809017, -0.309017, -0.500000], [0.864188, -0.442863, -0.238856], [0.951056, -0.162460, -0.262866], [0.147621, 0.716567, -0.681718], [0.309017, 0.500000, -0.809017], [0.425325, 0.688191, -0.587785], [0.442863, 0.238856, -0.864188], [0.587785, 0.425325, -0.688191], [0.688191, 0.587785, -0.425325], [-0.147621, 0.716567, -0.681718], [-0.309017, 0.500000, -0.809017], [0.000000, 0.525731, -0.850651], [-0.525731, 0.000000, -0.850651], [-0.442863, 0.238856, -0.864188], [-0.295242, 0.000000, -0.955423], [-0.162460, 0.262866, -0.951056], [0.000000, 0.000000, -1.000000], [0.295242, 0.000000, -0.955423], [0.162460, 0.262866, -0.951056], [-0.442863, -0.238856, -0.864188], [-0.309017, -0.500000, -0.809017], [-0.162460, -0.262866, -0.951056], [0.000000, -0.850651, -0.525731], [-0.147621, -0.716567, -0.681718], [0.147621, -0.716567, -0.681718], [0.000000, -0.525731, -0.850651], [0.309017, -0.500000, -0.809017], [0.442863, -0.238856, -0.864188], [0.162460, -0.262866, -0.951056], [0.238856, -0.864188, -0.442863], [0.500000, -0.809017, -0.309017], [0.425325, -0.688191, -0.587785], [0.716567, -0.681718, -0.147621], [0.688191, -0.587785, -0.425325], [0.587785, -0.425325, -0.688191], [0.000000, -0.955423, -0.295242], [0.000000, -1.000000, 0.000000], [0.262866, -0.951056, -0.162460], [0.000000, -0.850651, 0.525731], [0.000000, -0.955423, 0.295242], [0.238856, -0.864188, 0.442863], [0.262866, -0.951056, 0.162460], [0.500000, -0.809017, 0.309017], [0.716567, -0.681718, 0.147621], [0.525731, -0.850651, 0.000000], [-0.238856, -0.864188, -0.442863], [-0.500000, -0.809017, -0.309017], [-0.262866, -0.951056, -0.162460], [-0.850651, -0.525731, 0.000000], [-0.716567, -0.681718, -0.147621], [-0.716567, -0.681718, 0.147621], [-0.525731, -0.850651, 0.000000], [-0.500000, -0.809017, 0.309017], [-0.238856, -0.864188, 0.442863], [-0.262866, -0.951056, 0.162460], [-0.864188, -0.442863, 0.238856], [-0.809017, -0.309017, 0.500000], [-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.500000, 0.809017], [-0.147621, -0.716567, 0.681718], [-0.425325, -0.688191, 0.587785], [-0.162460, -0.262866, 0.951056], [0.442863, -0.238856, 0.864188], [0.162460, -0.262866, 0.951056], [0.309017, -0.500000, 0.809017], [0.147621, -0.716567, 0.681718], [0.000000, -0.525731, 0.850651], [0.425325, -0.688191, 0.587785], [0.587785, -0.425325, 0.688191], [0.688191, -0.587785, 0.425325], [-0.955423, 0.295242, 0.000000], [-0.951056, 0.162460, 0.262866], [-1.000000, 0.000000, 0.000000], [-0.850651, 0.000000, 0.525731], [-0.955423, -0.295242, 0.000000], [-0.951056, -0.162460, 0.262866], [-0.864188, 0.442863, -0.238856], [-0.951056, 0.162460, -0.262866], [-0.809017, 0.309017, -0.500000], [-0.864188, -0.442863, -0.238856], [-0.951056, -0.162460, -0.262866], [-0.809017, -0.309017, -0.500000], [-0.681718, 0.147621, -0.716567], [-0.681718, -0.147621, -0.716567], [-0.850651, 0.000000, -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]]; var MD2Loader = /*#__PURE__*/function (_Loader) { _inherits(MD2Loader, _Loader); var _super = _createSuper(MD2Loader); function MD2Loader(manager) { _classCallCheck(this, MD2Loader); return _super.call(this, manager); } _createClass(MD2Loader, [{ key: "load", value: function load(url, onLoad, onProgress, onError) { var scope = this; var 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); } }, { key: "parse", value: function parse(buffer) { var data = new DataView(buffer); // http://tfc.duke.free.fr/coding/md2-specs-en.html var header = {}; var 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 (var 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; } // var geometry = new _three.BufferGeometry(); // uvs var uvsTemp = []; var offset = header.offset_st; for (var _i = 0, l = header.num_st; _i < l; _i++) { var u = data.getInt16(offset + 0, true); var v = data.getInt16(offset + 2, true); uvsTemp.push(u / header.skinwidth, 1 - v / header.skinheight); offset += 4; } // triangles offset = header.offset_tris; var vertexIndices = []; var uvIndices = []; for (var _i2 = 0, _l = header.num_tris; _i2 < _l; _i2++) { 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; } // frames var translation = new _three.Vector3(); var scale = new _three.Vector3(); var frames = []; offset = header.offset_frames; for (var _i3 = 0, _l2 = header.num_frames; _i3 < _l2; _i3++) { 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; var string = []; for (var j = 0; j < 16; j++) { var character = data.getUint8(offset + j, true); if (character === 0) break; string[j] = character; } var frame = { name: String.fromCharCode.apply(null, string), vertices: [], normals: [] }; offset += 16; for (var _j = 0; _j < header.num_vertices; _j++) { var x = data.getUint8(offset++, true); var y = data.getUint8(offset++, true); var z = data.getUint8(offset++, true); var 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); // convert to Y-up frame.normals.push(n[0], n[2], n[1]); // convert to Y-up } frames.push(frame); } // static var positions = []; var normals = []; var uvs = []; var verticesTemp = frames[0].vertices; var normalsTemp = frames[0].normals; for (var _i4 = 0, _l3 = vertexIndices.length; _i4 < _l3; _i4++) { var vertexIndex = vertexIndices[_i4]; var stride = vertexIndex * 3; // var _x = verticesTemp[stride]; var _y = verticesTemp[stride + 1]; var _z = verticesTemp[stride + 2]; positions.push(_x, _y, _z); // var nx = normalsTemp[stride]; var ny = normalsTemp[stride + 1]; var nz = normalsTemp[stride + 2]; normals.push(nx, ny, nz); // var uvIndex = uvIndices[_i4]; stride = uvIndex * 2; var _u = uvsTemp[stride]; var _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)); // animation var morphPositions = []; var morphNormals = []; for (var _i5 = 0, _l4 = frames.length; _i5 < _l4; _i5++) { var _frame = frames[_i5]; var attributeName = _frame.name; if (_frame.vertices.length > 0) { var _positions = []; for (var _j2 = 0, jl = vertexIndices.length; _j2 < jl; _j2++) { var _vertexIndex = vertexIndices[_j2]; var _stride = _vertexIndex * 3; var _x2 = _frame.vertices[_stride]; var _y2 = _frame.vertices[_stride + 1]; var _z2 = _frame.vertices[_stride + 2]; _positions.push(_x2, _y2, _z2); } var positionAttribute = new _three.Float32BufferAttribute(_positions, 3); positionAttribute.name = attributeName; morphPositions.push(positionAttribute); } if (_frame.normals.length > 0) { var _normals = []; for (var _j3 = 0, _jl = vertexIndices.length; _j3 < _jl; _j3++) { var _vertexIndex2 = vertexIndices[_j3]; var _stride2 = _vertexIndex2 * 3; var _nx = _frame.normals[_stride2]; var _ny = _frame.normals[_stride2 + 1]; var _nz = _frame.normals[_stride2 + 2]; _normals.push(_nx, _ny, _nz); } var normalAttribute = new _three.Float32BufferAttribute(_normals, 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; } }]); return MD2Loader; }(_three.Loader); _exports.MD2Loader = MD2Loader; });