(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;
});