{"dependencies":[{"name":"C:\\mozilla\\buffered-interpolation\\package.json","includedInParent":true,"mtime":1529714238638}],"generated":{"js":"var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar INITIALIZING = 0;\nvar BUFFERING = 1;\nvar PLAYING = 2;\n\nvar MODE_LERP = 0;\nvar MODE_HERMITE = 1;\n\nvar InterpolationBuffer = function () {\n  function InterpolationBuffer() {\n    var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : MODE_LERP;\n    var bufferTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n\n    _classCallCheck(this, InterpolationBuffer);\n\n    this.state = INITIALIZING;\n    this.buffer = [];\n    this.bufferTime = bufferTime * 1000;\n    this.time = 0;\n    this.mode = mode;\n\n    this.originFrame = {\n      position: new THREE.Vector3(),\n      velocity: new THREE.Vector3(),\n      quaternion: new THREE.Quaternion(),\n      scale: new THREE.Vector3(1, 1, 1)\n    };\n\n    this.position = new THREE.Vector3();\n    this.quaternion = new THREE.Quaternion();\n    this.scale = new THREE.Vector3(1, 1, 1);\n  }\n\n  _createClass(InterpolationBuffer, [{\n    key: \"hermite\",\n    value: function hermite(target, t, p1, p2, v1, v2) {\n      var t2 = t * t;\n      var t3 = t * t * t;\n      var a = 2 * t3 - 3 * t2 + 1;\n      var b = -2 * t3 + 3 * t2;\n      var c = t3 - 2 * t2 + t;\n      var d = t3 - t2;\n\n      target.copy(p1.multiplyScalar(a));\n      target.add(p2.multiplyScalar(b));\n      target.add(v1.multiplyScalar(c));\n      target.add(v2.multiplyScalar(d));\n    }\n  }, {\n    key: \"lerp\",\n    value: function lerp(target, v1, v2, alpha) {\n      target.lerpVectors(v1, v2, alpha);\n    }\n  }, {\n    key: \"slerp\",\n    value: function slerp(target, r1, r2, alpha) {\n      THREE.Quaternion.slerp(r1, r2, target, alpha);\n    }\n  }, {\n    key: \"appendBuffer\",\n    value: function appendBuffer(position, velocity, quaternion, scale) {\n      var tail = this.buffer.length > 0 ? this.buffer[this.buffer.length - 1] : null;\n      // update the last entry in the buffer if this is the same frame\n      if (tail && tail.time === this.time) {\n        if (position) {\n          tail.position.copy(position);\n        }\n\n        if (velocity) {\n          tail.velocity.copy(velocity);\n        }\n\n        if (quaternion) {\n          tail.quaternion.copy(quaternion);\n        }\n\n        if (scale) {\n          tail.scale.copy(scale);\n        }\n      } else {\n        var priorFrame = tail || this.originFrame;\n        this.buffer.push({\n          position: position ? position.clone() : priorFrame.position.clone(),\n          velocity: velocity ? velocity.clone() : priorFrame.velocity.clone(),\n          quaternion: quaternion ? quaternion.clone() : priorFrame.quaternion.clone(),\n          scale: scale ? scale.clone() : priorFrame.scale.clone(),\n          time: this.time\n        });\n      }\n    }\n  }, {\n    key: \"setTarget\",\n    value: function setTarget(position, velocity, quaternion, scale) {\n      this.appendBuffer(position, velocity, quaternion, scale);\n    }\n  }, {\n    key: \"setPosition\",\n    value: function setPosition(position, velocity) {\n      this.appendBuffer(position, velocity, null, null);\n    }\n  }, {\n    key: \"setQuaternion\",\n    value: function setQuaternion(quaternion) {\n      this.appendBuffer(null, null, quaternion, null);\n    }\n  }, {\n    key: \"setScale\",\n    value: function setScale(scale) {\n      this.appendBuffer(null, null, null, scale);\n    }\n  }, {\n    key: \"update\",\n    value: function update(delta) {\n      if (this.state === INITIALIZING) {\n        if (this.buffer.length > 0) {\n          this.originFrame = this.buffer.shift();\n          this.position.copy(this.originFrame.position);\n          this.quaternion.copy(this.originFrame.quaternion);\n          this.scale.copy(this.originFrame.scale);\n          this.state = BUFFERING;\n        }\n      }\n\n      if (this.state === BUFFERING) {\n        if (this.buffer.length > 0 && this.time > this.bufferTime) {\n          this.state = PLAYING;\n        }\n      }\n\n      if (this.state === PLAYING) {\n        var mark = this.time - this.bufferTime;\n        //Purge this.buffer of expired frames\n        while (this.buffer.length > 0 && mark > this.buffer[0].time) {\n          //if this is the last frame in the buffer, just update the time and reuse it\n          if (this.buffer.length > 1) {\n            this.originFrame = this.buffer.shift();\n          } else {\n            this.originFrame.position.copy(this.buffer[0].position);\n            this.originFrame.velocity.copy(this.buffer[0].velocity);\n            this.originFrame.quaternion.copy(this.buffer[0].quaternion);\n            this.originFrame.scale.copy(this.buffer[0].scale);\n            this.originFrame.time = this.buffer[0].time;\n            this.buffer[0].time = this.time + delta;\n          }\n        }\n        if (this.buffer.length > 0 && this.buffer[0].time > 0) {\n          var targetFrame = this.buffer[0];\n          var delta_time = targetFrame.time - this.originFrame.time;\n          var alpha = (mark - this.originFrame.time) / delta_time;\n\n          if (this.mode === MODE_LERP) {\n            this.lerp(this.position, this.originFrame.position, targetFrame.position, alpha);\n          } else if (this.mode === MODE_HERMITE) {\n            this.hermite(this.position, alpha, this.originFrame.position, targetFrame.position, this.originFrame.velocity.multiplyScalar(delta_time), targetFrame.velocity.multiplyScalar(delta_time));\n          }\n\n          this.slerp(this.quaternion, this.originFrame.quaternion, targetFrame.quaternion, alpha);\n\n          this.lerp(this.scale, this.originFrame.scale, targetFrame.scale, alpha);\n        }\n      }\n\n      if (this.state !== INITIALIZING) {\n        this.time += delta;\n      }\n    }\n  }, {\n    key: \"getPosition\",\n    value: function getPosition() {\n      return this.position;\n    }\n  }, {\n    key: \"getQuaternion\",\n    value: function getQuaternion() {\n      return this.quaternion;\n    }\n  }, {\n    key: \"getScale\",\n    value: function getScale() {\n      return this.scale;\n    }\n  }]);\n\n  return InterpolationBuffer;\n}();\n\nif (typeof module !== \"undefined\" && typeof module.exports !== \"undefined\") {\n  module.exports = InterpolationBuffer;\n}","map":null},"hash":"3aedb32d642510f18bd1b498e062d59e","cacheData":{"env":{}}}