(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.XRHandPrimitiveModel = mod.exports;
  }
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _three) {
  "use strict";

  Object.defineProperty(_exports, "__esModule", {
    value: true
  });
  _exports.XRHandPrimitiveModel = 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; }

  var _matrix = new _three.Matrix4();

  var _vector = new _three.Vector3();

  var XRHandPrimitiveModel = /*#__PURE__*/function () {
    function XRHandPrimitiveModel(handModel, controller, path, handedness, options) {
      _classCallCheck(this, XRHandPrimitiveModel);

      this.controller = controller;
      this.handModel = handModel;
      this.envMap = null;
      var geometry;

      if (!options || !options.primitive || options.primitive === 'sphere') {
        geometry = new _three.SphereGeometry(1, 10, 10);
      } else if (options.primitive === 'box') {
        geometry = new _three.BoxGeometry(1, 1, 1);
      }

      var material = new _three.MeshStandardMaterial();
      this.handMesh = new _three.InstancedMesh(geometry, material, 30);
      this.handMesh.instanceMatrix.setUsage(_three.DynamicDrawUsage); // will be updated every frame

      this.handMesh.castShadow = true;
      this.handMesh.receiveShadow = true;
      this.handModel.add(this.handMesh);
      this.joints = ['wrist', 'thumb-metacarpal', 'thumb-phalanx-proximal', 'thumb-phalanx-distal', 'thumb-tip', 'index-finger-metacarpal', 'index-finger-phalanx-proximal', 'index-finger-phalanx-intermediate', 'index-finger-phalanx-distal', 'index-finger-tip', 'middle-finger-metacarpal', 'middle-finger-phalanx-proximal', 'middle-finger-phalanx-intermediate', 'middle-finger-phalanx-distal', 'middle-finger-tip', 'ring-finger-metacarpal', 'ring-finger-phalanx-proximal', 'ring-finger-phalanx-intermediate', 'ring-finger-phalanx-distal', 'ring-finger-tip', 'pinky-finger-metacarpal', 'pinky-finger-phalanx-proximal', 'pinky-finger-phalanx-intermediate', 'pinky-finger-phalanx-distal', 'pinky-finger-tip'];
    }

    _createClass(XRHandPrimitiveModel, [{
      key: "updateMesh",
      value: function updateMesh() {
        var defaultRadius = 0.008;
        var joints = this.controller.joints;
        var count = 0;

        for (var i = 0; i < this.joints.length; i++) {
          var joint = joints[this.joints[i]];

          if (joint.visible) {
            _vector.setScalar(joint.jointRadius || defaultRadius);

            _matrix.compose(joint.position, joint.quaternion, _vector);

            this.handMesh.setMatrixAt(i, _matrix);
            count++;
          }
        }

        this.handMesh.count = count;
        this.handMesh.instanceMatrix.needsUpdate = true;
      }
    }]);

    return XRHandPrimitiveModel;
  }();

  _exports.XRHandPrimitiveModel = XRHandPrimitiveModel;
});