UNPKG

buffered-interpolation

Version:

A class for handling interpolation of networked THREE.js objects.

1 lines 7.17 kB
{"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":{}}}