From 4796f2fd5c67bc05a3aaae935fdeb17cd9508334 Mon Sep 17 00:00:00 2001 From: Hacksore Date: Sun, 4 Feb 2018 10:15:43 -0600 Subject: [PATCH 1/7] Updated gh-pages to the latest codebase and refactored the folder structure --- .babelrc | 20 - .eslintrc.js | 43 - .gitignore | 2 + .npmignore | 25 - .travis.yml | 7 - examples/hd.html | 55 + examples/javascript.html | 54 + examples/jquery.html | 58 + img/1_8_texturemap_redux.png | Bin 0 -> 3684 bytes img/Hacksore.png | Bin 0 -> 689 bytes img/cape.png | Bin 0 -> 589 bytes img/hatsune_miku.png | Bin 0 -> 3392 bytes img/ironman_hd.png | Bin 0 -> 112016 bytes img/mojang_cape.png | Bin 0 -> 1076 bytes index.html | 68 + js/skinview3d.js | 1252 ++++++++++++ js/skinview3d.js.map | 1 + js/skinview3d.min.js | 61 + js/skinview3d.min.js.map | 1 + js/skinview3d.module.js | 1238 ++++++++++++ js/skinview3d.module.js.map | 1 + package-lock.json | 3590 ---------------------------------- package.json | 36 - src/animation.js | 71 - src/model.js | 333 ---- src/orbit_controls.js | 596 ------ src/skinview3d.js | 28 - src/viewer.js | 245 --- tools/rollup-util.js | 63 - tools/rollup.browser.js | 7 - tools/rollup.browser.min.js | 7 - tools/rollup.module.js | 7 - 32 files changed, 2791 insertions(+), 5078 deletions(-) delete mode 100644 .babelrc delete mode 100644 .eslintrc.js delete mode 100644 .npmignore delete mode 100644 .travis.yml create mode 100644 examples/hd.html create mode 100644 examples/javascript.html create mode 100644 examples/jquery.html create mode 100644 img/1_8_texturemap_redux.png create mode 100644 img/Hacksore.png create mode 100644 img/cape.png create mode 100644 img/hatsune_miku.png create mode 100644 img/ironman_hd.png create mode 100644 img/mojang_cape.png create mode 100644 index.html create mode 100644 js/skinview3d.js create mode 100644 js/skinview3d.js.map create mode 100644 js/skinview3d.min.js create mode 100644 js/skinview3d.min.js.map create mode 100644 js/skinview3d.module.js create mode 100644 js/skinview3d.module.js.map delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 src/animation.js delete mode 100644 src/model.js delete mode 100644 src/orbit_controls.js delete mode 100644 src/skinview3d.js delete mode 100644 src/viewer.js delete mode 100644 tools/rollup-util.js delete mode 100644 tools/rollup.browser.js delete mode 100644 tools/rollup.browser.min.js delete mode 100644 tools/rollup.module.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 93c08e6..0000000 --- a/.babelrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "presets": [ - [ - "env", - { - "targets": { - "browsers": [ - "> 1%", - "last 2 versions", - "not ie <= 8" - ] - }, - "modules": false - } - ] - ], - "plugins": [ - "external-helpers" - ] -} diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 2543be5..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,43 +0,0 @@ -module.exports = { - "env": { - "browser": true, - "es6": true - }, - "extends": "eslint:recommended", - "parserOptions": { - "sourceType": "module" - }, - "rules": { - "indent": [ - "warn", - "tab", - { - "SwitchCase": 1 - } - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ], - "no-console": [ - "error", - { - allow: ["warn", "error"] - } - ], - "no-unused-vars": [ - "error", - { - "args": "none" - } - ] - } -}; diff --git a/.gitignore b/.gitignore index 6e91366..0ec4966 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ typings/ build/ _ignore/ + +package.json.lock \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index a6ad2da..0000000 --- a/.npmignore +++ /dev/null @@ -1,25 +0,0 @@ -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pids -*.pid -*.seed -*.pid.lock -lib-cov -coverage -.nyc_output -.grunt -bower_components -.lock-wscript -node_modules/ -jspm_packages/ -typings/ -.npm -.eslintcache -.node_repl_history -*.tgz -.yarn-integrity -.env -_ignore/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1e7bd5d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -sudo: false -language: node_js -node_js: - - '9' -cache: - directories: - - node_modules diff --git a/examples/hd.html b/examples/hd.html new file mode 100644 index 0000000..e6dfb5c --- /dev/null +++ b/examples/hd.html @@ -0,0 +1,55 @@ + + + + + skinpreview3d.js example using jQuery + + + + +

HD

+
+ + + + + + + \ No newline at end of file diff --git a/examples/javascript.html b/examples/javascript.html new file mode 100644 index 0000000..6f012b6 --- /dev/null +++ b/examples/javascript.html @@ -0,0 +1,54 @@ + + + + + skinpreview3d.js example using pure javascript + + + +

pure javascript

+
+ + + + + + \ No newline at end of file diff --git a/examples/jquery.html b/examples/jquery.html new file mode 100644 index 0000000..ce57336 --- /dev/null +++ b/examples/jquery.html @@ -0,0 +1,58 @@ + + + + + skinpreview3d.js example using jQuery + + + + +

jQuery

+
+ + + + + + + + + \ No newline at end of file diff --git a/img/1_8_texturemap_redux.png b/img/1_8_texturemap_redux.png new file mode 100644 index 0000000000000000000000000000000000000000..a206b32da79d2a1be3de8e29425fc1a2f38ea7b2 GIT binary patch literal 3684 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 bb|MwuC2koE{GFzl00000NkvXXu0mjfv5ogm literal 0 HcmV?d00001 diff --git a/img/hatsune_miku.png b/img/hatsune_miku.png new file mode 100644 index 0000000000000000000000000000000000000000..d4349469dda5810e8e344720b6811d28f1a91bc0 GIT binary patch literal 3392 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 + + + + skinpreview3d.js examples + + + + + + + + jQuery + + + Native javascript + + + + HD Skin + + + + + + \ No newline at end of file diff --git a/js/skinview3d.js b/js/skinview3d.js new file mode 100644 index 0000000..cbb830d --- /dev/null +++ b/js/skinview3d.js @@ -0,0 +1,1252 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('three')) : + typeof define === 'function' && define.amd ? define(['exports', 'three'], factory) : + (factory((global.skinview3d = {}),global.THREE)); +}(this, (function (exports,THREE) { 'use strict'; + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + 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; + }; + }(); + + + + + + + + + + var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + }; + + + + + + + + + + + + var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + }; + + function toFaceVertices(x1, y1, x2, y2, w, h) { + return [new THREE.Vector2(x1 / w, 1.0 - y2 / h), new THREE.Vector2(x2 / w, 1.0 - y2 / h), new THREE.Vector2(x2 / w, 1.0 - y1 / h), new THREE.Vector2(x1 / w, 1.0 - y1 / h)]; + } + + function toSkinVertices(x1, y1, x2, y2) { + return toFaceVertices(x1, y1, x2, y2, 64.0, 64.0); + } + + function toCapeVertices(x1, y1, x2, y2) { + return toFaceVertices(x1, y1, x2, y2, 64.0, 32.0); + } + + function addVertices(box, top, bottom, left, front, right, back) { + box.faceVertexUvs[0] = []; + box.faceVertexUvs[0][0] = [right[3], right[0], right[2]]; + box.faceVertexUvs[0][1] = [right[0], right[1], right[2]]; + box.faceVertexUvs[0][2] = [left[3], left[0], left[2]]; + box.faceVertexUvs[0][3] = [left[0], left[1], left[2]]; + box.faceVertexUvs[0][4] = [top[3], top[0], top[2]]; + box.faceVertexUvs[0][5] = [top[0], top[1], top[2]]; + box.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]]; + box.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]]; + box.faceVertexUvs[0][8] = [front[3], front[0], front[2]]; + box.faceVertexUvs[0][9] = [front[0], front[1], front[2]]; + box.faceVertexUvs[0][10] = [back[3], back[0], back[2]]; + box.faceVertexUvs[0][11] = [back[0], back[1], back[2]]; + } + + var esp = 0.002; + + var SkinObject = function (_THREE$Group) { + inherits(SkinObject, _THREE$Group); + + function SkinObject(isSlim, layer1Material, layer2Material) { + classCallCheck(this, SkinObject); + + // Head + var _this = possibleConstructorReturn(this, (SkinObject.__proto__ || Object.getPrototypeOf(SkinObject)).call(this)); + + _this.head = new THREE.Group(); + + var headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0); + addVertices(headBox, toSkinVertices(8, 0, 16, 8), toSkinVertices(16, 0, 24, 8), toSkinVertices(0, 8, 8, 16), toSkinVertices(8, 8, 16, 16), toSkinVertices(16, 8, 24, 16), toSkinVertices(24, 8, 32, 16)); + var headMesh = new THREE.Mesh(headBox, layer1Material); + _this.head.add(headMesh); + + var head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0); + addVertices(head2Box, toSkinVertices(40, 0, 48, 8), toSkinVertices(48, 0, 56, 8), toSkinVertices(32, 8, 40, 16), toSkinVertices(40, 8, 48, 16), toSkinVertices(48, 8, 56, 16), toSkinVertices(56, 8, 64, 16)); + var head2Mesh = new THREE.Mesh(head2Box, layer2Material); + head2Mesh.renderOrder = -1; + _this.head.add(head2Mesh); + + _this.add(_this.head); + + // Body + _this.body = new THREE.Group(); + + var bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0); + addVertices(bodyBox, toSkinVertices(20, 16, 28, 20), toSkinVertices(28, 16, 36, 20), toSkinVertices(16, 20, 20, 32), toSkinVertices(20, 20, 28, 32), toSkinVertices(28, 20, 32, 32), toSkinVertices(32, 20, 40, 32)); + var bodyMesh = new THREE.Mesh(bodyBox, layer1Material); + _this.body.add(bodyMesh); + + var body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0); + addVertices(body2Box, toSkinVertices(20, 32, 28, 36), toSkinVertices(28, 32, 36, 36), toSkinVertices(16, 36, 20, 48), toSkinVertices(20, 36, 28, 48), toSkinVertices(28, 36, 32, 48), toSkinVertices(32, 36, 40, 48)); + var body2Mesh = new THREE.Mesh(body2Box, layer2Material); + _this.body.add(body2Mesh); + + _this.body.position.y = -10; + _this.add(_this.body); + + // Right Arm + _this.rightArm = new THREE.Group(); + var rightArmPivot = new THREE.Group(); + + var rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); + if (isSlim) { + addVertices(rightArmBox, toSkinVertices(44, 16, 47, 20), toSkinVertices(47, 16, 50, 20), toSkinVertices(40, 20, 44, 32), toSkinVertices(44, 20, 47, 32), toSkinVertices(47, 20, 51, 32), toSkinVertices(51, 20, 54, 32)); + } else { + addVertices(rightArmBox, toSkinVertices(44, 16, 48, 20), toSkinVertices(48, 16, 52, 20), toSkinVertices(40, 20, 44, 32), toSkinVertices(44, 20, 48, 32), toSkinVertices(48, 20, 52, 32), toSkinVertices(52, 20, 56, 32)); + } + var rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material); + rightArmPivot.add(rightArmMesh); + + var rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + if (isSlim) { + addVertices(rightArm2Box, toSkinVertices(44, 32, 47, 36), toSkinVertices(47, 32, 50, 36), toSkinVertices(40, 36, 44, 48), toSkinVertices(44, 36, 47, 48), toSkinVertices(47, 36, 51, 48), toSkinVertices(51, 36, 54, 48)); + } else { + addVertices(rightArm2Box, toSkinVertices(44, 32, 48, 36), toSkinVertices(48, 32, 52, 36), toSkinVertices(40, 36, 44, 48), toSkinVertices(44, 36, 48, 48), toSkinVertices(48, 36, 52, 48), toSkinVertices(52, 36, 56, 48)); + } + var rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material); + rightArm2Mesh.renderOrder = 1; + rightArmPivot.add(rightArm2Mesh); + + rightArmPivot.position.y = -6; + _this.rightArm.add(rightArmPivot); + _this.rightArm.position.y = -4; + _this.rightArm.position.x = isSlim ? -5.5 : -6; + _this.add(_this.rightArm); + + // Left Arm + _this.leftArm = new THREE.Group(); + var leftArmPivot = new THREE.Group(); + + var leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); + if (isSlim) { + addVertices(leftArmBox, toSkinVertices(36, 48, 39, 52), toSkinVertices(39, 48, 42, 52), toSkinVertices(32, 52, 36, 64), toSkinVertices(36, 52, 39, 64), toSkinVertices(39, 52, 43, 64), toSkinVertices(43, 52, 46, 64)); + } else { + addVertices(leftArmBox, toSkinVertices(36, 48, 40, 52), toSkinVertices(40, 48, 44, 52), toSkinVertices(32, 52, 36, 64), toSkinVertices(36, 52, 40, 64), toSkinVertices(40, 52, 44, 64), toSkinVertices(44, 52, 48, 64)); + } + var leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material); + leftArmPivot.add(leftArmMesh); + + var leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + if (isSlim) { + addVertices(leftArm2Box, toSkinVertices(52, 48, 55, 52), toSkinVertices(55, 48, 58, 52), toSkinVertices(48, 52, 52, 64), toSkinVertices(52, 52, 55, 64), toSkinVertices(55, 52, 59, 64), toSkinVertices(59, 52, 62, 64)); + } else { + addVertices(leftArm2Box, toSkinVertices(52, 48, 56, 52), toSkinVertices(56, 48, 60, 52), toSkinVertices(48, 52, 52, 64), toSkinVertices(52, 52, 56, 64), toSkinVertices(56, 52, 60, 64), toSkinVertices(60, 52, 64, 64)); + } + var leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material); + leftArm2Mesh.renderOrder = 1; + leftArmPivot.add(leftArm2Mesh); + + leftArmPivot.position.y = -6; + _this.leftArm.add(leftArmPivot); + _this.leftArm.position.y = -4; + _this.leftArm.position.x = isSlim ? 5.5 : 6; + _this.add(_this.leftArm); + + // Right Leg + _this.rightLeg = new THREE.Group(); + var rightLegPivot = new THREE.Group(); + + var rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0); + addVertices(rightLegBox, toSkinVertices(4, 16, 8, 20), toSkinVertices(8, 16, 12, 20), toSkinVertices(0, 20, 4, 32), toSkinVertices(4, 20, 8, 32), toSkinVertices(8, 20, 12, 32), toSkinVertices(12, 20, 16, 32)); + var rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material); + rightLegPivot.add(rightLegMesh); + + var rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + addVertices(rightLeg2Box, toSkinVertices(4, 32, 8, 36), toSkinVertices(8, 32, 12, 36), toSkinVertices(0, 36, 4, 48), toSkinVertices(4, 36, 8, 48), toSkinVertices(8, 36, 12, 48), toSkinVertices(12, 36, 16, 48)); + var rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material); + rightLeg2Mesh.renderOrder = 1; + rightLegPivot.add(rightLeg2Mesh); + + rightLegPivot.position.y = -6; + _this.rightLeg.add(rightLegPivot); + _this.rightLeg.position.y = -16; + _this.rightLeg.position.x = -2; + _this.add(_this.rightLeg); + + // Left Leg + _this.leftLeg = new THREE.Group(); + var leftLegPivot = new THREE.Group(); + + var leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0); + addVertices(leftLegBox, toSkinVertices(20, 48, 24, 52), toSkinVertices(24, 48, 28, 52), toSkinVertices(16, 52, 20, 64), toSkinVertices(20, 52, 24, 64), toSkinVertices(24, 52, 28, 64), toSkinVertices(28, 52, 32, 64)); + var leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material); + leftLegPivot.add(leftLegMesh); + + var leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + addVertices(leftLeg2Box, toSkinVertices(4, 48, 8, 52), toSkinVertices(8, 48, 12, 52), toSkinVertices(0, 52, 4, 64), toSkinVertices(4, 52, 8, 64), toSkinVertices(8, 52, 12, 64), toSkinVertices(12, 52, 16, 64)); + var leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material); + leftLeg2Mesh.renderOrder = 1; + leftLegPivot.add(leftLeg2Mesh); + + leftLegPivot.position.y = -6; + _this.leftLeg.add(leftLegPivot); + _this.leftLeg.position.y = -16; + _this.leftLeg.position.x = 2; + _this.add(_this.leftLeg); + return _this; + } + + return SkinObject; + }(THREE.Group); + + var CapeObject = function (_THREE$Group2) { + inherits(CapeObject, _THREE$Group2); + + function CapeObject(capeMaterial) { + classCallCheck(this, CapeObject); + + // back = outside + // front = inside + var _this2 = possibleConstructorReturn(this, (CapeObject.__proto__ || Object.getPrototypeOf(CapeObject)).call(this)); + + var capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0); + addVertices(capeBox, toCapeVertices(1, 0, 11, 1), toCapeVertices(11, 0, 21, 1), toCapeVertices(11, 1, 12, 17), toCapeVertices(12, 1, 22, 17), toCapeVertices(0, 1, 1, 17), toCapeVertices(1, 1, 11, 17)); + _this2.cape = new THREE.Mesh(capeBox, capeMaterial); + _this2.cape.position.y = -8; + _this2.cape.position.z = -0.5; + _this2.add(_this2.cape); + return _this2; + } + + return CapeObject; + }(THREE.Group); + + var PlayerObject = function (_THREE$Group3) { + inherits(PlayerObject, _THREE$Group3); + + function PlayerObject(slim, layer1Material, layer2Material, capeMaterial) { + classCallCheck(this, PlayerObject); + + var _this3 = possibleConstructorReturn(this, (PlayerObject.__proto__ || Object.getPrototypeOf(PlayerObject)).call(this)); + + _this3.slim = slim; + + _this3.skin = new SkinObject(slim, layer1Material, layer2Material); + _this3.skin.visible = false; + _this3.add(_this3.skin); + + _this3.cape = new CapeObject(capeMaterial); + _this3.cape.position.z = -2; + _this3.cape.position.y = -4; + _this3.cape.rotation.x = 25 * Math.PI / 180; + _this3.cape.visible = false; + _this3.add(_this3.cape); + return _this3; + } + + return PlayerObject; + }(THREE.Group); + + var OrbitControls = function (_THREE$EventDispatche) { + inherits(OrbitControls, _THREE$EventDispatche); + + /** + * @preserve + * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js + */ + /** + * @license + * Copyright (C) 2010-2017 three.js authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + + // This set of controls performs orbiting, dollying (zooming), and panning. + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finger swipe + + function OrbitControls(object, domElement) { + classCallCheck(this, OrbitControls); + + var _this = possibleConstructorReturn(this, (OrbitControls.__proto__ || Object.getPrototypeOf(OrbitControls)).call(this)); + + _this.object = object; + _this.domElement = domElement !== undefined ? domElement : document; + + // Set to false to disable this control + _this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + _this.target = new THREE.Vector3(); + + // How far you can dolly in and out (PerspectiveCamera only) + _this.minDistance = 0; + _this.maxDistance = Infinity; + + // How far you can zoom in and out (OrthographicCamera only) + _this.minZoom = 0; + _this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + _this.minPolarAngle = 0; // radians + _this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + _this.minAzimuthAngle = -Infinity; // radians + _this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + _this.enableDamping = false; + _this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + _this.enableZoom = true; + _this.zoomSpeed = 1.0; + + // Set to false to disable rotating + _this.enableRotate = true; + _this.rotateSpeed = 1.0; + + // Set to false to disable panning + _this.enablePan = true; + _this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + _this.autoRotate = false; + _this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + _this.enableKeys = true; + + // The four arrow keys + _this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + _this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + _this.target0 = _this.target.clone(); + _this.position0 = _this.object.position.clone(); + _this.zoom0 = _this.object.zoom; + + // + // public methods + // + _this.getPolarAngle = function () { + return spherical.phi; + }; + _this.getAzimuthalAngle = function () { + return spherical.theta; + }; + _this.saveState = function () { + scope.target0.copy(scope.target); + scope.position0.copy(scope.object.position); + scope.zoom0 = scope.object.zoom; + }; + _this.reset = function () { + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + scope.object.updateProjectionMatrix(); + scope.dispatchEvent(changeEvent); + scope.update(); + state = STATE.NONE; + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + _this.update = function () { + var offset = new THREE.Vector3(); + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0)); + var quatInverse = quat.clone().inverse(); + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + return function update() { + var position = scope.object.position; + offset.copy(position).sub(scope.target); + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + // angle from z-axis around y-axis + spherical.setFromVector3(offset); + if (scope.autoRotate && state === STATE.NONE) { + rotateLeft(getAutoRotationAngle()); + } + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + // restrict theta to be between desired limits + spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); + // restrict phi to be between desired limits + spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); + spherical.makeSafe(); + spherical.radius *= scale; + // restrict radius to be between desired limits + spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); + // move target to panned location + scope.target.add(panOffset); + offset.setFromSpherical(spherical); + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + position.copy(scope.target).add(offset); + scope.object.lookAt(scope.target); + if (scope.enableDamping === true) { + sphericalDelta.theta *= 1 - scope.dampingFactor; + sphericalDelta.phi *= 1 - scope.dampingFactor; + } else { + sphericalDelta.set(0, 0, 0); + } + scale = 1; + panOffset.set(0, 0, 0); + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { + scope.dispatchEvent(changeEvent); + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + return true; + } + return false; + }; + }(); + _this.dispose = function () { + scope.domElement.removeEventListener("contextmenu", onContextMenu, false); + scope.domElement.removeEventListener("mousedown", onMouseDown, false); + scope.domElement.removeEventListener("wheel", onMouseWheel, false); + scope.domElement.removeEventListener("touchstart", onTouchStart, false); + scope.domElement.removeEventListener("touchend", onTouchEnd, false); + scope.domElement.removeEventListener("touchmove", onTouchMove, false); + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + window.removeEventListener("keydown", onKeyDown, false); + //scope.dispatchEvent({ type: "dispose" }); // should this be added here? + }; + // + // internals + // + var scope = _this; + var changeEvent = { type: "change" }; + var startEvent = { type: "start" }; + var endEvent = { type: "end" }; + var STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; + var state = STATE.NONE; + var EPS = 0.000001; + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + function getAutoRotationAngle() { + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + } + function getZoomScale() { + return Math.pow(0.95, scope.zoomSpeed); + } + function rotateLeft(angle) { + sphericalDelta.theta -= angle; + } + function rotateUp(angle) { + sphericalDelta.phi -= angle; + } + var panLeft = function () { + var v = new THREE.Vector3(); + return function panLeft(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + v.multiplyScalar(-distance); + panOffset.add(v); + }; + }(); + var panUp = function () { + var v = new THREE.Vector3(); + return function panUp(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix + v.multiplyScalar(distance); + panOffset.add(v); + }; + }(); + // deltaX and deltaY are in pixels; right and down are positive + var pan = function () { + var offset = new THREE.Vector3(); + return function pan(deltaX, deltaY) { + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + if (scope.object instanceof THREE.PerspectiveCamera) { + // perspective + var position = scope.object.position; + offset.copy(position).sub(scope.target); + var targetDistance = offset.length(); + // half of the fov is center to top of screen + targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0); + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); + } else if (scope.object instanceof THREE.OrthographicCamera) { + // orthographic + panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); + panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); + } else { + // camera neither orthographic nor perspective + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); + scope.enablePan = false; + } + }; + }(); + function dollyIn(dollyScale) { + if (scope.object instanceof THREE.PerspectiveCamera) { + scale /= dollyScale; + } else if (scope.object instanceof THREE.OrthographicCamera) { + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); + scope.enableZoom = false; + } + } + function dollyOut(dollyScale) { + if (scope.object instanceof THREE.PerspectiveCamera) { + scale *= dollyScale; + } else if (scope.object instanceof THREE.OrthographicCamera) { + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); + scope.enableZoom = false; + } + } + // + // event callbacks - update the object state + // + function handleMouseDownRotate(event) { + rotateStart.set(event.clientX, event.clientY); + } + function handleMouseDownDolly(event) { + dollyStart.set(event.clientX, event.clientY); + } + function handleMouseDownPan(event) { + panStart.set(event.clientX, event.clientY); + } + function handleMouseMoveRotate(event) { + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + // rotating across whole screen goes 360 degrees around + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + rotateStart.copy(rotateEnd); + scope.update(); + } + function handleMouseMoveDolly(event) { + dollyEnd.set(event.clientX, event.clientY); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) { + dollyIn(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyOut(getZoomScale()); + } + dollyStart.copy(dollyEnd); + scope.update(); + } + function handleMouseMovePan(event) { + panEnd.set(event.clientX, event.clientY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + scope.update(); + } + function handleMouseWheel(event) { + if (event.deltaY < 0) { + dollyOut(getZoomScale()); + } else if (event.deltaY > 0) { + dollyIn(getZoomScale()); + } + scope.update(); + } + function handleKeyDown(event) { + switch (event.keyCode) { + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + scope.update(); + break; + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + scope.update(); + break; + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + scope.update(); + break; + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + scope.update(); + break; + } + } + function handleTouchStartRotate(event) { + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + function handleTouchStartDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyStart.set(0, distance); + } + function handleTouchStartPan(event) { + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + function handleTouchMoveRotate(event) { + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + rotateStart.copy(rotateEnd); + scope.update(); + } + function handleTouchMoveDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyEnd.set(0, distance); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) { + dollyOut(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyIn(getZoomScale()); + } + dollyStart.copy(dollyEnd); + scope.update(); + } + function handleTouchMovePan(event) { + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + scope.update(); + } + function onMouseDown(event) { + if (scope.enabled === false) return; + switch (event.button) { + case scope.mouseButtons.ORBIT: + if (scope.enableRotate === false) return; + handleMouseDownRotate(event); + state = STATE.ROTATE; + break; + case scope.mouseButtons.ZOOM: + if (scope.enableZoom === false) return; + handleMouseDownDolly(event); + state = STATE.DOLLY; + break; + case scope.mouseButtons.PAN: + if (scope.enablePan === false) return; + handleMouseDownPan(event); + state = STATE.PAN; + break; + } + event.preventDefault(); + if (state !== STATE.NONE) { + document.addEventListener("mousemove", onMouseMove, false); + document.addEventListener("mouseup", onMouseUp, false); + scope.dispatchEvent(startEvent); + } + } + function onMouseMove(event) { + if (scope.enabled === false) return; + switch (state) { + case STATE.ROTATE: + if (scope.enableRotate === false) return; + handleMouseMoveRotate(event); + break; + case STATE.DOLLY: + if (scope.enableZoom === false) return; + handleMouseMoveDolly(event); + break; + case STATE.PAN: + if (scope.enablePan === false) return; + handleMouseMovePan(event); + break; + } + event.preventDefault(); + } + function onMouseUp(event) { + if (scope.enabled === false) return; + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + scope.dispatchEvent(endEvent); + state = STATE.NONE; + } + function onMouseWheel(event) { + if (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE && state !== STATE.ROTATE) return; + event.preventDefault(); + event.stopPropagation(); + handleMouseWheel(event); + scope.dispatchEvent(startEvent); // not sure why these are here... + scope.dispatchEvent(endEvent); + } + function onKeyDown(event) { + if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return; + handleKeyDown(event); + } + function onTouchStart(event) { + if (scope.enabled === false) return; + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (scope.enableRotate === false) return; + handleTouchStartRotate(event); + state = STATE.TOUCH_ROTATE; + break; + case 2: + // two-fingered touch: dolly + if (scope.enableZoom === false) return; + handleTouchStartDolly(event); + state = STATE.TOUCH_DOLLY; + break; + case 3: + // three-fingered touch: pan + if (scope.enablePan === false) return; + handleTouchStartPan(event); + state = STATE.TOUCH_PAN; + break; + default: + state = STATE.NONE; + } + if (state !== STATE.NONE) { + scope.dispatchEvent(startEvent); + } + } + function onTouchMove(event) { + if (scope.enabled === false) return; + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (scope.enableRotate === false) return; + if (state !== STATE.TOUCH_ROTATE) return; // is this needed?... + handleTouchMoveRotate(event); + break; + case 2: + // two-fingered touch: dolly + if (scope.enableZoom === false) return; + if (state !== STATE.TOUCH_DOLLY) return; // is this needed?... + handleTouchMoveDolly(event); + break; + case 3: + // three-fingered touch: pan + if (scope.enablePan === false) return; + if (state !== STATE.TOUCH_PAN) return; // is this needed?... + handleTouchMovePan(event); + break; + default: + state = STATE.NONE; + } + event.preventDefault(); + event.stopPropagation(); + } + function onTouchEnd(event) { + if (scope.enabled === false) return; + scope.dispatchEvent(endEvent); + state = STATE.NONE; + } + function onContextMenu(event) { + if (scope.enabled === false || scope.enablePan === false) return; + event.preventDefault(); + } + // + scope.domElement.addEventListener("contextmenu", onContextMenu, false); + scope.domElement.addEventListener("mousedown", onMouseDown, false); + scope.domElement.addEventListener("wheel", onMouseWheel, false); + scope.domElement.addEventListener("touchstart", onTouchStart, false); + scope.domElement.addEventListener("touchend", onTouchEnd, false); + scope.domElement.addEventListener("touchmove", onTouchMove, false); + window.addEventListener("keydown", onKeyDown, false); + // force an update at start + _this.update(); + return _this; + } + + return OrbitControls; + }(THREE.EventDispatcher); + + function invokeAnimation(animation, player, time) { + if (animation instanceof CompositeAnimation) { + animation.play(player, time); + } else if (animation instanceof Function) { + animation(player, time); + } else { + throw "Not an animation: " + animation; + } + } + + var AnimationHandle = function () { + function AnimationHandle(animation) { + classCallCheck(this, AnimationHandle); + + this.animation = animation; + this.paused = this._paused = false; + this.speed = this._speed = 1.0; + this._lastChange = null; + this._lastChangeX = null; + } + + createClass(AnimationHandle, [{ + key: "play", + value: function play(player, time) { + if (this._lastChange === null) { + this._lastChange = time; + this._lastChangeX = 0; + } else if (this.paused !== this._paused || this.speed !== this._speed) { + var dt = time - this._lastChange; + if (this._paused === false) { + this._lastChangeX += dt * this._speed; + } + this._paused = this.paused; + this._speed = this.speed; + this._lastChange = time; + } + if (this.paused === false) { + var _dt = time - this._lastChange; + var x = this._lastChangeX + this.speed * _dt; + invokeAnimation(this.animation, player, x); + } + } + }, { + key: "reset", + value: function reset() { + this._lastChange = null; + } + }]); + return AnimationHandle; + }(); + + var CompositeAnimation = function () { + function CompositeAnimation() { + classCallCheck(this, CompositeAnimation); + + this.handles = new Set(); + } + + createClass(CompositeAnimation, [{ + key: "add", + value: function add(animation) { + var _this = this; + + var handle = new AnimationHandle(animation); + handle.remove = function () { + return _this.handles.delete(handle); + }; + this.handles.add(handle); + return handle; + } + }, { + key: "play", + value: function play(player, time) { + this.handles.forEach(function (handle) { + return handle.play(player, time); + }); + } + }]); + return CompositeAnimation; + }(); + + var WalkAnimation = function WalkAnimation(player, time) { + var skin = player.skin; + var angleRot = time + Math.PI / 2; + + // Leg Swing + skin.leftLeg.rotation.x = Math.cos(angleRot); + skin.rightLeg.rotation.x = Math.cos(angleRot + Math.PI); + + // Arm Swing + skin.leftArm.rotation.x = Math.cos(angleRot + Math.PI); + skin.rightArm.rotation.x = Math.cos(angleRot); + }; + + function copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) { + var imgData = context.getImageData(sX, sY, w, h); + if (flipHorizontal) { + for (var y = 0; y < h; y++) { + for (var x = 0; x < w / 2; x++) { + var index = (x + y * w) * 4; + var index2 = (w - x - 1 + y * w) * 4; + var pA1 = imgData.data[index]; + var pA2 = imgData.data[index + 1]; + var pA3 = imgData.data[index + 2]; + var pA4 = imgData.data[index + 3]; + + var pB1 = imgData.data[index2]; + var pB2 = imgData.data[index2 + 1]; + var pB3 = imgData.data[index2 + 2]; + var pB4 = imgData.data[index2 + 3]; + + imgData.data[index] = pB1; + imgData.data[index + 1] = pB2; + imgData.data[index + 2] = pB3; + imgData.data[index + 3] = pB4; + + imgData.data[index2] = pA1; + imgData.data[index2 + 1] = pA2; + imgData.data[index2 + 2] = pA3; + imgData.data[index2 + 3] = pA4; + } + } + } + context.putImageData(imgData, dX, dY); + } + + function convertSkinTo1_8(context, width) { + var scale = width / 64.0; + var copySkin = function copySkin(context, sX, sY, w, h, dX, dY, flipHorizontal) { + return copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal); + }; + + copySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg + copySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg + copySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg + copySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg + copySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg + copySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg + copySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm + copySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm + copySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm + copySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm + copySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm + copySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm + } + + var SkinViewer = function () { + function SkinViewer(options) { + var _this = this; + + classCallCheck(this, SkinViewer); + + this.domElement = options.domElement; + this.animation = options.animation || null; + this.animationPaused = false; + this.animationTime = 0; + this.disposed = false; + + // texture + this.skinImg = new Image(); + this.skinCanvas = document.createElement("canvas"); + this.skinTexture = new THREE.Texture(this.skinCanvas); + this.skinTexture.magFilter = THREE.NearestFilter; + this.skinTexture.minFilter = THREE.NearestMipMapNearestFilter; + + this.capeImg = new Image(); + this.capeCanvas = document.createElement("canvas"); + this.capeTexture = new THREE.Texture(this.capeCanvas); + this.capeTexture.magFilter = THREE.NearestFilter; + this.capeTexture.minFilter = THREE.NearestMipMapNearestFilter; + + this.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide }); + this.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide }); + this.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture }); + + // scene + this.scene = new THREE.Scene(); + + this.camera = new THREE.PerspectiveCamera(75); + this.camera.position.y = -12; + this.camera.position.z = 30; + + this.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false }); + this.renderer.setSize(300, 300); // default size + this.renderer.context.getShaderInfoLog = function () { + return ""; + }; // shut firefox up + this.domElement.appendChild(this.renderer.domElement); + + this.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial); + this.scene.add(this.playerObject); + + // texture loading + this.skinImg.crossOrigin = ""; + this.skinImg.onerror = function () { + return console.error("Failed loading " + _this.skinImg.src); + }; + this.skinImg.onload = function () { + var isOldFormat = false; + if (_this.skinImg.width !== _this.skinImg.height) { + if (_this.skinImg.width === 2 * _this.skinImg.height) { + isOldFormat = true; + } else { + console.error("Bad skin size"); + return; + } + } + + var skinContext = _this.skinCanvas.getContext("2d"); + if (isOldFormat) { + var width = _this.skinImg.width; + _this.skinCanvas.width = width; + _this.skinCanvas.height = width; + skinContext.clearRect(0, 0, width, width); + skinContext.drawImage(_this.skinImg, 0, 0, width, width / 2.0); + convertSkinTo1_8(skinContext, width); + } else { + _this.skinCanvas.width = _this.skinImg.width; + _this.skinCanvas.height = _this.skinImg.height; + skinContext.clearRect(0, 0, _this.skinCanvas.width, _this.skinCanvas.height); + skinContext.drawImage(_this.skinImg, 0, 0, _this.skinCanvas.width, _this.skinCanvas.height); + } + + _this.skinTexture.needsUpdate = true; + _this.layer1Material.needsUpdate = true; + _this.layer2Material.needsUpdate = true; + + _this.playerObject.skin.visible = true; + }; + + this.capeImg.crossOrigin = ""; + this.capeImg.onerror = function () { + return console.error("Failed loading " + _this.capeImg.src); + }; + this.capeImg.onload = function () { + if (_this.capeImg.width !== 2 * _this.capeImg.height) { + console.error("Bad cape size"); + return; + } + + _this.capeCanvas.width = _this.capeImg.width; + _this.capeCanvas.height = _this.capeImg.height; + var capeContext = _this.capeCanvas.getContext("2d"); + capeContext.clearRect(0, 0, _this.capeCanvas.width, _this.capeCanvas.height); + capeContext.drawImage(_this.capeImg, 0, 0, _this.capeCanvas.width, _this.capeCanvas.height); + + _this.capeTexture.needsUpdate = true; + _this.capeMaterial.needsUpdate = true; + + _this.playerObject.cape.visible = true; + }; + + if (options.skinUrl) this.skinUrl = options.skinUrl; + if (options.capeUrl) this.capeUrl = options.capeUrl; + if (options.width) this.width = options.width; + if (options.height) this.height = options.height; + + var draw = function draw() { + if (_this.disposed) return; + window.requestAnimationFrame(draw); + if (!_this.animationPaused) { + _this.animationTime++; + if (_this.animation) { + invokeAnimation(_this.animation, _this.playerObject, _this.animationTime / 100.0); + } + } + _this.renderer.render(_this.scene, _this.camera); + }; + draw(); + } + + createClass(SkinViewer, [{ + key: "setSize", + value: function setSize(width, height) { + this.camera.aspect = width / height; + this.camera.updateProjectionMatrix(); + this.renderer.setSize(width, height); + } + }, { + key: "dispose", + value: function dispose() { + this.disposed = true; + this.domElement.removeChild(this.renderer.domElement); + this.renderer.dispose(); + this.skinTexture.dispose(); + this.capeTexture.dispose(); + } + }, { + key: "skinUrl", + get: function get$$1() { + return this.skinImg.src; + }, + set: function set$$1(url) { + this.skinImg.src = url; + } + }, { + key: "capeUrl", + get: function get$$1() { + return this.capeImg.src; + }, + set: function set$$1(url) { + this.capeImg.src = url; + } + }, { + key: "width", + get: function get$$1() { + return this.renderer.getSize().width; + }, + set: function set$$1(newWidth) { + this.setSize(newWidth, this.height); + } + }, { + key: "height", + get: function get$$1() { + return this.renderer.getSize().height; + }, + set: function set$$1(newHeight) { + this.setSize(this.width, newHeight); + } + }]); + return SkinViewer; + }(); + + var SkinControl = function () { + function SkinControl(skinViewer) { + var _this2 = this; + + classCallCheck(this, SkinControl); + + this.enableAnimationControl = true; + this.skinViewer = skinViewer; + + this.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement); + this.orbitControls.enablePan = false; + this.orbitControls.target = new THREE.Vector3(0, -12, 0); + this.orbitControls.minDistance = 10; + this.orbitControls.maxDistance = 256; + this.orbitControls.update(); + + this.animationPauseListener = function (e) { + if (_this2.enableAnimationControl) { + e.preventDefault(); + _this2.skinViewer.animationPaused = !_this2.skinViewer.animationPaused; + } + }; + this.skinViewer.domElement.addEventListener("contextmenu", this.animationPauseListener, false); + } + + createClass(SkinControl, [{ + key: "dispose", + value: function dispose() { + this.skinViewer.domElement.removeEventListener("contextmenu", this.animationPauseListener, false); + this.orbitControls.dispose(); + } + }]); + return SkinControl; + }(); + + /** + * @license + * skinview3d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen + */ + + exports.SkinObject = SkinObject; + exports.CapeObject = CapeObject; + exports.PlayerObject = PlayerObject; + exports.SkinViewer = SkinViewer; + exports.SkinControl = SkinControl; + exports.CompositeAnimation = CompositeAnimation; + exports.WalkAnimation = WalkAnimation; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=skinview3d.js.map diff --git a/js/skinview3d.js.map b/js/skinview3d.js.map new file mode 100644 index 0000000..4a80856 --- /dev/null +++ b/js/skinview3d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"skinview3d.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js","../src/skinview3d.js"],"sourcesContent":["import * as THREE from \"three\";\r\n\r\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\r\n\treturn [\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\r\n\t];\r\n}\r\n\r\nfunction toSkinVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\r\n}\r\n\r\nfunction toCapeVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\r\n}\r\n\r\nfunction addVertices(box, top, bottom, left, front, right, back) {\r\n\tbox.faceVertexUvs[0] = [];\r\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\r\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\r\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\r\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\r\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\r\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\r\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\r\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\r\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\r\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\r\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\r\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\r\n}\r\n\r\nconst esp = 0.002;\r\n\r\nclass SkinObject extends THREE.Group {\r\n\tconstructor(isSlim, layer1Material, layer2Material) {\r\n\t\tsuper();\r\n\r\n\t\t// Head\r\n\t\tthis.head = new THREE.Group();\r\n\r\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\r\n\t\taddVertices(headBox,\r\n\t\t\ttoSkinVertices(8, 0, 16, 8),\r\n\t\t\ttoSkinVertices(16, 0, 24, 8),\r\n\t\t\ttoSkinVertices(0, 8, 8, 16),\r\n\t\t\ttoSkinVertices(8, 8, 16, 16),\r\n\t\t\ttoSkinVertices(16, 8, 24, 16),\r\n\t\t\ttoSkinVertices(24, 8, 32, 16)\r\n\t\t);\r\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\r\n\t\tthis.head.add(headMesh);\r\n\r\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\r\n\t\taddVertices(head2Box,\r\n\t\t\ttoSkinVertices(40, 0, 48, 8),\r\n\t\t\ttoSkinVertices(48, 0, 56, 8),\r\n\t\t\ttoSkinVertices(32, 8, 40, 16),\r\n\t\t\ttoSkinVertices(40, 8, 48, 16),\r\n\t\t\ttoSkinVertices(48, 8, 56, 16),\r\n\t\t\ttoSkinVertices(56, 8, 64, 16)\r\n\t\t);\r\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\r\n\t\thead2Mesh.renderOrder = -1;\r\n\t\tthis.head.add(head2Mesh);\r\n\r\n\t\tthis.add(this.head);\r\n\r\n\r\n\t\t// Body\r\n\t\tthis.body = new THREE.Group();\r\n\r\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\r\n\t\taddVertices(bodyBox,\r\n\t\t\ttoSkinVertices(20, 16, 28, 20),\r\n\t\t\ttoSkinVertices(28, 16, 36, 20),\r\n\t\t\ttoSkinVertices(16, 20, 20, 32),\r\n\t\t\ttoSkinVertices(20, 20, 28, 32),\r\n\t\t\ttoSkinVertices(28, 20, 32, 32),\r\n\t\t\ttoSkinVertices(32, 20, 40, 32)\r\n\t\t);\r\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\r\n\t\tthis.body.add(bodyMesh);\r\n\r\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\r\n\t\taddVertices(body2Box,\r\n\t\t\ttoSkinVertices(20, 32, 28, 36),\r\n\t\t\ttoSkinVertices(28, 32, 36, 36),\r\n\t\t\ttoSkinVertices(16, 36, 20, 48),\r\n\t\t\ttoSkinVertices(20, 36, 28, 48),\r\n\t\t\ttoSkinVertices(28, 36, 32, 48),\r\n\t\t\ttoSkinVertices(32, 36, 40, 48)\r\n\t\t);\r\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\r\n\t\tthis.body.add(body2Mesh);\r\n\r\n\t\tthis.body.position.y = -10;\r\n\t\tthis.add(this.body);\r\n\r\n\r\n\t\t// Right Arm\r\n\t\tthis.rightArm = new THREE.Group();\r\n\t\tlet rightArmPivot = new THREE.Group();\r\n\r\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\r\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\r\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\r\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\r\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\r\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\r\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\r\n\t\trightArmPivot.add(rightArmMesh);\r\n\r\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\r\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\r\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\r\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\r\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\r\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\r\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\r\n\t\trightArm2Mesh.renderOrder = 1;\r\n\t\trightArmPivot.add(rightArm2Mesh);\r\n\r\n\t\trightArmPivot.position.y = -6;\r\n\t\tthis.rightArm.add(rightArmPivot);\r\n\t\tthis.rightArm.position.y = -4;\r\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\r\n\t\tthis.add(this.rightArm);\r\n\r\n\r\n\t\t// Left Arm\r\n\t\tthis.leftArm = new THREE.Group();\r\n\t\tlet leftArmPivot = new THREE.Group();\r\n\r\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\r\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\r\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\r\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\r\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\r\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\r\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\r\n\t\tleftArmPivot.add(leftArmMesh);\r\n\r\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\r\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\r\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\r\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\r\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\r\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\r\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\r\n\t\tleftArm2Mesh.renderOrder = 1;\r\n\t\tleftArmPivot.add(leftArm2Mesh);\r\n\r\n\t\tleftArmPivot.position.y = -6;\r\n\t\tthis.leftArm.add(leftArmPivot);\r\n\t\tthis.leftArm.position.y = -4;\r\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\r\n\t\tthis.add(this.leftArm);\r\n\r\n\r\n\t\t// Right Leg\r\n\t\tthis.rightLeg = new THREE.Group();\r\n\t\tlet rightLegPivot = new THREE.Group();\r\n\r\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLegBox,\r\n\t\t\ttoSkinVertices(4, 16, 8, 20),\r\n\t\t\ttoSkinVertices(8, 16, 12, 20),\r\n\t\t\ttoSkinVertices(0, 20, 4, 32),\r\n\t\t\ttoSkinVertices(4, 20, 8, 32),\r\n\t\t\ttoSkinVertices(8, 20, 12, 32),\r\n\t\t\ttoSkinVertices(12, 20, 16, 32)\r\n\t\t);\r\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\r\n\t\trightLegPivot.add(rightLegMesh);\r\n\r\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLeg2Box,\r\n\t\t\ttoSkinVertices(4, 32, 8, 36),\r\n\t\t\ttoSkinVertices(8, 32, 12, 36),\r\n\t\t\ttoSkinVertices(0, 36, 4, 48),\r\n\t\t\ttoSkinVertices(4, 36, 8, 48),\r\n\t\t\ttoSkinVertices(8, 36, 12, 48),\r\n\t\t\ttoSkinVertices(12, 36, 16, 48)\r\n\t\t);\r\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\r\n\t\trightLeg2Mesh.renderOrder = 1;\r\n\t\trightLegPivot.add(rightLeg2Mesh);\r\n\r\n\t\trightLegPivot.position.y = -6;\r\n\t\tthis.rightLeg.add(rightLegPivot);\r\n\t\tthis.rightLeg.position.y = -16;\r\n\t\tthis.rightLeg.position.x = -2;\r\n\t\tthis.add(this.rightLeg);\r\n\r\n\t\t// Left Leg\r\n\t\tthis.leftLeg = new THREE.Group();\r\n\t\tlet leftLegPivot = new THREE.Group();\r\n\r\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLegBox,\r\n\t\t\ttoSkinVertices(20, 48, 24, 52),\r\n\t\t\ttoSkinVertices(24, 48, 28, 52),\r\n\t\t\ttoSkinVertices(16, 52, 20, 64),\r\n\t\t\ttoSkinVertices(20, 52, 24, 64),\r\n\t\t\ttoSkinVertices(24, 52, 28, 64),\r\n\t\t\ttoSkinVertices(28, 52, 32, 64)\r\n\t\t);\r\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\r\n\t\tleftLegPivot.add(leftLegMesh);\r\n\r\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLeg2Box,\r\n\t\t\ttoSkinVertices(4, 48, 8, 52),\r\n\t\t\ttoSkinVertices(8, 48, 12, 52),\r\n\t\t\ttoSkinVertices(0, 52, 4, 64),\r\n\t\t\ttoSkinVertices(4, 52, 8, 64),\r\n\t\t\ttoSkinVertices(8, 52, 12, 64),\r\n\t\t\ttoSkinVertices(12, 52, 16, 64)\r\n\t\t);\r\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\r\n\t\tleftLeg2Mesh.renderOrder = 1;\r\n\t\tleftLegPivot.add(leftLeg2Mesh);\r\n\r\n\t\tleftLegPivot.position.y = -6;\r\n\t\tthis.leftLeg.add(leftLegPivot);\r\n\t\tthis.leftLeg.position.y = -16;\r\n\t\tthis.leftLeg.position.x = 2;\r\n\t\tthis.add(this.leftLeg);\r\n\t}\r\n}\r\n\r\nclass CapeObject extends THREE.Group {\r\n\tconstructor(capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\t// back = outside\r\n\t\t// front = inside\r\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\r\n\t\taddVertices(capeBox,\r\n\t\t\ttoCapeVertices(1, 0, 11, 1),\r\n\t\t\ttoCapeVertices(11, 0, 21, 1),\r\n\t\t\ttoCapeVertices(11, 1, 12, 17),\r\n\t\t\ttoCapeVertices(12, 1, 22, 17),\r\n\t\t\ttoCapeVertices(0, 1, 1, 17),\r\n\t\t\ttoCapeVertices(1, 1, 11, 17)\r\n\t\t);\r\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\r\n\t\tthis.cape.position.y = -8;\r\n\t\tthis.cape.position.z = -0.5;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nclass PlayerObject extends THREE.Group {\r\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\tthis.slim = slim;\r\n\r\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\r\n\t\tthis.skin.visible = false;\r\n\t\tthis.add(this.skin);\r\n\r\n\t\tthis.cape = new CapeObject(capeMaterial);\r\n\t\tthis.cape.position.z = -2;\r\n\t\tthis.cape.position.y = -4;\r\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\r\n\t\tthis.cape.visible = false;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nexport { SkinObject, CapeObject, PlayerObject };\r\n","import * as THREE from \"three\";\r\n\r\nclass OrbitControls extends THREE.EventDispatcher {\r\n\t/**\r\n\t * @preserve\r\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\r\n\t */\r\n\t/**\r\n\t * @license\r\n\t * Copyright (C) 2010-2017 three.js authors\r\n\t *\r\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n\t * of this software and associated documentation files (the \"Software\"), to deal\r\n\t * in the Software without restriction, including without limitation the rights\r\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\t * copies of the Software, and to permit persons to whom the Software is\r\n\t * furnished to do so, subject to the following conditions:\r\n\t *\r\n\t * The above copyright notice and this permission notice shall be included in\r\n\t * all copies or substantial portions of the Software.\r\n\t *\r\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\t * THE SOFTWARE.\r\n\t *\r\n\t *\r\n\t * @author qiao / https://github.com/qiao\r\n\t * @author mrdoob / http://mrdoob.com\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t * @author WestLangley / http://github.com/WestLangley\r\n\t * @author erich666 / http://erichaines.com\r\n\t */\r\n\r\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\r\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n\t//\r\n\t// Orbit - left mouse / touch: one finger move\r\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\r\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\r\n\r\n\tconstructor(object, domElement) {\r\n\t\tsuper();\r\n\t\tthis.object = object;\r\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\r\n\r\n\t\t// Set to false to disable this control\r\n\t\tthis.enabled = true;\r\n\r\n\t\t// \"target\" sets the location of focus, where the object orbits around\r\n\t\tthis.target = new THREE.Vector3();\r\n\r\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\r\n\t\tthis.minDistance = 0;\r\n\t\tthis.maxDistance = Infinity;\r\n\r\n\t\t// How far you can zoom in and out (OrthographicCamera only)\r\n\t\tthis.minZoom = 0;\r\n\t\tthis.maxZoom = Infinity;\r\n\r\n\t\t// How far you can orbit vertically, upper and lower limits.\r\n\t\t// Range is 0 to Math.PI radians.\r\n\t\tthis.minPolarAngle = 0; // radians\r\n\t\tthis.maxPolarAngle = Math.PI; // radians\r\n\r\n\t\t// How far you can orbit horizontally, upper and lower limits.\r\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\r\n\t\tthis.minAzimuthAngle = -Infinity; // radians\r\n\t\tthis.maxAzimuthAngle = Infinity; // radians\r\n\r\n\t\t// Set to true to enable damping (inertia)\r\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.enableDamping = false;\r\n\t\tthis.dampingFactor = 0.25;\r\n\r\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n\t\t// Set to false to disable zooming\r\n\t\tthis.enableZoom = true;\r\n\t\tthis.zoomSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable rotating\r\n\t\tthis.enableRotate = true;\r\n\t\tthis.rotateSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable panning\r\n\t\tthis.enablePan = true;\r\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\r\n\r\n\t\t// Set to true to automatically rotate around the target\r\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.autoRotate = false;\r\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\r\n\r\n\t\t// Set to false to disable use of the keys\r\n\t\tthis.enableKeys = true;\r\n\r\n\t\t// The four arrow keys\r\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\r\n\r\n\t\t// Mouse buttons\r\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\r\n\r\n\t\t// for reset\r\n\t\tthis.target0 = this.target.clone();\r\n\t\tthis.position0 = this.object.position.clone();\r\n\t\tthis.zoom0 = this.object.zoom;\r\n\r\n\t\t//\r\n\t\t// public methods\r\n\t\t//\r\n\t\tthis.getPolarAngle = function () {\r\n\t\t\treturn spherical.phi;\r\n\t\t};\r\n\t\tthis.getAzimuthalAngle = function () {\r\n\t\t\treturn spherical.theta;\r\n\t\t};\r\n\t\tthis.saveState = function () {\r\n\t\t\tscope.target0.copy(scope.target);\r\n\t\t\tscope.position0.copy(scope.object.position);\r\n\t\t\tscope.zoom0 = scope.object.zoom;\r\n\t\t};\r\n\t\tthis.reset = function () {\r\n\t\t\tscope.target.copy(scope.target0);\r\n\t\t\tscope.object.position.copy(scope.position0);\r\n\t\t\tscope.object.zoom = scope.zoom0;\r\n\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\tscope.update();\r\n\t\t\tstate = STATE.NONE;\r\n\t\t};\r\n\r\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\r\n\t\tthis.update = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\t// so camera.up is the orbit axis\r\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\r\n\t\t\tlet quatInverse = quat.clone().inverse();\r\n\t\t\tlet lastPosition = new THREE.Vector3();\r\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\r\n\t\t\treturn function update() {\r\n\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quat);\r\n\t\t\t\t// angle from z-axis around y-axis\r\n\t\t\t\tspherical.setFromVector3(offset);\r\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\r\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\r\n\t\t\t\t}\r\n\t\t\t\tspherical.theta += sphericalDelta.theta;\r\n\t\t\t\tspherical.phi += sphericalDelta.phi;\r\n\t\t\t\t// restrict theta to be between desired limits\r\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\r\n\t\t\t\t// restrict phi to be between desired limits\r\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\r\n\t\t\t\tspherical.makeSafe();\r\n\t\t\t\tspherical.radius *= scale;\r\n\t\t\t\t// restrict radius to be between desired limits\r\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\r\n\t\t\t\t// move target to panned location\r\n\t\t\t\tscope.target.add(panOffset);\r\n\t\t\t\toffset.setFromSpherical(spherical);\r\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quatInverse);\r\n\t\t\t\tposition.copy(scope.target).add(offset);\r\n\t\t\t\tscope.object.lookAt(scope.target);\r\n\t\t\t\tif (scope.enableDamping === true) {\r\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\r\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tscale = 1;\r\n\t\t\t\tpanOffset.set(0, 0, 0);\r\n\t\t\t\t// update condition is:\r\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\r\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\t\t\t\tif (zoomChanged ||\r\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\r\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\r\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\t\t\tlastPosition.copy(scope.object.position);\r\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\r\n\t\t\t\t\tzoomChanged = false;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}();\r\n\t\tthis.dispose = function () {\r\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\r\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\r\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\r\n\t\t};\r\n\t\t//\r\n\t\t// internals\r\n\t\t//\r\n\t\tlet scope = this;\r\n\t\tlet changeEvent = { type: \"change\" };\r\n\t\tlet startEvent = { type: \"start\" };\r\n\t\tlet endEvent = { type: \"end\" };\r\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\r\n\t\tlet state = STATE.NONE;\r\n\t\tlet EPS = 0.000001;\r\n\t\t// current position in spherical coordinates\r\n\t\tlet spherical = new THREE.Spherical();\r\n\t\tlet sphericalDelta = new THREE.Spherical();\r\n\t\tlet scale = 1;\r\n\t\tlet panOffset = new THREE.Vector3();\r\n\t\tlet zoomChanged = false;\r\n\t\tlet rotateStart = new THREE.Vector2();\r\n\t\tlet rotateEnd = new THREE.Vector2();\r\n\t\tlet rotateDelta = new THREE.Vector2();\r\n\t\tlet panStart = new THREE.Vector2();\r\n\t\tlet panEnd = new THREE.Vector2();\r\n\t\tlet panDelta = new THREE.Vector2();\r\n\t\tlet dollyStart = new THREE.Vector2();\r\n\t\tlet dollyEnd = new THREE.Vector2();\r\n\t\tlet dollyDelta = new THREE.Vector2();\r\n\t\tfunction getAutoRotationAngle() {\r\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\t\t}\r\n\t\tfunction getZoomScale() {\r\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\r\n\t\t}\r\n\t\tfunction rotateLeft(angle) {\r\n\t\t\tsphericalDelta.theta -= angle;\r\n\t\t}\r\n\t\tfunction rotateUp(angle) {\r\n\t\t\tsphericalDelta.phi -= angle;\r\n\t\t}\r\n\t\tlet panLeft = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panLeft(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(-distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\tlet panUp = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panUp(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\t// deltaX and deltaY are in pixels; right and down are positive\r\n\t\tlet pan = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\treturn function pan(deltaX, deltaY) {\r\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\t\t// perspective\r\n\t\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t\tlet targetDistance = offset.length();\r\n\t\t\t\t\t// half of the fov is center to top of screen\r\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\r\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\r\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\t\t// orthographic\r\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\r\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// camera neither orthographic nor perspective\r\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\r\n\t\t\t\t\tscope.enablePan = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}();\r\n\t\tfunction dollyIn(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale /= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction dollyOut(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale *= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//\r\n\t\t// event callbacks - update the object state\r\n\t\t//\r\n\t\tfunction handleMouseDownRotate(event) {\r\n\t\t\trotateStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownDolly(event) {\r\n\t\t\tdollyStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownPan(event) {\r\n\t\t\tpanStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.clientX, event.clientY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t// rotating across whole screen goes 360 degrees around\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMoveDolly(event) {\r\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMovePan(event) {\r\n\t\t\tpanEnd.set(event.clientX, event.clientY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseUp(event) {\r\n\t\t}\r\n\t\tfunction handleMouseWheel(event) {\r\n\t\t\tif (event.deltaY < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (event.deltaY > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleKeyDown(event) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase scope.keys.UP:\r\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.BOTTOM:\r\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.LEFT:\r\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.RIGHT:\r\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction handleTouchStartRotate(event) {\r\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchStartDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyStart.set(0, distance);\r\n\t\t}\r\n\t\tfunction handleTouchStartPan(event) {\r\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMoveDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyEnd.set(0, distance);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMovePan(event) {\r\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchEnd(event) {\r\n\t\t}\r\n\t\t//\r\n\t\t// event handlers - FSM: listen for events and reset state\r\n\t\t//\r\n\t\tfunction onMouseDown(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.button) {\r\n\t\t\t\tcase scope.mouseButtons.ORBIT:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownRotate(event);\r\n\t\t\t\t\tstate = STATE.ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.ZOOM:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownDolly(event);\r\n\t\t\t\t\tstate = STATE.DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownPan(event);\r\n\t\t\t\t\tstate = STATE.PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onMouseMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (state) {\r\n\t\t\t\tcase STATE.ROTATE:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.DOLLY:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tfunction onMouseUp(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleMouseUp(event);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onMouseWheel(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\thandleMouseWheel(event);\r\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t}\r\n\t\tfunction onKeyDown(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleKeyDown(event);\r\n\t\t}\r\n\t\tfunction onTouchStart(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartRotate(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartDolly(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartPan(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onTouchMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t\tfunction onTouchEnd(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleTouchEnd(event);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onContextMenu(event) {\r\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\t//\r\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\r\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\r\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\r\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\r\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\r\n\t\t// force an update at start\r\n\t\tthis.update();\r\n\t}\r\n}\r\n\r\nexport { OrbitControls };\r\n","function invokeAnimation(animation, player, time) {\r\n\tif (animation instanceof CompositeAnimation) {\r\n\t\tanimation.play(player, time);\r\n\t} else if (animation instanceof Function) {\r\n\t\tanimation(player, time);\r\n\t} else {\r\n\t\tthrow `Not an animation: ${animation}`;\r\n\t}\r\n}\r\n\r\nclass AnimationHandle {\r\n\tconstructor(animation) {\r\n\t\tthis.animation = animation;\r\n\t\tthis.paused = this._paused = false;\r\n\t\tthis.speed = this._speed = 1.0;\r\n\t\tthis._lastChange = null;\r\n\t\tthis._lastChangeX = null;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tif (this._lastChange === null) {\r\n\t\t\tthis._lastChange = time;\r\n\t\t\tthis._lastChangeX = 0;\r\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tif (this._paused === false) {\r\n\t\t\t\tthis._lastChangeX += dt * this._speed;\r\n\t\t\t}\r\n\t\t\tthis._paused = this.paused;\r\n\t\t\tthis._speed = this.speed;\r\n\t\t\tthis._lastChange = time;\r\n\t\t}\r\n\t\tif (this.paused === false) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\r\n\t\t\tinvokeAnimation(this.animation, player, x);\r\n\t\t}\r\n\t}\r\n\treset(){\r\n\t\tthis._lastChange = null;\r\n\t}\r\n}\r\n\r\nclass CompositeAnimation {\r\n\tconstructor() {\r\n\t\tthis.handles = new Set();\r\n\t}\r\n\tadd(animation) {\r\n\t\tlet handle = new AnimationHandle(animation);\r\n\t\thandle.remove = () => this.handles.delete(handle);\r\n\t\tthis.handles.add(handle);\r\n\t\treturn handle;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tthis.handles.forEach(handle => handle.play(player, time));\r\n\t}\r\n}\r\n\r\nlet WalkAnimation = (player, time) => {\r\n\tlet skin = player.skin;\r\n\tlet angleRot = time + Math.PI / 2;\r\n\r\n\t// Leg Swing\r\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\r\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\r\n\t// Arm Swing\r\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\r\n};\r\n\r\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\r\n","import * as THREE from \"three\";\r\nimport { PlayerObject } from \"./model\";\r\nimport { OrbitControls } from \"./orbit_controls\";\r\nimport { invokeAnimation } from \"./animation\";\r\n\r\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\r\n\tlet imgData = context.getImageData(sX, sY, w, h);\r\n\tif (flipHorizontal) {\r\n\t\tfor (let y = 0; y < h; y++) {\r\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\r\n\t\t\t\tlet index = (x + y * w) * 4;\r\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\r\n\t\t\t\tlet pA1 = imgData.data[index];\r\n\t\t\t\tlet pA2 = imgData.data[index + 1];\r\n\t\t\t\tlet pA3 = imgData.data[index + 2];\r\n\t\t\t\tlet pA4 = imgData.data[index + 3];\r\n\r\n\t\t\t\tlet pB1 = imgData.data[index2];\r\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\r\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\r\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\r\n\r\n\t\t\t\timgData.data[index] = pB1;\r\n\t\t\t\timgData.data[index + 1] = pB2;\r\n\t\t\t\timgData.data[index + 2] = pB3;\r\n\t\t\t\timgData.data[index + 3] = pB4;\r\n\r\n\t\t\t\timgData.data[index2] = pA1;\r\n\t\t\t\timgData.data[index2 + 1] = pA2;\r\n\t\t\t\timgData.data[index2 + 2] = pA3;\r\n\t\t\t\timgData.data[index2 + 3] = pA4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcontext.putImageData(imgData, dX, dY);\r\n}\r\n\r\nfunction convertSkinTo1_8(context, width) {\r\n\tlet scale = width / 64.0;\r\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\r\n\r\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\r\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\r\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\r\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\r\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\r\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\r\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\r\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\r\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\r\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\r\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\r\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\r\n}\r\n\r\nclass SkinViewer {\r\n\tconstructor(options) {\r\n\t\tthis.domElement = options.domElement;\r\n\t\tthis.animation = options.animation || null;\r\n\t\tthis.animationPaused = false;\r\n\t\tthis.animationTime = 0;\r\n\t\tthis.disposed = false;\r\n\r\n\t\t// texture\r\n\t\tthis.skinImg = new Image();\r\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\r\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\r\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.capeImg = new Image();\r\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\r\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\r\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\r\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\r\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\r\n\r\n\t\t// scene\r\n\t\tthis.scene = new THREE.Scene();\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\r\n\t\tthis.camera.position.y = -12;\r\n\t\tthis.camera.position.z = 30;\r\n\r\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\r\n\t\tthis.renderer.setSize(300, 300); // default size\r\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\r\n\t\tthis.domElement.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\r\n\t\tthis.scene.add(this.playerObject);\r\n\r\n\t\t// texture loading\r\n\t\tthis.skinImg.crossOrigin = \"\";\r\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\r\n\t\tthis.skinImg.onload = () => {\r\n\t\t\tlet isOldFormat = false;\r\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\r\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\r\n\t\t\t\t\tisOldFormat = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\"Bad skin size\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\r\n\t\t\tif (isOldFormat) {\r\n\t\t\t\tlet width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.width = width;\r\n\t\t\t\tthis.skinCanvas.height = width;\r\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\r\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\r\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t}\r\n\r\n\t\t\tthis.skinTexture.needsUpdate = true;\r\n\t\t\tthis.layer1Material.needsUpdate = true;\r\n\t\t\tthis.layer2Material.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.skin.visible = true;\r\n\t\t};\r\n\r\n\t\tthis.capeImg.crossOrigin = \"\";\r\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\r\n\t\tthis.capeImg.onload = () => {\r\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\r\n\t\t\t\tconsole.error(\"Bad cape size\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\r\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\r\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\r\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\r\n\t\t\tthis.capeTexture.needsUpdate = true;\r\n\t\t\tthis.capeMaterial.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.cape.visible = true;\r\n\t\t};\r\n\r\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\r\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\r\n\t\tif (options.width) this.width = options.width;\r\n\t\tif (options.height) this.height = options.height;\r\n\r\n\t\tlet draw = () => {\r\n\t\t\tif (this.disposed) return;\r\n\t\t\twindow.requestAnimationFrame(draw);\r\n\t\t\tif (!this.animationPaused) {\r\n\t\t\t\tthis.animationTime++;\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\t\tdraw();\r\n\t}\r\n\r\n\tsetSize(width, height) {\r\n\t\tthis.camera.aspect = width / height;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.disposed = true;\r\n\t\tthis.domElement.removeChild(this.renderer.domElement);\r\n\t\tthis.renderer.dispose();\r\n\t\tthis.skinTexture.dispose();\r\n\t\tthis.capeTexture.dispose();\r\n\t}\r\n\r\n\tget skinUrl() {\r\n\t\treturn this.skinImg.src;\r\n\t}\r\n\r\n\tset skinUrl(url) {\r\n\t\tthis.skinImg.src = url;\r\n\t}\r\n\r\n\tget capeUrl() {\r\n\t\treturn this.capeImg.src;\r\n\t}\r\n\r\n\tset capeUrl(url) {\r\n\t\tthis.capeImg.src = url;\r\n\t}\r\n\r\n\tget width() {\r\n\t\treturn this.renderer.getSize().width;\r\n\t}\r\n\r\n\tset width(newWidth) {\r\n\t\tthis.setSize(newWidth, this.height);\r\n\t}\r\n\r\n\tget height() {\r\n\t\treturn this.renderer.getSize().height;\r\n\t}\r\n\r\n\tset height(newHeight) {\r\n\t\tthis.setSize(this.width, newHeight);\r\n\t}\r\n}\r\n\r\nclass SkinControl {\r\n\tconstructor(skinViewer) {\r\n\t\tthis.enableAnimationControl = true;\r\n\t\tthis.skinViewer = skinViewer;\r\n\r\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\r\n\t\tthis.orbitControls.enablePan = false;\r\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\r\n\t\tthis.orbitControls.minDistance = 10;\r\n\t\tthis.orbitControls.maxDistance = 256;\r\n\t\tthis.orbitControls.update();\r\n\r\n\t\tthis.animationPauseListener = e => {\r\n\t\t\tif (this.enableAnimationControl) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t\tthis.orbitControls.dispose();\r\n\t}\r\n}\r\n\r\nexport { SkinViewer, SkinControl };\r\n","/**\r\n * @license\r\n * skinview3d \r\n *\r\n * Copyright (C) 2017 the original author or authors\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n *\r\n * @author yushijinhun \r\n * @author Hacksore \r\n * @author Kent Rasmussen \r\n */\r\n\r\nexport { SkinObject, CapeObject, PlayerObject } from \"./model\";\r\nexport { SkinViewer, SkinControl } from \"./viewer\";\r\nexport { CompositeAnimation, WalkAnimation } from \"./animation\";\r\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","PlayerObject","slim","skin","visible","rotation","Math","PI","OrbitControls","object","domElement","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","scope","copy","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","state","STATE","NONE","offset","quat","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","sub","applyQuaternion","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","window","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","console","warn","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","event","clientX","clientY","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","dx","dy","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","button","preventDefault","addEventListener","handleMouseUp","stopPropagation","handleTouchEnd","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","WalkAnimation","angleRot","cos","copyImage","context","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","convertSkinTo1_8","width","copySkin","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","alpha","antialias","setSize","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","error","src","onload","isOldFormat","height","skinContext","getContext","clearRect","drawImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener","e"],"mappings":"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"} \ No newline at end of file diff --git a/js/skinview3d.min.js b/js/skinview3d.min.js new file mode 100644 index 0000000..3e783ad --- /dev/null +++ b/js/skinview3d.min.js @@ -0,0 +1,61 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("three")):"function"==typeof define&&define.amd?define(["exports","three"],t):t(e.skinview3d={},e.THREE)}(this,function(e,t){"use strict";var n=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},a=function(){function e(e,t){for(var n=0;nb||8*(1-h.dot(m.object.quaternion))>b)&&(m.dispatchEvent(l),d.copy(m.object.position),h.copy(m.object.quaternion),x=!1,!0)}),u.dispose=function(){m.domElement.removeEventListener("contextmenu",Q,!1),m.domElement.removeEventListener("mousedown",D,!1),m.domElement.removeEventListener("wheel",H,!1),m.domElement.removeEventListener("touchstart",Z,!1),m.domElement.removeEventListener("touchend",q,!1),m.domElement.removeEventListener("touchmove",W,!1),document.removeEventListener("mousemove",F,!1),document.removeEventListener("mouseup",Y,!1),window.removeEventListener("keydown",X,!1)};var m=u,l={type:"change"},p={type:"start"},f={type:"end"},v={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},g=v.NONE,b=1e-6,w=new t.Spherical,y=new t.Spherical,k=1,E=new t.Vector3,x=!1,O=new t.Vector2,M=new t.Vector2,C=new t.Vector2,P=new t.Vector2,j=new t.Vector2,T=new t.Vector2,I=new t.Vector2,L=new t.Vector2,A=new t.Vector2;function _(){return Math.pow(.95,m.zoomSpeed)}function V(e){y.theta-=e}function N(e){y.phi-=e}var S,U=(S=new t.Vector3,function(e,t){S.setFromMatrixColumn(t,0),S.multiplyScalar(-e),E.add(S)}),z=function(){var e=new t.Vector3;return function(t,n){e.setFromMatrixColumn(n,1),e.multiplyScalar(t),E.add(e)}}(),G=function(){var e=new t.Vector3;return function(n,a){var i=m.domElement===document?m.domElement.body:m.domElement;if(m.object instanceof t.PerspectiveCamera){var o=m.object.position;e.copy(o).sub(m.target);var r=e.length();r*=Math.tan(m.object.fov/2*Math.PI/180),U(2*n*r/i.clientHeight,m.object.matrix),z(2*a*r/i.clientHeight,m.object.matrix)}else m.object instanceof t.OrthographicCamera?(U(n*(m.object.right-m.object.left)/m.object.zoom/i.clientWidth,m.object.matrix),z(a*(m.object.top-m.object.bottom)/m.object.zoom/i.clientHeight,m.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),m.enablePan=!1)}}();function R(e){m.object instanceof t.PerspectiveCamera?k/=e:m.object instanceof t.OrthographicCamera?(m.object.zoom=Math.max(m.minZoom,Math.min(m.maxZoom,m.object.zoom*e)),m.object.updateProjectionMatrix(),x=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),m.enableZoom=!1)}function B(e){m.object instanceof t.PerspectiveCamera?k*=e:m.object instanceof t.OrthographicCamera?(m.object.zoom=Math.max(m.minZoom,Math.min(m.maxZoom,m.object.zoom/e)),m.object.updateProjectionMatrix(),x=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),m.enableZoom=!1)}function D(e){if(!1!==m.enabled){switch(e.button){case m.mouseButtons.ORBIT:if(!1===m.enableRotate)return;!function(e){O.set(e.clientX,e.clientY)}(e),g=v.ROTATE;break;case m.mouseButtons.ZOOM:if(!1===m.enableZoom)return;!function(e){I.set(e.clientX,e.clientY)}(e),g=v.DOLLY;break;case m.mouseButtons.PAN:if(!1===m.enablePan)return;!function(e){P.set(e.clientX,e.clientY)}(e),g=v.PAN}e.preventDefault(),g!==v.NONE&&(document.addEventListener("mousemove",F,!1),document.addEventListener("mouseup",Y,!1),m.dispatchEvent(p))}}function F(e){if(!1!==m.enabled){switch(g){case v.ROTATE:if(!1===m.enableRotate)return;!function(e){M.set(e.clientX,e.clientY),C.subVectors(M,O);var t=m.domElement===document?m.domElement.body:m.domElement;V(2*Math.PI*C.x/t.clientWidth*m.rotateSpeed),N(2*Math.PI*C.y/t.clientHeight*m.rotateSpeed),O.copy(M),m.update()}(e);break;case v.DOLLY:if(!1===m.enableZoom)return;!function(e){L.set(e.clientX,e.clientY),A.subVectors(L,I),A.y>0?R(_()):A.y<0&&B(_()),I.copy(L),m.update()}(e);break;case v.PAN:if(!1===m.enablePan)return;!function(e){j.set(e.clientX,e.clientY),T.subVectors(j,P),G(T.x,T.y),P.copy(j),m.update()}(e)}e.preventDefault()}}function Y(e){!1!==m.enabled&&(document.removeEventListener("mousemove",F,!1),document.removeEventListener("mouseup",Y,!1),m.dispatchEvent(f),g=v.NONE)}function H(e){!1===m.enabled||!1===m.enableZoom||g!==v.NONE&&g!==v.ROTATE||(e.preventDefault(),e.stopPropagation(),function(e){e.deltaY<0?B(_()):e.deltaY>0&&R(_()),m.update()}(e),m.dispatchEvent(p),m.dispatchEvent(f))}function X(e){!1!==m.enabled&&!1!==m.enableKeys&&!1!==m.enablePan&&function(e){switch(e.keyCode){case m.keys.UP:G(0,m.keyPanSpeed),m.update();break;case m.keys.BOTTOM:G(0,-m.keyPanSpeed),m.update();break;case m.keys.LEFT:G(m.keyPanSpeed,0),m.update();break;case m.keys.RIGHT:G(-m.keyPanSpeed,0),m.update()}}(e)}function Z(e){if(!1!==m.enabled){switch(e.touches.length){case 1:if(!1===m.enableRotate)return;!function(e){O.set(e.touches[0].pageX,e.touches[0].pageY)}(e),g=v.TOUCH_ROTATE;break;case 2:if(!1===m.enableZoom)return;!function(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,a=Math.sqrt(t*t+n*n);I.set(0,a)}(e),g=v.TOUCH_DOLLY;break;case 3:if(!1===m.enablePan)return;!function(e){P.set(e.touches[0].pageX,e.touches[0].pageY)}(e),g=v.TOUCH_PAN;break;default:g=v.NONE}g!==v.NONE&&m.dispatchEvent(p)}}function W(e){if(!1!==m.enabled){switch(e.touches.length){case 1:if(!1===m.enableRotate)return;if(g!==v.TOUCH_ROTATE)return;!function(e){M.set(e.touches[0].pageX,e.touches[0].pageY),C.subVectors(M,O);var t=m.domElement===document?m.domElement.body:m.domElement;V(2*Math.PI*C.x/t.clientWidth*m.rotateSpeed),N(2*Math.PI*C.y/t.clientHeight*m.rotateSpeed),O.copy(M),m.update()}(e);break;case 2:if(!1===m.enableZoom)return;if(g!==v.TOUCH_DOLLY)return;!function(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,a=Math.sqrt(t*t+n*n);L.set(0,a),A.subVectors(L,I),A.y>0?B(_()):A.y<0&&R(_()),I.copy(L),m.update()}(e);break;case 3:if(!1===m.enablePan)return;if(g!==v.TOUCH_PAN)return;!function(e){j.set(e.touches[0].pageX,e.touches[0].pageY),T.subVectors(j,P),G(T.x,T.y),P.copy(j),m.update()}(e);break;default:g=v.NONE}e.preventDefault(),e.stopPropagation()}}function q(e){!1!==m.enabled&&(m.dispatchEvent(f),g=v.NONE)}function Q(e){!1!==m.enabled&&!1!==m.enablePan&&e.preventDefault()}return m.domElement.addEventListener("contextmenu",Q,!1),m.domElement.addEventListener("mousedown",D,!1),m.domElement.addEventListener("wheel",H,!1),m.domElement.addEventListener("touchstart",Z,!1),m.domElement.addEventListener("touchend",q,!1),m.domElement.addEventListener("touchmove",W,!1),window.addEventListener("keydown",X,!1),u.update(),u}return i(a,e),a}(t.EventDispatcher);function f(e,t,n){if(e instanceof g)e.play(t,n);else{if(!(e instanceof Function))throw"Not an animation: "+e;e(t,n)}}var v=function(){function e(t){n(this,e),this.animation=t,this.paused=this._paused=!1,this.speed=this._speed=1,this._lastChange=null,this._lastChangeX=null}return a(e,[{key:"play",value:function(e,t){if(null===this._lastChange)this._lastChange=t,this._lastChangeX=0;else if(this.paused!==this._paused||this.speed!==this._speed){var n=t-this._lastChange;!1===this._paused&&(this._lastChangeX+=n*this._speed),this._paused=this.paused,this._speed=this.speed,this._lastChange=t}if(!1===this.paused){var a=t-this._lastChange,i=this._lastChangeX+this.speed*a;f(this.animation,e,i)}}},{key:"reset",value:function(){this._lastChange=null}}]),e}(),g=function(){function e(){n(this,e),this.handles=new Set}return a(e,[{key:"add",value:function(e){var t=this,n=new v(e);return n.remove=function(){return t.handles.delete(n)},this.handles.add(n),n}},{key:"play",value:function(e,t){this.handles.forEach(function(n){return n.play(e,t)})}}]),e}();var b=function(){function e(a){var i=this;n(this,e),this.domElement=a.domElement,this.animation=a.animation||null,this.animationPaused=!1,this.animationTime=0,this.disposed=!1,this.skinImg=new Image,this.skinCanvas=document.createElement("canvas"),this.skinTexture=new t.Texture(this.skinCanvas),this.skinTexture.magFilter=t.NearestFilter,this.skinTexture.minFilter=t.NearestMipMapNearestFilter,this.capeImg=new Image,this.capeCanvas=document.createElement("canvas"),this.capeTexture=new t.Texture(this.capeCanvas),this.capeTexture.magFilter=t.NearestFilter,this.capeTexture.minFilter=t.NearestMipMapNearestFilter,this.layer1Material=new t.MeshBasicMaterial({map:this.skinTexture,side:t.FrontSide}),this.layer2Material=new t.MeshBasicMaterial({map:this.skinTexture,transparent:!0,opacity:1,side:t.DoubleSide}),this.capeMaterial=new t.MeshBasicMaterial({map:this.capeTexture}),this.scene=new t.Scene,this.camera=new t.PerspectiveCamera(75),this.camera.position.y=-12,this.camera.position.z=30,this.renderer=new t.WebGLRenderer({angleRot:!0,alpha:!0,antialias:!1}),this.renderer.setSize(300,300),this.renderer.context.getShaderInfoLog=function(){return""},this.domElement.appendChild(this.renderer.domElement),this.playerObject=new l(!0===a.slim,this.layer1Material,this.layer2Material,this.capeMaterial),this.scene.add(this.playerObject),this.skinImg.crossOrigin="",this.skinImg.onerror=function(){return console.error("Failed loading "+i.skinImg.src)},this.skinImg.onload=function(){var e=!1;if(i.skinImg.width!==i.skinImg.height){if(i.skinImg.width!==2*i.skinImg.height)return void console.error("Bad skin size");e=!0}var t=i.skinCanvas.getContext("2d");if(e){var n=i.skinImg.width;i.skinCanvas.width=n,i.skinCanvas.height=n,t.clearRect(0,0,n,n),t.drawImage(i.skinImg,0,0,n,n/2),function(e,t){var n=t/64,a=function(e,t,a,i,o,r,s,c){return function(e,t,n,a,i,o,r,s){var c=e.getImageData(t,n,a,i);if(s)for(var d=0;d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen + */ +e.SkinObject=u,e.CapeObject=m,e.PlayerObject=l,e.SkinViewer=b,e.SkinControl=w,e.CompositeAnimation=g,e.WalkAnimation=function(e,t){var n=e.skin,a=t+Math.PI/2;n.leftLeg.rotation.x=Math.cos(a),n.rightLeg.rotation.x=Math.cos(a+Math.PI),n.leftArm.rotation.x=Math.cos(a+Math.PI),n.rightArm.rotation.x=Math.cos(a)},Object.defineProperty(e,"__esModule",{value:!0})}); +//# sourceMappingURL=skinview3d.min.js.map diff --git a/js/skinview3d.min.js.map b/js/skinview3d.min.js.map new file mode 100644 index 0000000..4990d81 --- /dev/null +++ b/js/skinview3d.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"skinview3d.min.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js"],"sourcesContent":["import * as THREE from \"three\";\r\n\r\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\r\n\treturn [\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\r\n\t];\r\n}\r\n\r\nfunction toSkinVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\r\n}\r\n\r\nfunction toCapeVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\r\n}\r\n\r\nfunction addVertices(box, top, bottom, left, front, right, back) {\r\n\tbox.faceVertexUvs[0] = [];\r\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\r\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\r\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\r\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\r\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\r\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\r\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\r\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\r\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\r\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\r\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\r\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\r\n}\r\n\r\nconst esp = 0.002;\r\n\r\nclass SkinObject extends THREE.Group {\r\n\tconstructor(isSlim, layer1Material, layer2Material) {\r\n\t\tsuper();\r\n\r\n\t\t// Head\r\n\t\tthis.head = new THREE.Group();\r\n\r\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\r\n\t\taddVertices(headBox,\r\n\t\t\ttoSkinVertices(8, 0, 16, 8),\r\n\t\t\ttoSkinVertices(16, 0, 24, 8),\r\n\t\t\ttoSkinVertices(0, 8, 8, 16),\r\n\t\t\ttoSkinVertices(8, 8, 16, 16),\r\n\t\t\ttoSkinVertices(16, 8, 24, 16),\r\n\t\t\ttoSkinVertices(24, 8, 32, 16)\r\n\t\t);\r\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\r\n\t\tthis.head.add(headMesh);\r\n\r\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\r\n\t\taddVertices(head2Box,\r\n\t\t\ttoSkinVertices(40, 0, 48, 8),\r\n\t\t\ttoSkinVertices(48, 0, 56, 8),\r\n\t\t\ttoSkinVertices(32, 8, 40, 16),\r\n\t\t\ttoSkinVertices(40, 8, 48, 16),\r\n\t\t\ttoSkinVertices(48, 8, 56, 16),\r\n\t\t\ttoSkinVertices(56, 8, 64, 16)\r\n\t\t);\r\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\r\n\t\thead2Mesh.renderOrder = -1;\r\n\t\tthis.head.add(head2Mesh);\r\n\r\n\t\tthis.add(this.head);\r\n\r\n\r\n\t\t// Body\r\n\t\tthis.body = new THREE.Group();\r\n\r\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\r\n\t\taddVertices(bodyBox,\r\n\t\t\ttoSkinVertices(20, 16, 28, 20),\r\n\t\t\ttoSkinVertices(28, 16, 36, 20),\r\n\t\t\ttoSkinVertices(16, 20, 20, 32),\r\n\t\t\ttoSkinVertices(20, 20, 28, 32),\r\n\t\t\ttoSkinVertices(28, 20, 32, 32),\r\n\t\t\ttoSkinVertices(32, 20, 40, 32)\r\n\t\t);\r\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\r\n\t\tthis.body.add(bodyMesh);\r\n\r\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\r\n\t\taddVertices(body2Box,\r\n\t\t\ttoSkinVertices(20, 32, 28, 36),\r\n\t\t\ttoSkinVertices(28, 32, 36, 36),\r\n\t\t\ttoSkinVertices(16, 36, 20, 48),\r\n\t\t\ttoSkinVertices(20, 36, 28, 48),\r\n\t\t\ttoSkinVertices(28, 36, 32, 48),\r\n\t\t\ttoSkinVertices(32, 36, 40, 48)\r\n\t\t);\r\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\r\n\t\tthis.body.add(body2Mesh);\r\n\r\n\t\tthis.body.position.y = -10;\r\n\t\tthis.add(this.body);\r\n\r\n\r\n\t\t// Right Arm\r\n\t\tthis.rightArm = new THREE.Group();\r\n\t\tlet rightArmPivot = new THREE.Group();\r\n\r\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\r\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\r\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\r\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\r\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\r\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\r\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\r\n\t\trightArmPivot.add(rightArmMesh);\r\n\r\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\r\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\r\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\r\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\r\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\r\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\r\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\r\n\t\trightArm2Mesh.renderOrder = 1;\r\n\t\trightArmPivot.add(rightArm2Mesh);\r\n\r\n\t\trightArmPivot.position.y = -6;\r\n\t\tthis.rightArm.add(rightArmPivot);\r\n\t\tthis.rightArm.position.y = -4;\r\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\r\n\t\tthis.add(this.rightArm);\r\n\r\n\r\n\t\t// Left Arm\r\n\t\tthis.leftArm = new THREE.Group();\r\n\t\tlet leftArmPivot = new THREE.Group();\r\n\r\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\r\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\r\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\r\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\r\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\r\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\r\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\r\n\t\tleftArmPivot.add(leftArmMesh);\r\n\r\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\r\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\r\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\r\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\r\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\r\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\r\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\r\n\t\tleftArm2Mesh.renderOrder = 1;\r\n\t\tleftArmPivot.add(leftArm2Mesh);\r\n\r\n\t\tleftArmPivot.position.y = -6;\r\n\t\tthis.leftArm.add(leftArmPivot);\r\n\t\tthis.leftArm.position.y = -4;\r\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\r\n\t\tthis.add(this.leftArm);\r\n\r\n\r\n\t\t// Right Leg\r\n\t\tthis.rightLeg = new THREE.Group();\r\n\t\tlet rightLegPivot = new THREE.Group();\r\n\r\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLegBox,\r\n\t\t\ttoSkinVertices(4, 16, 8, 20),\r\n\t\t\ttoSkinVertices(8, 16, 12, 20),\r\n\t\t\ttoSkinVertices(0, 20, 4, 32),\r\n\t\t\ttoSkinVertices(4, 20, 8, 32),\r\n\t\t\ttoSkinVertices(8, 20, 12, 32),\r\n\t\t\ttoSkinVertices(12, 20, 16, 32)\r\n\t\t);\r\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\r\n\t\trightLegPivot.add(rightLegMesh);\r\n\r\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLeg2Box,\r\n\t\t\ttoSkinVertices(4, 32, 8, 36),\r\n\t\t\ttoSkinVertices(8, 32, 12, 36),\r\n\t\t\ttoSkinVertices(0, 36, 4, 48),\r\n\t\t\ttoSkinVertices(4, 36, 8, 48),\r\n\t\t\ttoSkinVertices(8, 36, 12, 48),\r\n\t\t\ttoSkinVertices(12, 36, 16, 48)\r\n\t\t);\r\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\r\n\t\trightLeg2Mesh.renderOrder = 1;\r\n\t\trightLegPivot.add(rightLeg2Mesh);\r\n\r\n\t\trightLegPivot.position.y = -6;\r\n\t\tthis.rightLeg.add(rightLegPivot);\r\n\t\tthis.rightLeg.position.y = -16;\r\n\t\tthis.rightLeg.position.x = -2;\r\n\t\tthis.add(this.rightLeg);\r\n\r\n\t\t// Left Leg\r\n\t\tthis.leftLeg = new THREE.Group();\r\n\t\tlet leftLegPivot = new THREE.Group();\r\n\r\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLegBox,\r\n\t\t\ttoSkinVertices(20, 48, 24, 52),\r\n\t\t\ttoSkinVertices(24, 48, 28, 52),\r\n\t\t\ttoSkinVertices(16, 52, 20, 64),\r\n\t\t\ttoSkinVertices(20, 52, 24, 64),\r\n\t\t\ttoSkinVertices(24, 52, 28, 64),\r\n\t\t\ttoSkinVertices(28, 52, 32, 64)\r\n\t\t);\r\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\r\n\t\tleftLegPivot.add(leftLegMesh);\r\n\r\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLeg2Box,\r\n\t\t\ttoSkinVertices(4, 48, 8, 52),\r\n\t\t\ttoSkinVertices(8, 48, 12, 52),\r\n\t\t\ttoSkinVertices(0, 52, 4, 64),\r\n\t\t\ttoSkinVertices(4, 52, 8, 64),\r\n\t\t\ttoSkinVertices(8, 52, 12, 64),\r\n\t\t\ttoSkinVertices(12, 52, 16, 64)\r\n\t\t);\r\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\r\n\t\tleftLeg2Mesh.renderOrder = 1;\r\n\t\tleftLegPivot.add(leftLeg2Mesh);\r\n\r\n\t\tleftLegPivot.position.y = -6;\r\n\t\tthis.leftLeg.add(leftLegPivot);\r\n\t\tthis.leftLeg.position.y = -16;\r\n\t\tthis.leftLeg.position.x = 2;\r\n\t\tthis.add(this.leftLeg);\r\n\t}\r\n}\r\n\r\nclass CapeObject extends THREE.Group {\r\n\tconstructor(capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\t// back = outside\r\n\t\t// front = inside\r\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\r\n\t\taddVertices(capeBox,\r\n\t\t\ttoCapeVertices(1, 0, 11, 1),\r\n\t\t\ttoCapeVertices(11, 0, 21, 1),\r\n\t\t\ttoCapeVertices(11, 1, 12, 17),\r\n\t\t\ttoCapeVertices(12, 1, 22, 17),\r\n\t\t\ttoCapeVertices(0, 1, 1, 17),\r\n\t\t\ttoCapeVertices(1, 1, 11, 17)\r\n\t\t);\r\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\r\n\t\tthis.cape.position.y = -8;\r\n\t\tthis.cape.position.z = -0.5;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nclass PlayerObject extends THREE.Group {\r\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\tthis.slim = slim;\r\n\r\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\r\n\t\tthis.skin.visible = false;\r\n\t\tthis.add(this.skin);\r\n\r\n\t\tthis.cape = new CapeObject(capeMaterial);\r\n\t\tthis.cape.position.z = -2;\r\n\t\tthis.cape.position.y = -4;\r\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\r\n\t\tthis.cape.visible = false;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nexport { SkinObject, CapeObject, PlayerObject };\r\n","import * as THREE from \"three\";\r\n\r\nclass OrbitControls extends THREE.EventDispatcher {\r\n\t/**\r\n\t * @preserve\r\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\r\n\t */\r\n\t/**\r\n\t * @license\r\n\t * Copyright (C) 2010-2017 three.js authors\r\n\t *\r\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n\t * of this software and associated documentation files (the \"Software\"), to deal\r\n\t * in the Software without restriction, including without limitation the rights\r\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\t * copies of the Software, and to permit persons to whom the Software is\r\n\t * furnished to do so, subject to the following conditions:\r\n\t *\r\n\t * The above copyright notice and this permission notice shall be included in\r\n\t * all copies or substantial portions of the Software.\r\n\t *\r\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\t * THE SOFTWARE.\r\n\t *\r\n\t *\r\n\t * @author qiao / https://github.com/qiao\r\n\t * @author mrdoob / http://mrdoob.com\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t * @author WestLangley / http://github.com/WestLangley\r\n\t * @author erich666 / http://erichaines.com\r\n\t */\r\n\r\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\r\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n\t//\r\n\t// Orbit - left mouse / touch: one finger move\r\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\r\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\r\n\r\n\tconstructor(object, domElement) {\r\n\t\tsuper();\r\n\t\tthis.object = object;\r\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\r\n\r\n\t\t// Set to false to disable this control\r\n\t\tthis.enabled = true;\r\n\r\n\t\t// \"target\" sets the location of focus, where the object orbits around\r\n\t\tthis.target = new THREE.Vector3();\r\n\r\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\r\n\t\tthis.minDistance = 0;\r\n\t\tthis.maxDistance = Infinity;\r\n\r\n\t\t// How far you can zoom in and out (OrthographicCamera only)\r\n\t\tthis.minZoom = 0;\r\n\t\tthis.maxZoom = Infinity;\r\n\r\n\t\t// How far you can orbit vertically, upper and lower limits.\r\n\t\t// Range is 0 to Math.PI radians.\r\n\t\tthis.minPolarAngle = 0; // radians\r\n\t\tthis.maxPolarAngle = Math.PI; // radians\r\n\r\n\t\t// How far you can orbit horizontally, upper and lower limits.\r\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\r\n\t\tthis.minAzimuthAngle = -Infinity; // radians\r\n\t\tthis.maxAzimuthAngle = Infinity; // radians\r\n\r\n\t\t// Set to true to enable damping (inertia)\r\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.enableDamping = false;\r\n\t\tthis.dampingFactor = 0.25;\r\n\r\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n\t\t// Set to false to disable zooming\r\n\t\tthis.enableZoom = true;\r\n\t\tthis.zoomSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable rotating\r\n\t\tthis.enableRotate = true;\r\n\t\tthis.rotateSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable panning\r\n\t\tthis.enablePan = true;\r\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\r\n\r\n\t\t// Set to true to automatically rotate around the target\r\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.autoRotate = false;\r\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\r\n\r\n\t\t// Set to false to disable use of the keys\r\n\t\tthis.enableKeys = true;\r\n\r\n\t\t// The four arrow keys\r\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\r\n\r\n\t\t// Mouse buttons\r\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\r\n\r\n\t\t// for reset\r\n\t\tthis.target0 = this.target.clone();\r\n\t\tthis.position0 = this.object.position.clone();\r\n\t\tthis.zoom0 = this.object.zoom;\r\n\r\n\t\t//\r\n\t\t// public methods\r\n\t\t//\r\n\t\tthis.getPolarAngle = function () {\r\n\t\t\treturn spherical.phi;\r\n\t\t};\r\n\t\tthis.getAzimuthalAngle = function () {\r\n\t\t\treturn spherical.theta;\r\n\t\t};\r\n\t\tthis.saveState = function () {\r\n\t\t\tscope.target0.copy(scope.target);\r\n\t\t\tscope.position0.copy(scope.object.position);\r\n\t\t\tscope.zoom0 = scope.object.zoom;\r\n\t\t};\r\n\t\tthis.reset = function () {\r\n\t\t\tscope.target.copy(scope.target0);\r\n\t\t\tscope.object.position.copy(scope.position0);\r\n\t\t\tscope.object.zoom = scope.zoom0;\r\n\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\tscope.update();\r\n\t\t\tstate = STATE.NONE;\r\n\t\t};\r\n\r\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\r\n\t\tthis.update = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\t// so camera.up is the orbit axis\r\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\r\n\t\t\tlet quatInverse = quat.clone().inverse();\r\n\t\t\tlet lastPosition = new THREE.Vector3();\r\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\r\n\t\t\treturn function update() {\r\n\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quat);\r\n\t\t\t\t// angle from z-axis around y-axis\r\n\t\t\t\tspherical.setFromVector3(offset);\r\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\r\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\r\n\t\t\t\t}\r\n\t\t\t\tspherical.theta += sphericalDelta.theta;\r\n\t\t\t\tspherical.phi += sphericalDelta.phi;\r\n\t\t\t\t// restrict theta to be between desired limits\r\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\r\n\t\t\t\t// restrict phi to be between desired limits\r\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\r\n\t\t\t\tspherical.makeSafe();\r\n\t\t\t\tspherical.radius *= scale;\r\n\t\t\t\t// restrict radius to be between desired limits\r\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\r\n\t\t\t\t// move target to panned location\r\n\t\t\t\tscope.target.add(panOffset);\r\n\t\t\t\toffset.setFromSpherical(spherical);\r\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quatInverse);\r\n\t\t\t\tposition.copy(scope.target).add(offset);\r\n\t\t\t\tscope.object.lookAt(scope.target);\r\n\t\t\t\tif (scope.enableDamping === true) {\r\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\r\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tscale = 1;\r\n\t\t\t\tpanOffset.set(0, 0, 0);\r\n\t\t\t\t// update condition is:\r\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\r\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\t\t\t\tif (zoomChanged ||\r\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\r\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\r\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\t\t\tlastPosition.copy(scope.object.position);\r\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\r\n\t\t\t\t\tzoomChanged = false;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}();\r\n\t\tthis.dispose = function () {\r\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\r\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\r\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\r\n\t\t};\r\n\t\t//\r\n\t\t// internals\r\n\t\t//\r\n\t\tlet scope = this;\r\n\t\tlet changeEvent = { type: \"change\" };\r\n\t\tlet startEvent = { type: \"start\" };\r\n\t\tlet endEvent = { type: \"end\" };\r\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\r\n\t\tlet state = STATE.NONE;\r\n\t\tlet EPS = 0.000001;\r\n\t\t// current position in spherical coordinates\r\n\t\tlet spherical = new THREE.Spherical();\r\n\t\tlet sphericalDelta = new THREE.Spherical();\r\n\t\tlet scale = 1;\r\n\t\tlet panOffset = new THREE.Vector3();\r\n\t\tlet zoomChanged = false;\r\n\t\tlet rotateStart = new THREE.Vector2();\r\n\t\tlet rotateEnd = new THREE.Vector2();\r\n\t\tlet rotateDelta = new THREE.Vector2();\r\n\t\tlet panStart = new THREE.Vector2();\r\n\t\tlet panEnd = new THREE.Vector2();\r\n\t\tlet panDelta = new THREE.Vector2();\r\n\t\tlet dollyStart = new THREE.Vector2();\r\n\t\tlet dollyEnd = new THREE.Vector2();\r\n\t\tlet dollyDelta = new THREE.Vector2();\r\n\t\tfunction getAutoRotationAngle() {\r\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\t\t}\r\n\t\tfunction getZoomScale() {\r\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\r\n\t\t}\r\n\t\tfunction rotateLeft(angle) {\r\n\t\t\tsphericalDelta.theta -= angle;\r\n\t\t}\r\n\t\tfunction rotateUp(angle) {\r\n\t\t\tsphericalDelta.phi -= angle;\r\n\t\t}\r\n\t\tlet panLeft = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panLeft(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(-distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\tlet panUp = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panUp(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\t// deltaX and deltaY are in pixels; right and down are positive\r\n\t\tlet pan = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\treturn function pan(deltaX, deltaY) {\r\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\t\t// perspective\r\n\t\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t\tlet targetDistance = offset.length();\r\n\t\t\t\t\t// half of the fov is center to top of screen\r\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\r\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\r\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\t\t// orthographic\r\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\r\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// camera neither orthographic nor perspective\r\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\r\n\t\t\t\t\tscope.enablePan = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}();\r\n\t\tfunction dollyIn(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale /= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction dollyOut(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale *= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//\r\n\t\t// event callbacks - update the object state\r\n\t\t//\r\n\t\tfunction handleMouseDownRotate(event) {\r\n\t\t\trotateStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownDolly(event) {\r\n\t\t\tdollyStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownPan(event) {\r\n\t\t\tpanStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.clientX, event.clientY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t// rotating across whole screen goes 360 degrees around\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMoveDolly(event) {\r\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMovePan(event) {\r\n\t\t\tpanEnd.set(event.clientX, event.clientY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseUp(event) {\r\n\t\t}\r\n\t\tfunction handleMouseWheel(event) {\r\n\t\t\tif (event.deltaY < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (event.deltaY > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleKeyDown(event) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase scope.keys.UP:\r\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.BOTTOM:\r\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.LEFT:\r\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.RIGHT:\r\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction handleTouchStartRotate(event) {\r\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchStartDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyStart.set(0, distance);\r\n\t\t}\r\n\t\tfunction handleTouchStartPan(event) {\r\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMoveDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyEnd.set(0, distance);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMovePan(event) {\r\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchEnd(event) {\r\n\t\t}\r\n\t\t//\r\n\t\t// event handlers - FSM: listen for events and reset state\r\n\t\t//\r\n\t\tfunction onMouseDown(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.button) {\r\n\t\t\t\tcase scope.mouseButtons.ORBIT:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownRotate(event);\r\n\t\t\t\t\tstate = STATE.ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.ZOOM:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownDolly(event);\r\n\t\t\t\t\tstate = STATE.DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownPan(event);\r\n\t\t\t\t\tstate = STATE.PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onMouseMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (state) {\r\n\t\t\t\tcase STATE.ROTATE:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.DOLLY:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tfunction onMouseUp(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleMouseUp(event);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onMouseWheel(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\thandleMouseWheel(event);\r\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t}\r\n\t\tfunction onKeyDown(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleKeyDown(event);\r\n\t\t}\r\n\t\tfunction onTouchStart(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartRotate(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartDolly(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartPan(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onTouchMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t\tfunction onTouchEnd(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleTouchEnd(event);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onContextMenu(event) {\r\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\t//\r\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\r\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\r\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\r\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\r\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\r\n\t\t// force an update at start\r\n\t\tthis.update();\r\n\t}\r\n}\r\n\r\nexport { OrbitControls };\r\n","function invokeAnimation(animation, player, time) {\r\n\tif (animation instanceof CompositeAnimation) {\r\n\t\tanimation.play(player, time);\r\n\t} else if (animation instanceof Function) {\r\n\t\tanimation(player, time);\r\n\t} else {\r\n\t\tthrow `Not an animation: ${animation}`;\r\n\t}\r\n}\r\n\r\nclass AnimationHandle {\r\n\tconstructor(animation) {\r\n\t\tthis.animation = animation;\r\n\t\tthis.paused = this._paused = false;\r\n\t\tthis.speed = this._speed = 1.0;\r\n\t\tthis._lastChange = null;\r\n\t\tthis._lastChangeX = null;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tif (this._lastChange === null) {\r\n\t\t\tthis._lastChange = time;\r\n\t\t\tthis._lastChangeX = 0;\r\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tif (this._paused === false) {\r\n\t\t\t\tthis._lastChangeX += dt * this._speed;\r\n\t\t\t}\r\n\t\t\tthis._paused = this.paused;\r\n\t\t\tthis._speed = this.speed;\r\n\t\t\tthis._lastChange = time;\r\n\t\t}\r\n\t\tif (this.paused === false) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\r\n\t\t\tinvokeAnimation(this.animation, player, x);\r\n\t\t}\r\n\t}\r\n\treset(){\r\n\t\tthis._lastChange = null;\r\n\t}\r\n}\r\n\r\nclass CompositeAnimation {\r\n\tconstructor() {\r\n\t\tthis.handles = new Set();\r\n\t}\r\n\tadd(animation) {\r\n\t\tlet handle = new AnimationHandle(animation);\r\n\t\thandle.remove = () => this.handles.delete(handle);\r\n\t\tthis.handles.add(handle);\r\n\t\treturn handle;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tthis.handles.forEach(handle => handle.play(player, time));\r\n\t}\r\n}\r\n\r\nlet WalkAnimation = (player, time) => {\r\n\tlet skin = player.skin;\r\n\tlet angleRot = time + Math.PI / 2;\r\n\r\n\t// Leg Swing\r\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\r\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\r\n\t// Arm Swing\r\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\r\n};\r\n\r\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\r\n","import * as THREE from \"three\";\r\nimport { PlayerObject } from \"./model\";\r\nimport { OrbitControls } from \"./orbit_controls\";\r\nimport { invokeAnimation } from \"./animation\";\r\n\r\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\r\n\tlet imgData = context.getImageData(sX, sY, w, h);\r\n\tif (flipHorizontal) {\r\n\t\tfor (let y = 0; y < h; y++) {\r\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\r\n\t\t\t\tlet index = (x + y * w) * 4;\r\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\r\n\t\t\t\tlet pA1 = imgData.data[index];\r\n\t\t\t\tlet pA2 = imgData.data[index + 1];\r\n\t\t\t\tlet pA3 = imgData.data[index + 2];\r\n\t\t\t\tlet pA4 = imgData.data[index + 3];\r\n\r\n\t\t\t\tlet pB1 = imgData.data[index2];\r\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\r\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\r\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\r\n\r\n\t\t\t\timgData.data[index] = pB1;\r\n\t\t\t\timgData.data[index + 1] = pB2;\r\n\t\t\t\timgData.data[index + 2] = pB3;\r\n\t\t\t\timgData.data[index + 3] = pB4;\r\n\r\n\t\t\t\timgData.data[index2] = pA1;\r\n\t\t\t\timgData.data[index2 + 1] = pA2;\r\n\t\t\t\timgData.data[index2 + 2] = pA3;\r\n\t\t\t\timgData.data[index2 + 3] = pA4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcontext.putImageData(imgData, dX, dY);\r\n}\r\n\r\nfunction convertSkinTo1_8(context, width) {\r\n\tlet scale = width / 64.0;\r\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\r\n\r\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\r\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\r\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\r\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\r\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\r\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\r\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\r\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\r\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\r\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\r\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\r\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\r\n}\r\n\r\nclass SkinViewer {\r\n\tconstructor(options) {\r\n\t\tthis.domElement = options.domElement;\r\n\t\tthis.animation = options.animation || null;\r\n\t\tthis.animationPaused = false;\r\n\t\tthis.animationTime = 0;\r\n\t\tthis.disposed = false;\r\n\r\n\t\t// texture\r\n\t\tthis.skinImg = new Image();\r\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\r\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\r\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.capeImg = new Image();\r\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\r\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\r\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\r\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\r\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\r\n\r\n\t\t// scene\r\n\t\tthis.scene = new THREE.Scene();\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\r\n\t\tthis.camera.position.y = -12;\r\n\t\tthis.camera.position.z = 30;\r\n\r\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\r\n\t\tthis.renderer.setSize(300, 300); // default size\r\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\r\n\t\tthis.domElement.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\r\n\t\tthis.scene.add(this.playerObject);\r\n\r\n\t\t// texture loading\r\n\t\tthis.skinImg.crossOrigin = \"\";\r\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\r\n\t\tthis.skinImg.onload = () => {\r\n\t\t\tlet isOldFormat = false;\r\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\r\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\r\n\t\t\t\t\tisOldFormat = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\"Bad skin size\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\r\n\t\t\tif (isOldFormat) {\r\n\t\t\t\tlet width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.width = width;\r\n\t\t\t\tthis.skinCanvas.height = width;\r\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\r\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\r\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t}\r\n\r\n\t\t\tthis.skinTexture.needsUpdate = true;\r\n\t\t\tthis.layer1Material.needsUpdate = true;\r\n\t\t\tthis.layer2Material.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.skin.visible = true;\r\n\t\t};\r\n\r\n\t\tthis.capeImg.crossOrigin = \"\";\r\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\r\n\t\tthis.capeImg.onload = () => {\r\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\r\n\t\t\t\tconsole.error(\"Bad cape size\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\r\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\r\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\r\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\r\n\t\t\tthis.capeTexture.needsUpdate = true;\r\n\t\t\tthis.capeMaterial.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.cape.visible = true;\r\n\t\t};\r\n\r\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\r\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\r\n\t\tif (options.width) this.width = options.width;\r\n\t\tif (options.height) this.height = options.height;\r\n\r\n\t\tlet draw = () => {\r\n\t\t\tif (this.disposed) return;\r\n\t\t\twindow.requestAnimationFrame(draw);\r\n\t\t\tif (!this.animationPaused) {\r\n\t\t\t\tthis.animationTime++;\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\t\tdraw();\r\n\t}\r\n\r\n\tsetSize(width, height) {\r\n\t\tthis.camera.aspect = width / height;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.disposed = true;\r\n\t\tthis.domElement.removeChild(this.renderer.domElement);\r\n\t\tthis.renderer.dispose();\r\n\t\tthis.skinTexture.dispose();\r\n\t\tthis.capeTexture.dispose();\r\n\t}\r\n\r\n\tget skinUrl() {\r\n\t\treturn this.skinImg.src;\r\n\t}\r\n\r\n\tset skinUrl(url) {\r\n\t\tthis.skinImg.src = url;\r\n\t}\r\n\r\n\tget capeUrl() {\r\n\t\treturn this.capeImg.src;\r\n\t}\r\n\r\n\tset capeUrl(url) {\r\n\t\tthis.capeImg.src = url;\r\n\t}\r\n\r\n\tget width() {\r\n\t\treturn this.renderer.getSize().width;\r\n\t}\r\n\r\n\tset width(newWidth) {\r\n\t\tthis.setSize(newWidth, this.height);\r\n\t}\r\n\r\n\tget height() {\r\n\t\treturn this.renderer.getSize().height;\r\n\t}\r\n\r\n\tset height(newHeight) {\r\n\t\tthis.setSize(this.width, newHeight);\r\n\t}\r\n}\r\n\r\nclass SkinControl {\r\n\tconstructor(skinViewer) {\r\n\t\tthis.enableAnimationControl = true;\r\n\t\tthis.skinViewer = skinViewer;\r\n\r\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\r\n\t\tthis.orbitControls.enablePan = false;\r\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\r\n\t\tthis.orbitControls.minDistance = 10;\r\n\t\tthis.orbitControls.maxDistance = 256;\r\n\t\tthis.orbitControls.update();\r\n\r\n\t\tthis.animationPauseListener = e => {\r\n\t\t\tif (this.enableAnimationControl) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t\tthis.orbitControls.dispose();\r\n\t}\r\n}\r\n\r\nexport { SkinViewer, SkinControl };\r\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","_this","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","_this2","PlayerObject","slim","skin","visible","_this3","rotation","Math","PI","OrbitControls","object","domElement","offset","quat","quatInverse","lastPosition","lastQuaternion","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","copy","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","STATE","NONE","setFromUnitVectors","up","inverse","sub","applyQuaternion","setFromVector3","state","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","rotateLeft","angle","rotateUp","v","panLeft","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","warn","dollyIn","dollyScale","dollyOut","event","button","clientX","clientY","preventDefault","addEventListener","subVectors","stopPropagation","keyCode","touches","pageX","pageY","dx","dy","sqrt","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","this","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","angleRot","alpha","antialias","setSize","context","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","console","error","src","onload","isOldFormat","width","height","skinContext","getContext","clearRect","drawImage","copySkin","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","copyImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener","cos"],"mappings":"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"} \ No newline at end of file diff --git a/js/skinview3d.module.js b/js/skinview3d.module.js new file mode 100644 index 0000000..0f9e243 --- /dev/null +++ b/js/skinview3d.module.js @@ -0,0 +1,1238 @@ +import { Vector2, Group, BoxGeometry, Mesh, Texture, NearestFilter, NearestMipMapNearestFilter, MeshBasicMaterial, FrontSide, DoubleSide, Scene, PerspectiveCamera, WebGLRenderer, Vector3, MOUSE, Quaternion, Spherical, OrthographicCamera, EventDispatcher } from 'three'; + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +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; + }; +}(); + + + + + + + + + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +function toFaceVertices(x1, y1, x2, y2, w, h) { + return [new Vector2(x1 / w, 1.0 - y2 / h), new Vector2(x2 / w, 1.0 - y2 / h), new Vector2(x2 / w, 1.0 - y1 / h), new Vector2(x1 / w, 1.0 - y1 / h)]; +} + +function toSkinVertices(x1, y1, x2, y2) { + return toFaceVertices(x1, y1, x2, y2, 64.0, 64.0); +} + +function toCapeVertices(x1, y1, x2, y2) { + return toFaceVertices(x1, y1, x2, y2, 64.0, 32.0); +} + +function addVertices(box, top, bottom, left, front, right, back) { + box.faceVertexUvs[0] = []; + box.faceVertexUvs[0][0] = [right[3], right[0], right[2]]; + box.faceVertexUvs[0][1] = [right[0], right[1], right[2]]; + box.faceVertexUvs[0][2] = [left[3], left[0], left[2]]; + box.faceVertexUvs[0][3] = [left[0], left[1], left[2]]; + box.faceVertexUvs[0][4] = [top[3], top[0], top[2]]; + box.faceVertexUvs[0][5] = [top[0], top[1], top[2]]; + box.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]]; + box.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]]; + box.faceVertexUvs[0][8] = [front[3], front[0], front[2]]; + box.faceVertexUvs[0][9] = [front[0], front[1], front[2]]; + box.faceVertexUvs[0][10] = [back[3], back[0], back[2]]; + box.faceVertexUvs[0][11] = [back[0], back[1], back[2]]; +} + +var esp = 0.002; + +var SkinObject = function (_THREE$Group) { + inherits(SkinObject, _THREE$Group); + + function SkinObject(isSlim, layer1Material, layer2Material) { + classCallCheck(this, SkinObject); + + // Head + var _this = possibleConstructorReturn(this, (SkinObject.__proto__ || Object.getPrototypeOf(SkinObject)).call(this)); + + _this.head = new Group(); + + var headBox = new BoxGeometry(8, 8, 8, 0, 0, 0); + addVertices(headBox, toSkinVertices(8, 0, 16, 8), toSkinVertices(16, 0, 24, 8), toSkinVertices(0, 8, 8, 16), toSkinVertices(8, 8, 16, 16), toSkinVertices(16, 8, 24, 16), toSkinVertices(24, 8, 32, 16)); + var headMesh = new Mesh(headBox, layer1Material); + _this.head.add(headMesh); + + var head2Box = new BoxGeometry(9, 9, 9, 0, 0, 0); + addVertices(head2Box, toSkinVertices(40, 0, 48, 8), toSkinVertices(48, 0, 56, 8), toSkinVertices(32, 8, 40, 16), toSkinVertices(40, 8, 48, 16), toSkinVertices(48, 8, 56, 16), toSkinVertices(56, 8, 64, 16)); + var head2Mesh = new Mesh(head2Box, layer2Material); + head2Mesh.renderOrder = -1; + _this.head.add(head2Mesh); + + _this.add(_this.head); + + // Body + _this.body = new Group(); + + var bodyBox = new BoxGeometry(8, 12, 4, 0, 0, 0); + addVertices(bodyBox, toSkinVertices(20, 16, 28, 20), toSkinVertices(28, 16, 36, 20), toSkinVertices(16, 20, 20, 32), toSkinVertices(20, 20, 28, 32), toSkinVertices(28, 20, 32, 32), toSkinVertices(32, 20, 40, 32)); + var bodyMesh = new Mesh(bodyBox, layer1Material); + _this.body.add(bodyMesh); + + var body2Box = new BoxGeometry(9, 13.5, 4.5, 0, 0, 0); + addVertices(body2Box, toSkinVertices(20, 32, 28, 36), toSkinVertices(28, 32, 36, 36), toSkinVertices(16, 36, 20, 48), toSkinVertices(20, 36, 28, 48), toSkinVertices(28, 36, 32, 48), toSkinVertices(32, 36, 40, 48)); + var body2Mesh = new Mesh(body2Box, layer2Material); + _this.body.add(body2Mesh); + + _this.body.position.y = -10; + _this.add(_this.body); + + // Right Arm + _this.rightArm = new Group(); + var rightArmPivot = new Group(); + + var rightArmBox = new BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); + if (isSlim) { + addVertices(rightArmBox, toSkinVertices(44, 16, 47, 20), toSkinVertices(47, 16, 50, 20), toSkinVertices(40, 20, 44, 32), toSkinVertices(44, 20, 47, 32), toSkinVertices(47, 20, 51, 32), toSkinVertices(51, 20, 54, 32)); + } else { + addVertices(rightArmBox, toSkinVertices(44, 16, 48, 20), toSkinVertices(48, 16, 52, 20), toSkinVertices(40, 20, 44, 32), toSkinVertices(44, 20, 48, 32), toSkinVertices(48, 20, 52, 32), toSkinVertices(52, 20, 56, 32)); + } + var rightArmMesh = new Mesh(rightArmBox, layer1Material); + rightArmPivot.add(rightArmMesh); + + var rightArm2Box = new BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + if (isSlim) { + addVertices(rightArm2Box, toSkinVertices(44, 32, 47, 36), toSkinVertices(47, 32, 50, 36), toSkinVertices(40, 36, 44, 48), toSkinVertices(44, 36, 47, 48), toSkinVertices(47, 36, 51, 48), toSkinVertices(51, 36, 54, 48)); + } else { + addVertices(rightArm2Box, toSkinVertices(44, 32, 48, 36), toSkinVertices(48, 32, 52, 36), toSkinVertices(40, 36, 44, 48), toSkinVertices(44, 36, 48, 48), toSkinVertices(48, 36, 52, 48), toSkinVertices(52, 36, 56, 48)); + } + var rightArm2Mesh = new Mesh(rightArm2Box, layer2Material); + rightArm2Mesh.renderOrder = 1; + rightArmPivot.add(rightArm2Mesh); + + rightArmPivot.position.y = -6; + _this.rightArm.add(rightArmPivot); + _this.rightArm.position.y = -4; + _this.rightArm.position.x = isSlim ? -5.5 : -6; + _this.add(_this.rightArm); + + // Left Arm + _this.leftArm = new Group(); + var leftArmPivot = new Group(); + + var leftArmBox = new BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); + if (isSlim) { + addVertices(leftArmBox, toSkinVertices(36, 48, 39, 52), toSkinVertices(39, 48, 42, 52), toSkinVertices(32, 52, 36, 64), toSkinVertices(36, 52, 39, 64), toSkinVertices(39, 52, 43, 64), toSkinVertices(43, 52, 46, 64)); + } else { + addVertices(leftArmBox, toSkinVertices(36, 48, 40, 52), toSkinVertices(40, 48, 44, 52), toSkinVertices(32, 52, 36, 64), toSkinVertices(36, 52, 40, 64), toSkinVertices(40, 52, 44, 64), toSkinVertices(44, 52, 48, 64)); + } + var leftArmMesh = new Mesh(leftArmBox, layer1Material); + leftArmPivot.add(leftArmMesh); + + var leftArm2Box = new BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + if (isSlim) { + addVertices(leftArm2Box, toSkinVertices(52, 48, 55, 52), toSkinVertices(55, 48, 58, 52), toSkinVertices(48, 52, 52, 64), toSkinVertices(52, 52, 55, 64), toSkinVertices(55, 52, 59, 64), toSkinVertices(59, 52, 62, 64)); + } else { + addVertices(leftArm2Box, toSkinVertices(52, 48, 56, 52), toSkinVertices(56, 48, 60, 52), toSkinVertices(48, 52, 52, 64), toSkinVertices(52, 52, 56, 64), toSkinVertices(56, 52, 60, 64), toSkinVertices(60, 52, 64, 64)); + } + var leftArm2Mesh = new Mesh(leftArm2Box, layer2Material); + leftArm2Mesh.renderOrder = 1; + leftArmPivot.add(leftArm2Mesh); + + leftArmPivot.position.y = -6; + _this.leftArm.add(leftArmPivot); + _this.leftArm.position.y = -4; + _this.leftArm.position.x = isSlim ? 5.5 : 6; + _this.add(_this.leftArm); + + // Right Leg + _this.rightLeg = new Group(); + var rightLegPivot = new Group(); + + var rightLegBox = new BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0); + addVertices(rightLegBox, toSkinVertices(4, 16, 8, 20), toSkinVertices(8, 16, 12, 20), toSkinVertices(0, 20, 4, 32), toSkinVertices(4, 20, 8, 32), toSkinVertices(8, 20, 12, 32), toSkinVertices(12, 20, 16, 32)); + var rightLegMesh = new Mesh(rightLegBox, layer1Material); + rightLegPivot.add(rightLegMesh); + + var rightLeg2Box = new BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + addVertices(rightLeg2Box, toSkinVertices(4, 32, 8, 36), toSkinVertices(8, 32, 12, 36), toSkinVertices(0, 36, 4, 48), toSkinVertices(4, 36, 8, 48), toSkinVertices(8, 36, 12, 48), toSkinVertices(12, 36, 16, 48)); + var rightLeg2Mesh = new Mesh(rightLeg2Box, layer2Material); + rightLeg2Mesh.renderOrder = 1; + rightLegPivot.add(rightLeg2Mesh); + + rightLegPivot.position.y = -6; + _this.rightLeg.add(rightLegPivot); + _this.rightLeg.position.y = -16; + _this.rightLeg.position.x = -2; + _this.add(_this.rightLeg); + + // Left Leg + _this.leftLeg = new Group(); + var leftLegPivot = new Group(); + + var leftLegBox = new BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0); + addVertices(leftLegBox, toSkinVertices(20, 48, 24, 52), toSkinVertices(24, 48, 28, 52), toSkinVertices(16, 52, 20, 64), toSkinVertices(20, 52, 24, 64), toSkinVertices(24, 52, 28, 64), toSkinVertices(28, 52, 32, 64)); + var leftLegMesh = new Mesh(leftLegBox, layer1Material); + leftLegPivot.add(leftLegMesh); + + var leftLeg2Box = new BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); + addVertices(leftLeg2Box, toSkinVertices(4, 48, 8, 52), toSkinVertices(8, 48, 12, 52), toSkinVertices(0, 52, 4, 64), toSkinVertices(4, 52, 8, 64), toSkinVertices(8, 52, 12, 64), toSkinVertices(12, 52, 16, 64)); + var leftLeg2Mesh = new Mesh(leftLeg2Box, layer2Material); + leftLeg2Mesh.renderOrder = 1; + leftLegPivot.add(leftLeg2Mesh); + + leftLegPivot.position.y = -6; + _this.leftLeg.add(leftLegPivot); + _this.leftLeg.position.y = -16; + _this.leftLeg.position.x = 2; + _this.add(_this.leftLeg); + return _this; + } + + return SkinObject; +}(Group); + +var CapeObject = function (_THREE$Group2) { + inherits(CapeObject, _THREE$Group2); + + function CapeObject(capeMaterial) { + classCallCheck(this, CapeObject); + + // back = outside + // front = inside + var _this2 = possibleConstructorReturn(this, (CapeObject.__proto__ || Object.getPrototypeOf(CapeObject)).call(this)); + + var capeBox = new BoxGeometry(10, 16, 1, 0, 0, 0); + addVertices(capeBox, toCapeVertices(1, 0, 11, 1), toCapeVertices(11, 0, 21, 1), toCapeVertices(11, 1, 12, 17), toCapeVertices(12, 1, 22, 17), toCapeVertices(0, 1, 1, 17), toCapeVertices(1, 1, 11, 17)); + _this2.cape = new Mesh(capeBox, capeMaterial); + _this2.cape.position.y = -8; + _this2.cape.position.z = -0.5; + _this2.add(_this2.cape); + return _this2; + } + + return CapeObject; +}(Group); + +var PlayerObject = function (_THREE$Group3) { + inherits(PlayerObject, _THREE$Group3); + + function PlayerObject(slim, layer1Material, layer2Material, capeMaterial) { + classCallCheck(this, PlayerObject); + + var _this3 = possibleConstructorReturn(this, (PlayerObject.__proto__ || Object.getPrototypeOf(PlayerObject)).call(this)); + + _this3.slim = slim; + + _this3.skin = new SkinObject(slim, layer1Material, layer2Material); + _this3.skin.visible = false; + _this3.add(_this3.skin); + + _this3.cape = new CapeObject(capeMaterial); + _this3.cape.position.z = -2; + _this3.cape.position.y = -4; + _this3.cape.rotation.x = 25 * Math.PI / 180; + _this3.cape.visible = false; + _this3.add(_this3.cape); + return _this3; + } + + return PlayerObject; +}(Group); + +var OrbitControls = function (_THREE$EventDispatche) { + inherits(OrbitControls, _THREE$EventDispatche); + + /** + * @preserve + * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js + */ + /** + * @license + * Copyright (C) 2010-2017 three.js authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + + // This set of controls performs orbiting, dollying (zooming), and panning. + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finger swipe + + function OrbitControls(object, domElement) { + classCallCheck(this, OrbitControls); + + var _this = possibleConstructorReturn(this, (OrbitControls.__proto__ || Object.getPrototypeOf(OrbitControls)).call(this)); + + _this.object = object; + _this.domElement = domElement !== undefined ? domElement : document; + + // Set to false to disable this control + _this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + _this.target = new Vector3(); + + // How far you can dolly in and out (PerspectiveCamera only) + _this.minDistance = 0; + _this.maxDistance = Infinity; + + // How far you can zoom in and out (OrthographicCamera only) + _this.minZoom = 0; + _this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + _this.minPolarAngle = 0; // radians + _this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + _this.minAzimuthAngle = -Infinity; // radians + _this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + _this.enableDamping = false; + _this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + _this.enableZoom = true; + _this.zoomSpeed = 1.0; + + // Set to false to disable rotating + _this.enableRotate = true; + _this.rotateSpeed = 1.0; + + // Set to false to disable panning + _this.enablePan = true; + _this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + _this.autoRotate = false; + _this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + _this.enableKeys = true; + + // The four arrow keys + _this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + _this.mouseButtons = { ORBIT: MOUSE.LEFT, ZOOM: MOUSE.MIDDLE, PAN: MOUSE.RIGHT }; + + // for reset + _this.target0 = _this.target.clone(); + _this.position0 = _this.object.position.clone(); + _this.zoom0 = _this.object.zoom; + + // + // public methods + // + _this.getPolarAngle = function () { + return spherical.phi; + }; + _this.getAzimuthalAngle = function () { + return spherical.theta; + }; + _this.saveState = function () { + scope.target0.copy(scope.target); + scope.position0.copy(scope.object.position); + scope.zoom0 = scope.object.zoom; + }; + _this.reset = function () { + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + scope.object.updateProjectionMatrix(); + scope.dispatchEvent(changeEvent); + scope.update(); + state = STATE.NONE; + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + _this.update = function () { + var offset = new Vector3(); + // so camera.up is the orbit axis + var quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0)); + var quatInverse = quat.clone().inverse(); + var lastPosition = new Vector3(); + var lastQuaternion = new Quaternion(); + return function update() { + var position = scope.object.position; + offset.copy(position).sub(scope.target); + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + // angle from z-axis around y-axis + spherical.setFromVector3(offset); + if (scope.autoRotate && state === STATE.NONE) { + rotateLeft(getAutoRotationAngle()); + } + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + // restrict theta to be between desired limits + spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); + // restrict phi to be between desired limits + spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); + spherical.makeSafe(); + spherical.radius *= scale; + // restrict radius to be between desired limits + spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); + // move target to panned location + scope.target.add(panOffset); + offset.setFromSpherical(spherical); + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + position.copy(scope.target).add(offset); + scope.object.lookAt(scope.target); + if (scope.enableDamping === true) { + sphericalDelta.theta *= 1 - scope.dampingFactor; + sphericalDelta.phi *= 1 - scope.dampingFactor; + } else { + sphericalDelta.set(0, 0, 0); + } + scale = 1; + panOffset.set(0, 0, 0); + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { + scope.dispatchEvent(changeEvent); + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + return true; + } + return false; + }; + }(); + _this.dispose = function () { + scope.domElement.removeEventListener("contextmenu", onContextMenu, false); + scope.domElement.removeEventListener("mousedown", onMouseDown, false); + scope.domElement.removeEventListener("wheel", onMouseWheel, false); + scope.domElement.removeEventListener("touchstart", onTouchStart, false); + scope.domElement.removeEventListener("touchend", onTouchEnd, false); + scope.domElement.removeEventListener("touchmove", onTouchMove, false); + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + window.removeEventListener("keydown", onKeyDown, false); + //scope.dispatchEvent({ type: "dispose" }); // should this be added here? + }; + // + // internals + // + var scope = _this; + var changeEvent = { type: "change" }; + var startEvent = { type: "start" }; + var endEvent = { type: "end" }; + var STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; + var state = STATE.NONE; + var EPS = 0.000001; + // current position in spherical coordinates + var spherical = new Spherical(); + var sphericalDelta = new Spherical(); + var scale = 1; + var panOffset = new Vector3(); + var zoomChanged = false; + var rotateStart = new Vector2(); + var rotateEnd = new Vector2(); + var rotateDelta = new Vector2(); + var panStart = new Vector2(); + var panEnd = new Vector2(); + var panDelta = new Vector2(); + var dollyStart = new Vector2(); + var dollyEnd = new Vector2(); + var dollyDelta = new Vector2(); + function getAutoRotationAngle() { + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + } + function getZoomScale() { + return Math.pow(0.95, scope.zoomSpeed); + } + function rotateLeft(angle) { + sphericalDelta.theta -= angle; + } + function rotateUp(angle) { + sphericalDelta.phi -= angle; + } + var panLeft = function () { + var v = new Vector3(); + return function panLeft(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + v.multiplyScalar(-distance); + panOffset.add(v); + }; + }(); + var panUp = function () { + var v = new Vector3(); + return function panUp(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix + v.multiplyScalar(distance); + panOffset.add(v); + }; + }(); + // deltaX and deltaY are in pixels; right and down are positive + var pan = function () { + var offset = new Vector3(); + return function pan(deltaX, deltaY) { + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + if (scope.object instanceof PerspectiveCamera) { + // perspective + var position = scope.object.position; + offset.copy(position).sub(scope.target); + var targetDistance = offset.length(); + // half of the fov is center to top of screen + targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0); + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); + } else if (scope.object instanceof OrthographicCamera) { + // orthographic + panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); + panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); + } else { + // camera neither orthographic nor perspective + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); + scope.enablePan = false; + } + }; + }(); + function dollyIn(dollyScale) { + if (scope.object instanceof PerspectiveCamera) { + scale /= dollyScale; + } else if (scope.object instanceof OrthographicCamera) { + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); + scope.enableZoom = false; + } + } + function dollyOut(dollyScale) { + if (scope.object instanceof PerspectiveCamera) { + scale *= dollyScale; + } else if (scope.object instanceof OrthographicCamera) { + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); + scope.enableZoom = false; + } + } + // + // event callbacks - update the object state + // + function handleMouseDownRotate(event) { + rotateStart.set(event.clientX, event.clientY); + } + function handleMouseDownDolly(event) { + dollyStart.set(event.clientX, event.clientY); + } + function handleMouseDownPan(event) { + panStart.set(event.clientX, event.clientY); + } + function handleMouseMoveRotate(event) { + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + // rotating across whole screen goes 360 degrees around + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + rotateStart.copy(rotateEnd); + scope.update(); + } + function handleMouseMoveDolly(event) { + dollyEnd.set(event.clientX, event.clientY); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) { + dollyIn(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyOut(getZoomScale()); + } + dollyStart.copy(dollyEnd); + scope.update(); + } + function handleMouseMovePan(event) { + panEnd.set(event.clientX, event.clientY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + scope.update(); + } + function handleMouseWheel(event) { + if (event.deltaY < 0) { + dollyOut(getZoomScale()); + } else if (event.deltaY > 0) { + dollyIn(getZoomScale()); + } + scope.update(); + } + function handleKeyDown(event) { + switch (event.keyCode) { + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + scope.update(); + break; + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + scope.update(); + break; + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + scope.update(); + break; + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + scope.update(); + break; + } + } + function handleTouchStartRotate(event) { + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + function handleTouchStartDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyStart.set(0, distance); + } + function handleTouchStartPan(event) { + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + function handleTouchMoveRotate(event) { + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + rotateStart.copy(rotateEnd); + scope.update(); + } + function handleTouchMoveDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyEnd.set(0, distance); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) { + dollyOut(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyIn(getZoomScale()); + } + dollyStart.copy(dollyEnd); + scope.update(); + } + function handleTouchMovePan(event) { + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + scope.update(); + } + function onMouseDown(event) { + if (scope.enabled === false) return; + switch (event.button) { + case scope.mouseButtons.ORBIT: + if (scope.enableRotate === false) return; + handleMouseDownRotate(event); + state = STATE.ROTATE; + break; + case scope.mouseButtons.ZOOM: + if (scope.enableZoom === false) return; + handleMouseDownDolly(event); + state = STATE.DOLLY; + break; + case scope.mouseButtons.PAN: + if (scope.enablePan === false) return; + handleMouseDownPan(event); + state = STATE.PAN; + break; + } + event.preventDefault(); + if (state !== STATE.NONE) { + document.addEventListener("mousemove", onMouseMove, false); + document.addEventListener("mouseup", onMouseUp, false); + scope.dispatchEvent(startEvent); + } + } + function onMouseMove(event) { + if (scope.enabled === false) return; + switch (state) { + case STATE.ROTATE: + if (scope.enableRotate === false) return; + handleMouseMoveRotate(event); + break; + case STATE.DOLLY: + if (scope.enableZoom === false) return; + handleMouseMoveDolly(event); + break; + case STATE.PAN: + if (scope.enablePan === false) return; + handleMouseMovePan(event); + break; + } + event.preventDefault(); + } + function onMouseUp(event) { + if (scope.enabled === false) return; + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + scope.dispatchEvent(endEvent); + state = STATE.NONE; + } + function onMouseWheel(event) { + if (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE && state !== STATE.ROTATE) return; + event.preventDefault(); + event.stopPropagation(); + handleMouseWheel(event); + scope.dispatchEvent(startEvent); // not sure why these are here... + scope.dispatchEvent(endEvent); + } + function onKeyDown(event) { + if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return; + handleKeyDown(event); + } + function onTouchStart(event) { + if (scope.enabled === false) return; + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (scope.enableRotate === false) return; + handleTouchStartRotate(event); + state = STATE.TOUCH_ROTATE; + break; + case 2: + // two-fingered touch: dolly + if (scope.enableZoom === false) return; + handleTouchStartDolly(event); + state = STATE.TOUCH_DOLLY; + break; + case 3: + // three-fingered touch: pan + if (scope.enablePan === false) return; + handleTouchStartPan(event); + state = STATE.TOUCH_PAN; + break; + default: + state = STATE.NONE; + } + if (state !== STATE.NONE) { + scope.dispatchEvent(startEvent); + } + } + function onTouchMove(event) { + if (scope.enabled === false) return; + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (scope.enableRotate === false) return; + if (state !== STATE.TOUCH_ROTATE) return; // is this needed?... + handleTouchMoveRotate(event); + break; + case 2: + // two-fingered touch: dolly + if (scope.enableZoom === false) return; + if (state !== STATE.TOUCH_DOLLY) return; // is this needed?... + handleTouchMoveDolly(event); + break; + case 3: + // three-fingered touch: pan + if (scope.enablePan === false) return; + if (state !== STATE.TOUCH_PAN) return; // is this needed?... + handleTouchMovePan(event); + break; + default: + state = STATE.NONE; + } + event.preventDefault(); + event.stopPropagation(); + } + function onTouchEnd(event) { + if (scope.enabled === false) return; + scope.dispatchEvent(endEvent); + state = STATE.NONE; + } + function onContextMenu(event) { + if (scope.enabled === false || scope.enablePan === false) return; + event.preventDefault(); + } + // + scope.domElement.addEventListener("contextmenu", onContextMenu, false); + scope.domElement.addEventListener("mousedown", onMouseDown, false); + scope.domElement.addEventListener("wheel", onMouseWheel, false); + scope.domElement.addEventListener("touchstart", onTouchStart, false); + scope.domElement.addEventListener("touchend", onTouchEnd, false); + scope.domElement.addEventListener("touchmove", onTouchMove, false); + window.addEventListener("keydown", onKeyDown, false); + // force an update at start + _this.update(); + return _this; + } + + return OrbitControls; +}(EventDispatcher); + +function invokeAnimation(animation, player, time) { + if (animation instanceof CompositeAnimation) { + animation.play(player, time); + } else if (animation instanceof Function) { + animation(player, time); + } else { + throw "Not an animation: " + animation; + } +} + +var AnimationHandle = function () { + function AnimationHandle(animation) { + classCallCheck(this, AnimationHandle); + + this.animation = animation; + this.paused = this._paused = false; + this.speed = this._speed = 1.0; + this._lastChange = null; + this._lastChangeX = null; + } + + createClass(AnimationHandle, [{ + key: "play", + value: function play(player, time) { + if (this._lastChange === null) { + this._lastChange = time; + this._lastChangeX = 0; + } else if (this.paused !== this._paused || this.speed !== this._speed) { + var dt = time - this._lastChange; + if (this._paused === false) { + this._lastChangeX += dt * this._speed; + } + this._paused = this.paused; + this._speed = this.speed; + this._lastChange = time; + } + if (this.paused === false) { + var _dt = time - this._lastChange; + var x = this._lastChangeX + this.speed * _dt; + invokeAnimation(this.animation, player, x); + } + } + }, { + key: "reset", + value: function reset() { + this._lastChange = null; + } + }]); + return AnimationHandle; +}(); + +var CompositeAnimation = function () { + function CompositeAnimation() { + classCallCheck(this, CompositeAnimation); + + this.handles = new Set(); + } + + createClass(CompositeAnimation, [{ + key: "add", + value: function add(animation) { + var _this = this; + + var handle = new AnimationHandle(animation); + handle.remove = function () { + return _this.handles.delete(handle); + }; + this.handles.add(handle); + return handle; + } + }, { + key: "play", + value: function play(player, time) { + this.handles.forEach(function (handle) { + return handle.play(player, time); + }); + } + }]); + return CompositeAnimation; +}(); + +var WalkAnimation = function WalkAnimation(player, time) { + var skin = player.skin; + var angleRot = time + Math.PI / 2; + + // Leg Swing + skin.leftLeg.rotation.x = Math.cos(angleRot); + skin.rightLeg.rotation.x = Math.cos(angleRot + Math.PI); + + // Arm Swing + skin.leftArm.rotation.x = Math.cos(angleRot + Math.PI); + skin.rightArm.rotation.x = Math.cos(angleRot); +}; + +function copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) { + var imgData = context.getImageData(sX, sY, w, h); + if (flipHorizontal) { + for (var y = 0; y < h; y++) { + for (var x = 0; x < w / 2; x++) { + var index = (x + y * w) * 4; + var index2 = (w - x - 1 + y * w) * 4; + var pA1 = imgData.data[index]; + var pA2 = imgData.data[index + 1]; + var pA3 = imgData.data[index + 2]; + var pA4 = imgData.data[index + 3]; + + var pB1 = imgData.data[index2]; + var pB2 = imgData.data[index2 + 1]; + var pB3 = imgData.data[index2 + 2]; + var pB4 = imgData.data[index2 + 3]; + + imgData.data[index] = pB1; + imgData.data[index + 1] = pB2; + imgData.data[index + 2] = pB3; + imgData.data[index + 3] = pB4; + + imgData.data[index2] = pA1; + imgData.data[index2 + 1] = pA2; + imgData.data[index2 + 2] = pA3; + imgData.data[index2 + 3] = pA4; + } + } + } + context.putImageData(imgData, dX, dY); +} + +function convertSkinTo1_8(context, width) { + var scale = width / 64.0; + var copySkin = function copySkin(context, sX, sY, w, h, dX, dY, flipHorizontal) { + return copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal); + }; + + copySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg + copySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg + copySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg + copySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg + copySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg + copySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg + copySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm + copySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm + copySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm + copySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm + copySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm + copySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm +} + +var SkinViewer = function () { + function SkinViewer(options) { + var _this = this; + + classCallCheck(this, SkinViewer); + + this.domElement = options.domElement; + this.animation = options.animation || null; + this.animationPaused = false; + this.animationTime = 0; + this.disposed = false; + + // texture + this.skinImg = new Image(); + this.skinCanvas = document.createElement("canvas"); + this.skinTexture = new Texture(this.skinCanvas); + this.skinTexture.magFilter = NearestFilter; + this.skinTexture.minFilter = NearestMipMapNearestFilter; + + this.capeImg = new Image(); + this.capeCanvas = document.createElement("canvas"); + this.capeTexture = new Texture(this.capeCanvas); + this.capeTexture.magFilter = NearestFilter; + this.capeTexture.minFilter = NearestMipMapNearestFilter; + + this.layer1Material = new MeshBasicMaterial({ map: this.skinTexture, side: FrontSide }); + this.layer2Material = new MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: DoubleSide }); + this.capeMaterial = new MeshBasicMaterial({ map: this.capeTexture }); + + // scene + this.scene = new Scene(); + + this.camera = new PerspectiveCamera(75); + this.camera.position.y = -12; + this.camera.position.z = 30; + + this.renderer = new WebGLRenderer({ angleRot: true, alpha: true, antialias: false }); + this.renderer.setSize(300, 300); // default size + this.renderer.context.getShaderInfoLog = function () { + return ""; + }; // shut firefox up + this.domElement.appendChild(this.renderer.domElement); + + this.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial); + this.scene.add(this.playerObject); + + // texture loading + this.skinImg.crossOrigin = ""; + this.skinImg.onerror = function () { + return console.error("Failed loading " + _this.skinImg.src); + }; + this.skinImg.onload = function () { + var isOldFormat = false; + if (_this.skinImg.width !== _this.skinImg.height) { + if (_this.skinImg.width === 2 * _this.skinImg.height) { + isOldFormat = true; + } else { + console.error("Bad skin size"); + return; + } + } + + var skinContext = _this.skinCanvas.getContext("2d"); + if (isOldFormat) { + var width = _this.skinImg.width; + _this.skinCanvas.width = width; + _this.skinCanvas.height = width; + skinContext.clearRect(0, 0, width, width); + skinContext.drawImage(_this.skinImg, 0, 0, width, width / 2.0); + convertSkinTo1_8(skinContext, width); + } else { + _this.skinCanvas.width = _this.skinImg.width; + _this.skinCanvas.height = _this.skinImg.height; + skinContext.clearRect(0, 0, _this.skinCanvas.width, _this.skinCanvas.height); + skinContext.drawImage(_this.skinImg, 0, 0, _this.skinCanvas.width, _this.skinCanvas.height); + } + + _this.skinTexture.needsUpdate = true; + _this.layer1Material.needsUpdate = true; + _this.layer2Material.needsUpdate = true; + + _this.playerObject.skin.visible = true; + }; + + this.capeImg.crossOrigin = ""; + this.capeImg.onerror = function () { + return console.error("Failed loading " + _this.capeImg.src); + }; + this.capeImg.onload = function () { + if (_this.capeImg.width !== 2 * _this.capeImg.height) { + console.error("Bad cape size"); + return; + } + + _this.capeCanvas.width = _this.capeImg.width; + _this.capeCanvas.height = _this.capeImg.height; + var capeContext = _this.capeCanvas.getContext("2d"); + capeContext.clearRect(0, 0, _this.capeCanvas.width, _this.capeCanvas.height); + capeContext.drawImage(_this.capeImg, 0, 0, _this.capeCanvas.width, _this.capeCanvas.height); + + _this.capeTexture.needsUpdate = true; + _this.capeMaterial.needsUpdate = true; + + _this.playerObject.cape.visible = true; + }; + + if (options.skinUrl) this.skinUrl = options.skinUrl; + if (options.capeUrl) this.capeUrl = options.capeUrl; + if (options.width) this.width = options.width; + if (options.height) this.height = options.height; + + var draw = function draw() { + if (_this.disposed) return; + window.requestAnimationFrame(draw); + if (!_this.animationPaused) { + _this.animationTime++; + if (_this.animation) { + invokeAnimation(_this.animation, _this.playerObject, _this.animationTime / 100.0); + } + } + _this.renderer.render(_this.scene, _this.camera); + }; + draw(); + } + + createClass(SkinViewer, [{ + key: "setSize", + value: function setSize(width, height) { + this.camera.aspect = width / height; + this.camera.updateProjectionMatrix(); + this.renderer.setSize(width, height); + } + }, { + key: "dispose", + value: function dispose() { + this.disposed = true; + this.domElement.removeChild(this.renderer.domElement); + this.renderer.dispose(); + this.skinTexture.dispose(); + this.capeTexture.dispose(); + } + }, { + key: "skinUrl", + get: function get$$1() { + return this.skinImg.src; + }, + set: function set$$1(url) { + this.skinImg.src = url; + } + }, { + key: "capeUrl", + get: function get$$1() { + return this.capeImg.src; + }, + set: function set$$1(url) { + this.capeImg.src = url; + } + }, { + key: "width", + get: function get$$1() { + return this.renderer.getSize().width; + }, + set: function set$$1(newWidth) { + this.setSize(newWidth, this.height); + } + }, { + key: "height", + get: function get$$1() { + return this.renderer.getSize().height; + }, + set: function set$$1(newHeight) { + this.setSize(this.width, newHeight); + } + }]); + return SkinViewer; +}(); + +var SkinControl = function () { + function SkinControl(skinViewer) { + var _this2 = this; + + classCallCheck(this, SkinControl); + + this.enableAnimationControl = true; + this.skinViewer = skinViewer; + + this.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement); + this.orbitControls.enablePan = false; + this.orbitControls.target = new Vector3(0, -12, 0); + this.orbitControls.minDistance = 10; + this.orbitControls.maxDistance = 256; + this.orbitControls.update(); + + this.animationPauseListener = function (e) { + if (_this2.enableAnimationControl) { + e.preventDefault(); + _this2.skinViewer.animationPaused = !_this2.skinViewer.animationPaused; + } + }; + this.skinViewer.domElement.addEventListener("contextmenu", this.animationPauseListener, false); + } + + createClass(SkinControl, [{ + key: "dispose", + value: function dispose() { + this.skinViewer.domElement.removeEventListener("contextmenu", this.animationPauseListener, false); + this.orbitControls.dispose(); + } + }]); + return SkinControl; +}(); + +/** + * @license + * skinview3d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen + */ + +export { SkinObject, CapeObject, PlayerObject, SkinViewer, SkinControl, CompositeAnimation, WalkAnimation }; +//# sourceMappingURL=skinview3d.module.js.map diff --git a/js/skinview3d.module.js.map b/js/skinview3d.module.js.map new file mode 100644 index 0000000..aa50154 --- /dev/null +++ b/js/skinview3d.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"skinview3d.module.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js","../src/skinview3d.js"],"sourcesContent":["import * as THREE from \"three\";\r\n\r\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\r\n\treturn [\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\r\n\t];\r\n}\r\n\r\nfunction toSkinVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\r\n}\r\n\r\nfunction toCapeVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\r\n}\r\n\r\nfunction addVertices(box, top, bottom, left, front, right, back) {\r\n\tbox.faceVertexUvs[0] = [];\r\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\r\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\r\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\r\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\r\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\r\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\r\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\r\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\r\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\r\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\r\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\r\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\r\n}\r\n\r\nconst esp = 0.002;\r\n\r\nclass SkinObject extends THREE.Group {\r\n\tconstructor(isSlim, layer1Material, layer2Material) {\r\n\t\tsuper();\r\n\r\n\t\t// Head\r\n\t\tthis.head = new THREE.Group();\r\n\r\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\r\n\t\taddVertices(headBox,\r\n\t\t\ttoSkinVertices(8, 0, 16, 8),\r\n\t\t\ttoSkinVertices(16, 0, 24, 8),\r\n\t\t\ttoSkinVertices(0, 8, 8, 16),\r\n\t\t\ttoSkinVertices(8, 8, 16, 16),\r\n\t\t\ttoSkinVertices(16, 8, 24, 16),\r\n\t\t\ttoSkinVertices(24, 8, 32, 16)\r\n\t\t);\r\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\r\n\t\tthis.head.add(headMesh);\r\n\r\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\r\n\t\taddVertices(head2Box,\r\n\t\t\ttoSkinVertices(40, 0, 48, 8),\r\n\t\t\ttoSkinVertices(48, 0, 56, 8),\r\n\t\t\ttoSkinVertices(32, 8, 40, 16),\r\n\t\t\ttoSkinVertices(40, 8, 48, 16),\r\n\t\t\ttoSkinVertices(48, 8, 56, 16),\r\n\t\t\ttoSkinVertices(56, 8, 64, 16)\r\n\t\t);\r\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\r\n\t\thead2Mesh.renderOrder = -1;\r\n\t\tthis.head.add(head2Mesh);\r\n\r\n\t\tthis.add(this.head);\r\n\r\n\r\n\t\t// Body\r\n\t\tthis.body = new THREE.Group();\r\n\r\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\r\n\t\taddVertices(bodyBox,\r\n\t\t\ttoSkinVertices(20, 16, 28, 20),\r\n\t\t\ttoSkinVertices(28, 16, 36, 20),\r\n\t\t\ttoSkinVertices(16, 20, 20, 32),\r\n\t\t\ttoSkinVertices(20, 20, 28, 32),\r\n\t\t\ttoSkinVertices(28, 20, 32, 32),\r\n\t\t\ttoSkinVertices(32, 20, 40, 32)\r\n\t\t);\r\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\r\n\t\tthis.body.add(bodyMesh);\r\n\r\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\r\n\t\taddVertices(body2Box,\r\n\t\t\ttoSkinVertices(20, 32, 28, 36),\r\n\t\t\ttoSkinVertices(28, 32, 36, 36),\r\n\t\t\ttoSkinVertices(16, 36, 20, 48),\r\n\t\t\ttoSkinVertices(20, 36, 28, 48),\r\n\t\t\ttoSkinVertices(28, 36, 32, 48),\r\n\t\t\ttoSkinVertices(32, 36, 40, 48)\r\n\t\t);\r\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\r\n\t\tthis.body.add(body2Mesh);\r\n\r\n\t\tthis.body.position.y = -10;\r\n\t\tthis.add(this.body);\r\n\r\n\r\n\t\t// Right Arm\r\n\t\tthis.rightArm = new THREE.Group();\r\n\t\tlet rightArmPivot = new THREE.Group();\r\n\r\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\r\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\r\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\r\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\r\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\r\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\r\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\r\n\t\trightArmPivot.add(rightArmMesh);\r\n\r\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\r\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\r\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\r\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\r\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\r\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\r\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\r\n\t\trightArm2Mesh.renderOrder = 1;\r\n\t\trightArmPivot.add(rightArm2Mesh);\r\n\r\n\t\trightArmPivot.position.y = -6;\r\n\t\tthis.rightArm.add(rightArmPivot);\r\n\t\tthis.rightArm.position.y = -4;\r\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\r\n\t\tthis.add(this.rightArm);\r\n\r\n\r\n\t\t// Left Arm\r\n\t\tthis.leftArm = new THREE.Group();\r\n\t\tlet leftArmPivot = new THREE.Group();\r\n\r\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\r\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\r\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\r\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\r\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\r\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\r\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\r\n\t\tleftArmPivot.add(leftArmMesh);\r\n\r\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\r\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\r\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\r\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\r\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\r\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\r\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\r\n\t\tleftArm2Mesh.renderOrder = 1;\r\n\t\tleftArmPivot.add(leftArm2Mesh);\r\n\r\n\t\tleftArmPivot.position.y = -6;\r\n\t\tthis.leftArm.add(leftArmPivot);\r\n\t\tthis.leftArm.position.y = -4;\r\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\r\n\t\tthis.add(this.leftArm);\r\n\r\n\r\n\t\t// Right Leg\r\n\t\tthis.rightLeg = new THREE.Group();\r\n\t\tlet rightLegPivot = new THREE.Group();\r\n\r\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLegBox,\r\n\t\t\ttoSkinVertices(4, 16, 8, 20),\r\n\t\t\ttoSkinVertices(8, 16, 12, 20),\r\n\t\t\ttoSkinVertices(0, 20, 4, 32),\r\n\t\t\ttoSkinVertices(4, 20, 8, 32),\r\n\t\t\ttoSkinVertices(8, 20, 12, 32),\r\n\t\t\ttoSkinVertices(12, 20, 16, 32)\r\n\t\t);\r\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\r\n\t\trightLegPivot.add(rightLegMesh);\r\n\r\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLeg2Box,\r\n\t\t\ttoSkinVertices(4, 32, 8, 36),\r\n\t\t\ttoSkinVertices(8, 32, 12, 36),\r\n\t\t\ttoSkinVertices(0, 36, 4, 48),\r\n\t\t\ttoSkinVertices(4, 36, 8, 48),\r\n\t\t\ttoSkinVertices(8, 36, 12, 48),\r\n\t\t\ttoSkinVertices(12, 36, 16, 48)\r\n\t\t);\r\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\r\n\t\trightLeg2Mesh.renderOrder = 1;\r\n\t\trightLegPivot.add(rightLeg2Mesh);\r\n\r\n\t\trightLegPivot.position.y = -6;\r\n\t\tthis.rightLeg.add(rightLegPivot);\r\n\t\tthis.rightLeg.position.y = -16;\r\n\t\tthis.rightLeg.position.x = -2;\r\n\t\tthis.add(this.rightLeg);\r\n\r\n\t\t// Left Leg\r\n\t\tthis.leftLeg = new THREE.Group();\r\n\t\tlet leftLegPivot = new THREE.Group();\r\n\r\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLegBox,\r\n\t\t\ttoSkinVertices(20, 48, 24, 52),\r\n\t\t\ttoSkinVertices(24, 48, 28, 52),\r\n\t\t\ttoSkinVertices(16, 52, 20, 64),\r\n\t\t\ttoSkinVertices(20, 52, 24, 64),\r\n\t\t\ttoSkinVertices(24, 52, 28, 64),\r\n\t\t\ttoSkinVertices(28, 52, 32, 64)\r\n\t\t);\r\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\r\n\t\tleftLegPivot.add(leftLegMesh);\r\n\r\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLeg2Box,\r\n\t\t\ttoSkinVertices(4, 48, 8, 52),\r\n\t\t\ttoSkinVertices(8, 48, 12, 52),\r\n\t\t\ttoSkinVertices(0, 52, 4, 64),\r\n\t\t\ttoSkinVertices(4, 52, 8, 64),\r\n\t\t\ttoSkinVertices(8, 52, 12, 64),\r\n\t\t\ttoSkinVertices(12, 52, 16, 64)\r\n\t\t);\r\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\r\n\t\tleftLeg2Mesh.renderOrder = 1;\r\n\t\tleftLegPivot.add(leftLeg2Mesh);\r\n\r\n\t\tleftLegPivot.position.y = -6;\r\n\t\tthis.leftLeg.add(leftLegPivot);\r\n\t\tthis.leftLeg.position.y = -16;\r\n\t\tthis.leftLeg.position.x = 2;\r\n\t\tthis.add(this.leftLeg);\r\n\t}\r\n}\r\n\r\nclass CapeObject extends THREE.Group {\r\n\tconstructor(capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\t// back = outside\r\n\t\t// front = inside\r\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\r\n\t\taddVertices(capeBox,\r\n\t\t\ttoCapeVertices(1, 0, 11, 1),\r\n\t\t\ttoCapeVertices(11, 0, 21, 1),\r\n\t\t\ttoCapeVertices(11, 1, 12, 17),\r\n\t\t\ttoCapeVertices(12, 1, 22, 17),\r\n\t\t\ttoCapeVertices(0, 1, 1, 17),\r\n\t\t\ttoCapeVertices(1, 1, 11, 17)\r\n\t\t);\r\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\r\n\t\tthis.cape.position.y = -8;\r\n\t\tthis.cape.position.z = -0.5;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nclass PlayerObject extends THREE.Group {\r\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\tthis.slim = slim;\r\n\r\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\r\n\t\tthis.skin.visible = false;\r\n\t\tthis.add(this.skin);\r\n\r\n\t\tthis.cape = new CapeObject(capeMaterial);\r\n\t\tthis.cape.position.z = -2;\r\n\t\tthis.cape.position.y = -4;\r\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\r\n\t\tthis.cape.visible = false;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nexport { SkinObject, CapeObject, PlayerObject };\r\n","import * as THREE from \"three\";\r\n\r\nclass OrbitControls extends THREE.EventDispatcher {\r\n\t/**\r\n\t * @preserve\r\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\r\n\t */\r\n\t/**\r\n\t * @license\r\n\t * Copyright (C) 2010-2017 three.js authors\r\n\t *\r\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n\t * of this software and associated documentation files (the \"Software\"), to deal\r\n\t * in the Software without restriction, including without limitation the rights\r\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\t * copies of the Software, and to permit persons to whom the Software is\r\n\t * furnished to do so, subject to the following conditions:\r\n\t *\r\n\t * The above copyright notice and this permission notice shall be included in\r\n\t * all copies or substantial portions of the Software.\r\n\t *\r\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\t * THE SOFTWARE.\r\n\t *\r\n\t *\r\n\t * @author qiao / https://github.com/qiao\r\n\t * @author mrdoob / http://mrdoob.com\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t * @author WestLangley / http://github.com/WestLangley\r\n\t * @author erich666 / http://erichaines.com\r\n\t */\r\n\r\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\r\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n\t//\r\n\t// Orbit - left mouse / touch: one finger move\r\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\r\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\r\n\r\n\tconstructor(object, domElement) {\r\n\t\tsuper();\r\n\t\tthis.object = object;\r\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\r\n\r\n\t\t// Set to false to disable this control\r\n\t\tthis.enabled = true;\r\n\r\n\t\t// \"target\" sets the location of focus, where the object orbits around\r\n\t\tthis.target = new THREE.Vector3();\r\n\r\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\r\n\t\tthis.minDistance = 0;\r\n\t\tthis.maxDistance = Infinity;\r\n\r\n\t\t// How far you can zoom in and out (OrthographicCamera only)\r\n\t\tthis.minZoom = 0;\r\n\t\tthis.maxZoom = Infinity;\r\n\r\n\t\t// How far you can orbit vertically, upper and lower limits.\r\n\t\t// Range is 0 to Math.PI radians.\r\n\t\tthis.minPolarAngle = 0; // radians\r\n\t\tthis.maxPolarAngle = Math.PI; // radians\r\n\r\n\t\t// How far you can orbit horizontally, upper and lower limits.\r\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\r\n\t\tthis.minAzimuthAngle = -Infinity; // radians\r\n\t\tthis.maxAzimuthAngle = Infinity; // radians\r\n\r\n\t\t// Set to true to enable damping (inertia)\r\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.enableDamping = false;\r\n\t\tthis.dampingFactor = 0.25;\r\n\r\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n\t\t// Set to false to disable zooming\r\n\t\tthis.enableZoom = true;\r\n\t\tthis.zoomSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable rotating\r\n\t\tthis.enableRotate = true;\r\n\t\tthis.rotateSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable panning\r\n\t\tthis.enablePan = true;\r\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\r\n\r\n\t\t// Set to true to automatically rotate around the target\r\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.autoRotate = false;\r\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\r\n\r\n\t\t// Set to false to disable use of the keys\r\n\t\tthis.enableKeys = true;\r\n\r\n\t\t// The four arrow keys\r\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\r\n\r\n\t\t// Mouse buttons\r\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\r\n\r\n\t\t// for reset\r\n\t\tthis.target0 = this.target.clone();\r\n\t\tthis.position0 = this.object.position.clone();\r\n\t\tthis.zoom0 = this.object.zoom;\r\n\r\n\t\t//\r\n\t\t// public methods\r\n\t\t//\r\n\t\tthis.getPolarAngle = function () {\r\n\t\t\treturn spherical.phi;\r\n\t\t};\r\n\t\tthis.getAzimuthalAngle = function () {\r\n\t\t\treturn spherical.theta;\r\n\t\t};\r\n\t\tthis.saveState = function () {\r\n\t\t\tscope.target0.copy(scope.target);\r\n\t\t\tscope.position0.copy(scope.object.position);\r\n\t\t\tscope.zoom0 = scope.object.zoom;\r\n\t\t};\r\n\t\tthis.reset = function () {\r\n\t\t\tscope.target.copy(scope.target0);\r\n\t\t\tscope.object.position.copy(scope.position0);\r\n\t\t\tscope.object.zoom = scope.zoom0;\r\n\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\tscope.update();\r\n\t\t\tstate = STATE.NONE;\r\n\t\t};\r\n\r\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\r\n\t\tthis.update = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\t// so camera.up is the orbit axis\r\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\r\n\t\t\tlet quatInverse = quat.clone().inverse();\r\n\t\t\tlet lastPosition = new THREE.Vector3();\r\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\r\n\t\t\treturn function update() {\r\n\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quat);\r\n\t\t\t\t// angle from z-axis around y-axis\r\n\t\t\t\tspherical.setFromVector3(offset);\r\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\r\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\r\n\t\t\t\t}\r\n\t\t\t\tspherical.theta += sphericalDelta.theta;\r\n\t\t\t\tspherical.phi += sphericalDelta.phi;\r\n\t\t\t\t// restrict theta to be between desired limits\r\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\r\n\t\t\t\t// restrict phi to be between desired limits\r\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\r\n\t\t\t\tspherical.makeSafe();\r\n\t\t\t\tspherical.radius *= scale;\r\n\t\t\t\t// restrict radius to be between desired limits\r\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\r\n\t\t\t\t// move target to panned location\r\n\t\t\t\tscope.target.add(panOffset);\r\n\t\t\t\toffset.setFromSpherical(spherical);\r\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quatInverse);\r\n\t\t\t\tposition.copy(scope.target).add(offset);\r\n\t\t\t\tscope.object.lookAt(scope.target);\r\n\t\t\t\tif (scope.enableDamping === true) {\r\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\r\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tscale = 1;\r\n\t\t\t\tpanOffset.set(0, 0, 0);\r\n\t\t\t\t// update condition is:\r\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\r\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\t\t\t\tif (zoomChanged ||\r\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\r\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\r\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\t\t\tlastPosition.copy(scope.object.position);\r\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\r\n\t\t\t\t\tzoomChanged = false;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}();\r\n\t\tthis.dispose = function () {\r\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\r\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\r\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\r\n\t\t};\r\n\t\t//\r\n\t\t// internals\r\n\t\t//\r\n\t\tlet scope = this;\r\n\t\tlet changeEvent = { type: \"change\" };\r\n\t\tlet startEvent = { type: \"start\" };\r\n\t\tlet endEvent = { type: \"end\" };\r\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\r\n\t\tlet state = STATE.NONE;\r\n\t\tlet EPS = 0.000001;\r\n\t\t// current position in spherical coordinates\r\n\t\tlet spherical = new THREE.Spherical();\r\n\t\tlet sphericalDelta = new THREE.Spherical();\r\n\t\tlet scale = 1;\r\n\t\tlet panOffset = new THREE.Vector3();\r\n\t\tlet zoomChanged = false;\r\n\t\tlet rotateStart = new THREE.Vector2();\r\n\t\tlet rotateEnd = new THREE.Vector2();\r\n\t\tlet rotateDelta = new THREE.Vector2();\r\n\t\tlet panStart = new THREE.Vector2();\r\n\t\tlet panEnd = new THREE.Vector2();\r\n\t\tlet panDelta = new THREE.Vector2();\r\n\t\tlet dollyStart = new THREE.Vector2();\r\n\t\tlet dollyEnd = new THREE.Vector2();\r\n\t\tlet dollyDelta = new THREE.Vector2();\r\n\t\tfunction getAutoRotationAngle() {\r\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\t\t}\r\n\t\tfunction getZoomScale() {\r\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\r\n\t\t}\r\n\t\tfunction rotateLeft(angle) {\r\n\t\t\tsphericalDelta.theta -= angle;\r\n\t\t}\r\n\t\tfunction rotateUp(angle) {\r\n\t\t\tsphericalDelta.phi -= angle;\r\n\t\t}\r\n\t\tlet panLeft = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panLeft(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(-distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\tlet panUp = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panUp(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\t// deltaX and deltaY are in pixels; right and down are positive\r\n\t\tlet pan = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\treturn function pan(deltaX, deltaY) {\r\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\t\t// perspective\r\n\t\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t\tlet targetDistance = offset.length();\r\n\t\t\t\t\t// half of the fov is center to top of screen\r\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\r\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\r\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\t\t// orthographic\r\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\r\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// camera neither orthographic nor perspective\r\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\r\n\t\t\t\t\tscope.enablePan = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}();\r\n\t\tfunction dollyIn(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale /= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction dollyOut(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale *= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//\r\n\t\t// event callbacks - update the object state\r\n\t\t//\r\n\t\tfunction handleMouseDownRotate(event) {\r\n\t\t\trotateStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownDolly(event) {\r\n\t\t\tdollyStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownPan(event) {\r\n\t\t\tpanStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.clientX, event.clientY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t// rotating across whole screen goes 360 degrees around\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMoveDolly(event) {\r\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMovePan(event) {\r\n\t\t\tpanEnd.set(event.clientX, event.clientY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseUp(event) {\r\n\t\t}\r\n\t\tfunction handleMouseWheel(event) {\r\n\t\t\tif (event.deltaY < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (event.deltaY > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleKeyDown(event) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase scope.keys.UP:\r\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.BOTTOM:\r\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.LEFT:\r\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.RIGHT:\r\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction handleTouchStartRotate(event) {\r\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchStartDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyStart.set(0, distance);\r\n\t\t}\r\n\t\tfunction handleTouchStartPan(event) {\r\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMoveDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyEnd.set(0, distance);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMovePan(event) {\r\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchEnd(event) {\r\n\t\t}\r\n\t\t//\r\n\t\t// event handlers - FSM: listen for events and reset state\r\n\t\t//\r\n\t\tfunction onMouseDown(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.button) {\r\n\t\t\t\tcase scope.mouseButtons.ORBIT:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownRotate(event);\r\n\t\t\t\t\tstate = STATE.ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.ZOOM:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownDolly(event);\r\n\t\t\t\t\tstate = STATE.DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownPan(event);\r\n\t\t\t\t\tstate = STATE.PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onMouseMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (state) {\r\n\t\t\t\tcase STATE.ROTATE:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.DOLLY:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tfunction onMouseUp(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleMouseUp(event);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onMouseWheel(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\thandleMouseWheel(event);\r\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t}\r\n\t\tfunction onKeyDown(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleKeyDown(event);\r\n\t\t}\r\n\t\tfunction onTouchStart(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartRotate(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartDolly(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartPan(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onTouchMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t\tfunction onTouchEnd(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleTouchEnd(event);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onContextMenu(event) {\r\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\t//\r\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\r\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\r\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\r\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\r\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\r\n\t\t// force an update at start\r\n\t\tthis.update();\r\n\t}\r\n}\r\n\r\nexport { OrbitControls };\r\n","function invokeAnimation(animation, player, time) {\r\n\tif (animation instanceof CompositeAnimation) {\r\n\t\tanimation.play(player, time);\r\n\t} else if (animation instanceof Function) {\r\n\t\tanimation(player, time);\r\n\t} else {\r\n\t\tthrow `Not an animation: ${animation}`;\r\n\t}\r\n}\r\n\r\nclass AnimationHandle {\r\n\tconstructor(animation) {\r\n\t\tthis.animation = animation;\r\n\t\tthis.paused = this._paused = false;\r\n\t\tthis.speed = this._speed = 1.0;\r\n\t\tthis._lastChange = null;\r\n\t\tthis._lastChangeX = null;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tif (this._lastChange === null) {\r\n\t\t\tthis._lastChange = time;\r\n\t\t\tthis._lastChangeX = 0;\r\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tif (this._paused === false) {\r\n\t\t\t\tthis._lastChangeX += dt * this._speed;\r\n\t\t\t}\r\n\t\t\tthis._paused = this.paused;\r\n\t\t\tthis._speed = this.speed;\r\n\t\t\tthis._lastChange = time;\r\n\t\t}\r\n\t\tif (this.paused === false) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\r\n\t\t\tinvokeAnimation(this.animation, player, x);\r\n\t\t}\r\n\t}\r\n\treset(){\r\n\t\tthis._lastChange = null;\r\n\t}\r\n}\r\n\r\nclass CompositeAnimation {\r\n\tconstructor() {\r\n\t\tthis.handles = new Set();\r\n\t}\r\n\tadd(animation) {\r\n\t\tlet handle = new AnimationHandle(animation);\r\n\t\thandle.remove = () => this.handles.delete(handle);\r\n\t\tthis.handles.add(handle);\r\n\t\treturn handle;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tthis.handles.forEach(handle => handle.play(player, time));\r\n\t}\r\n}\r\n\r\nlet WalkAnimation = (player, time) => {\r\n\tlet skin = player.skin;\r\n\tlet angleRot = time + Math.PI / 2;\r\n\r\n\t// Leg Swing\r\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\r\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\r\n\t// Arm Swing\r\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\r\n};\r\n\r\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\r\n","import * as THREE from \"three\";\r\nimport { PlayerObject } from \"./model\";\r\nimport { OrbitControls } from \"./orbit_controls\";\r\nimport { invokeAnimation } from \"./animation\";\r\n\r\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\r\n\tlet imgData = context.getImageData(sX, sY, w, h);\r\n\tif (flipHorizontal) {\r\n\t\tfor (let y = 0; y < h; y++) {\r\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\r\n\t\t\t\tlet index = (x + y * w) * 4;\r\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\r\n\t\t\t\tlet pA1 = imgData.data[index];\r\n\t\t\t\tlet pA2 = imgData.data[index + 1];\r\n\t\t\t\tlet pA3 = imgData.data[index + 2];\r\n\t\t\t\tlet pA4 = imgData.data[index + 3];\r\n\r\n\t\t\t\tlet pB1 = imgData.data[index2];\r\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\r\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\r\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\r\n\r\n\t\t\t\timgData.data[index] = pB1;\r\n\t\t\t\timgData.data[index + 1] = pB2;\r\n\t\t\t\timgData.data[index + 2] = pB3;\r\n\t\t\t\timgData.data[index + 3] = pB4;\r\n\r\n\t\t\t\timgData.data[index2] = pA1;\r\n\t\t\t\timgData.data[index2 + 1] = pA2;\r\n\t\t\t\timgData.data[index2 + 2] = pA3;\r\n\t\t\t\timgData.data[index2 + 3] = pA4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcontext.putImageData(imgData, dX, dY);\r\n}\r\n\r\nfunction convertSkinTo1_8(context, width) {\r\n\tlet scale = width / 64.0;\r\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\r\n\r\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\r\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\r\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\r\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\r\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\r\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\r\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\r\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\r\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\r\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\r\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\r\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\r\n}\r\n\r\nclass SkinViewer {\r\n\tconstructor(options) {\r\n\t\tthis.domElement = options.domElement;\r\n\t\tthis.animation = options.animation || null;\r\n\t\tthis.animationPaused = false;\r\n\t\tthis.animationTime = 0;\r\n\t\tthis.disposed = false;\r\n\r\n\t\t// texture\r\n\t\tthis.skinImg = new Image();\r\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\r\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\r\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.capeImg = new Image();\r\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\r\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\r\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\r\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\r\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\r\n\r\n\t\t// scene\r\n\t\tthis.scene = new THREE.Scene();\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\r\n\t\tthis.camera.position.y = -12;\r\n\t\tthis.camera.position.z = 30;\r\n\r\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\r\n\t\tthis.renderer.setSize(300, 300); // default size\r\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\r\n\t\tthis.domElement.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\r\n\t\tthis.scene.add(this.playerObject);\r\n\r\n\t\t// texture loading\r\n\t\tthis.skinImg.crossOrigin = \"\";\r\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\r\n\t\tthis.skinImg.onload = () => {\r\n\t\t\tlet isOldFormat = false;\r\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\r\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\r\n\t\t\t\t\tisOldFormat = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\"Bad skin size\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\r\n\t\t\tif (isOldFormat) {\r\n\t\t\t\tlet width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.width = width;\r\n\t\t\t\tthis.skinCanvas.height = width;\r\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\r\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\r\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t}\r\n\r\n\t\t\tthis.skinTexture.needsUpdate = true;\r\n\t\t\tthis.layer1Material.needsUpdate = true;\r\n\t\t\tthis.layer2Material.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.skin.visible = true;\r\n\t\t};\r\n\r\n\t\tthis.capeImg.crossOrigin = \"\";\r\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\r\n\t\tthis.capeImg.onload = () => {\r\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\r\n\t\t\t\tconsole.error(\"Bad cape size\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\r\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\r\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\r\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\r\n\t\t\tthis.capeTexture.needsUpdate = true;\r\n\t\t\tthis.capeMaterial.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.cape.visible = true;\r\n\t\t};\r\n\r\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\r\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\r\n\t\tif (options.width) this.width = options.width;\r\n\t\tif (options.height) this.height = options.height;\r\n\r\n\t\tlet draw = () => {\r\n\t\t\tif (this.disposed) return;\r\n\t\t\twindow.requestAnimationFrame(draw);\r\n\t\t\tif (!this.animationPaused) {\r\n\t\t\t\tthis.animationTime++;\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\t\tdraw();\r\n\t}\r\n\r\n\tsetSize(width, height) {\r\n\t\tthis.camera.aspect = width / height;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.disposed = true;\r\n\t\tthis.domElement.removeChild(this.renderer.domElement);\r\n\t\tthis.renderer.dispose();\r\n\t\tthis.skinTexture.dispose();\r\n\t\tthis.capeTexture.dispose();\r\n\t}\r\n\r\n\tget skinUrl() {\r\n\t\treturn this.skinImg.src;\r\n\t}\r\n\r\n\tset skinUrl(url) {\r\n\t\tthis.skinImg.src = url;\r\n\t}\r\n\r\n\tget capeUrl() {\r\n\t\treturn this.capeImg.src;\r\n\t}\r\n\r\n\tset capeUrl(url) {\r\n\t\tthis.capeImg.src = url;\r\n\t}\r\n\r\n\tget width() {\r\n\t\treturn this.renderer.getSize().width;\r\n\t}\r\n\r\n\tset width(newWidth) {\r\n\t\tthis.setSize(newWidth, this.height);\r\n\t}\r\n\r\n\tget height() {\r\n\t\treturn this.renderer.getSize().height;\r\n\t}\r\n\r\n\tset height(newHeight) {\r\n\t\tthis.setSize(this.width, newHeight);\r\n\t}\r\n}\r\n\r\nclass SkinControl {\r\n\tconstructor(skinViewer) {\r\n\t\tthis.enableAnimationControl = true;\r\n\t\tthis.skinViewer = skinViewer;\r\n\r\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\r\n\t\tthis.orbitControls.enablePan = false;\r\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\r\n\t\tthis.orbitControls.minDistance = 10;\r\n\t\tthis.orbitControls.maxDistance = 256;\r\n\t\tthis.orbitControls.update();\r\n\r\n\t\tthis.animationPauseListener = e => {\r\n\t\t\tif (this.enableAnimationControl) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t\tthis.orbitControls.dispose();\r\n\t}\r\n}\r\n\r\nexport { SkinViewer, SkinControl };\r\n","/**\r\n * @license\r\n * skinview3d \r\n *\r\n * Copyright (C) 2017 the original author or authors\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n *\r\n * @author yushijinhun \r\n * @author Hacksore \r\n * @author Kent Rasmussen \r\n */\r\n\r\nexport { SkinObject, CapeObject, PlayerObject } from \"./model\";\r\nexport { SkinViewer, SkinControl } from \"./viewer\";\r\nexport { CompositeAnimation, WalkAnimation } from \"./animation\";\r\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","PlayerObject","slim","skin","visible","rotation","Math","PI","OrbitControls","object","domElement","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","copy","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","STATE","NONE","offset","quat","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","sub","applyQuaternion","setFromVector3","state","getAutoRotationAngle","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","rotateLeft","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","warn","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","event","clientX","clientY","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","dx","dy","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","button","preventDefault","addEventListener","stopPropagation","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","WalkAnimation","angleRot","cos","copyImage","context","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","convertSkinTo1_8","width","copySkin","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","alpha","antialias","setSize","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","console","error","src","onload","isOldFormat","height","skinContext","getContext","clearRect","drawImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index aa0d326..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3590 +0,0 @@ -{ - "name": "skinview3d", - "version": "1.1.0-alpha.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "acorn": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true, - "optional": true - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.11.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-external-helpers": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz", - "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.0", - "invariant": "2.2.2", - "semver": "5.4.1" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browserslist": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.0.tgz", - "integrity": "sha512-mNYp0RNeu1xueGuJFSXkU+K0nH+dBE/gcjtyhtNKfU8hwdrVIfoA7i5iFSjOmzkGdL2QaO7YX9ExiVPE7AY9JA==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000787", - "electron-to-chromium": "1.3.30" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000787", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000787.tgz", - "integrity": "sha1-p2xPodasAGQER+yDwefGsz3WFcU=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "2.0.2" - } - }, - "electron-releases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", - "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.30", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", - "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", - "dev": true, - "requires": { - "electron-releases": "2.1.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz", - "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.2", - "esquery": "1.0.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.3.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "estree-walker": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", - "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "optional": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "1.0.2" - } - }, - "fs-readdir-recursive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", - "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "1.10.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true, - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "optional": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.7" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "rollup": { - "version": "0.55.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.3.tgz", - "integrity": "sha512-2TgimJ7pk+XfPT0DmAcOqq9qdXlJ04qKyzyLm1WvPS/E6XdXEXyG5u6L8AsjxOaKoEBlYGliPzo99jxwhn2NYQ==", - "dev": true - }, - "rollup-plugin-babel": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-3.0.3.tgz", - "integrity": "sha512-5kzM/Rr4jQSRPLc2eN5NuD+CI/6AAy7S1O18Ogu4U3nq1Q42VJn0C9EMtqnvxtfwf1XrezOtdA9ro1VZI5B0mA==", - "dev": true, - "requires": { - "rollup-pluginutils": "1.5.2" - } - }, - "rollup-plugin-node-resolve": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.2.tgz", - "integrity": "sha512-ZwmMip/yqw6cmDQJuCQJ1G7gw2z11iGUtQNFYrFZHmqadRHU+OZGC3nOXwXu+UTvcm5lzDspB1EYWrkTgPWybw==", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "is-module": "1.0.0", - "resolve": "1.5.0" - } - }, - "rollup-plugin-uglify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-3.0.0.tgz", - "integrity": "sha512-dehLu9eRRoV4l09aC+ySntRw1OAfoyKdbk8Nelblj03tHoynkSybqyEpgavemi1LBOH6S1vzI58/mpxkZIe1iQ==", - "dev": true, - "requires": { - "uglify-es": "3.3.9" - } - }, - "rollup-pluginutils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", - "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", - "dev": true, - "requires": { - "estree-walker": "0.2.1", - "minimatch": "3.0.4" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true, - "optional": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "three": { - "version": "0.89.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.89.0.tgz", - "integrity": "sha1-RELYGaYWiHG40ss3rRKiQxDBcPU=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index b5b052e..0000000 --- a/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "skinview3d", - "version": "1.1.0-alpha.1", - "description": "Three.js powered Minecraft skin viewer", - "module": "build/skinview3d.module.js", - "main": "build/skinview3d.js", - "scripts": { - "build": "rollup -c tools/rollup.module.js && rollup -c tools/rollup.browser.js && rollup -c tools/rollup.browser.min.js", - "prepare": "npm test && rm -rf build && npm run build", - "test": "eslint src/** tools/**" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/to2mbn/skinview3d.git" - }, - "author": "yushijinhun", - "license": "GPL-3.0", - "bugs": { - "url": "https://github.com/to2mbn/skinview3d/issues" - }, - "homepage": "https://github.com/to2mbn/skinview3d", - "dependencies": { - "three": "^0.89.0" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-plugin-external-helpers": "^6.22.0", - "babel-preset-env": "^1.6.1", - "eslint": "^4.16.0", - "rollup": "^0.55.3", - "rollup-plugin-babel": "^3.0.3", - "rollup-plugin-node-resolve": "^3.0.2", - "rollup-plugin-uglify": "^3.0.0", - "uglify-es": "^3.3.9" - } -} diff --git a/src/animation.js b/src/animation.js deleted file mode 100644 index 7f53b04..0000000 --- a/src/animation.js +++ /dev/null @@ -1,71 +0,0 @@ -function invokeAnimation(animation, player, time) { - if (animation instanceof CompositeAnimation) { - animation.play(player, time); - } else if (animation instanceof Function) { - animation(player, time); - } else { - throw `Not an animation: ${animation}`; - } -} - -class AnimationHandle { - constructor(animation) { - this.animation = animation; - this.paused = this._paused = false; - this.speed = this._speed = 1.0; - this._lastChange = null; - this._lastChangeX = null; - } - play(player, time) { - if (this._lastChange === null) { - this._lastChange = time; - this._lastChangeX = 0; - } else if (this.paused !== this._paused || this.speed !== this._speed) { - let dt = time - this._lastChange; - if (this._paused === false) { - this._lastChangeX += dt * this._speed; - } - this._paused = this.paused; - this._speed = this.speed; - this._lastChange = time; - } - if (this.paused === false) { - let dt = time - this._lastChange; - let x = this._lastChangeX + this.speed * dt; - invokeAnimation(this.animation, player, x); - } - } - reset(){ - this._lastChange = null; - } -} - -class CompositeAnimation { - constructor() { - this.handles = new Set(); - } - add(animation) { - let handle = new AnimationHandle(animation); - handle.remove = () => this.handles.delete(handle); - this.handles.add(handle); - return handle; - } - play(player, time) { - this.handles.forEach(handle => handle.play(player, time)); - } -} - -let WalkAnimation = (player, time) => { - let skin = player.skin; - let angleRot = time + Math.PI / 2; - - // Leg Swing - skin.leftLeg.rotation.x = Math.cos(angleRot); - skin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI)); - - // Arm Swing - skin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI)); - skin.rightArm.rotation.x = Math.cos(angleRot); -}; - -export { CompositeAnimation, WalkAnimation, invokeAnimation }; diff --git a/src/model.js b/src/model.js deleted file mode 100644 index 012c630..0000000 --- a/src/model.js +++ /dev/null @@ -1,333 +0,0 @@ -import * as THREE from "three"; - -function toFaceVertices(x1, y1, x2, y2, w, h) { - return [ - new THREE.Vector2(x1 / w, 1.0 - y2 / h), - new THREE.Vector2(x2 / w, 1.0 - y2 / h), - new THREE.Vector2(x2 / w, 1.0 - y1 / h), - new THREE.Vector2(x1 / w, 1.0 - y1 / h) - ]; -} - -function toSkinVertices(x1, y1, x2, y2) { - return toFaceVertices(x1, y1, x2, y2, 64.0, 64.0); -} - -function toCapeVertices(x1, y1, x2, y2) { - return toFaceVertices(x1, y1, x2, y2, 64.0, 32.0); -} - -function addVertices(box, top, bottom, left, front, right, back) { - box.faceVertexUvs[0] = []; - box.faceVertexUvs[0][0] = [right[3], right[0], right[2]]; - box.faceVertexUvs[0][1] = [right[0], right[1], right[2]]; - box.faceVertexUvs[0][2] = [left[3], left[0], left[2]]; - box.faceVertexUvs[0][3] = [left[0], left[1], left[2]]; - box.faceVertexUvs[0][4] = [top[3], top[0], top[2]]; - box.faceVertexUvs[0][5] = [top[0], top[1], top[2]]; - box.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]]; - box.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]]; - box.faceVertexUvs[0][8] = [front[3], front[0], front[2]]; - box.faceVertexUvs[0][9] = [front[0], front[1], front[2]]; - box.faceVertexUvs[0][10] = [back[3], back[0], back[2]]; - box.faceVertexUvs[0][11] = [back[0], back[1], back[2]]; -} - -const esp = 0.002; - -class SkinObject extends THREE.Group { - constructor(isSlim, layer1Material, layer2Material) { - super(); - - // Head - this.head = new THREE.Group(); - - let headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0); - addVertices(headBox, - toSkinVertices(8, 0, 16, 8), - toSkinVertices(16, 0, 24, 8), - toSkinVertices(0, 8, 8, 16), - toSkinVertices(8, 8, 16, 16), - toSkinVertices(16, 8, 24, 16), - toSkinVertices(24, 8, 32, 16) - ); - let headMesh = new THREE.Mesh(headBox, layer1Material); - this.head.add(headMesh); - - let head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0); - addVertices(head2Box, - toSkinVertices(40, 0, 48, 8), - toSkinVertices(48, 0, 56, 8), - toSkinVertices(32, 8, 40, 16), - toSkinVertices(40, 8, 48, 16), - toSkinVertices(48, 8, 56, 16), - toSkinVertices(56, 8, 64, 16) - ); - let head2Mesh = new THREE.Mesh(head2Box, layer2Material); - head2Mesh.renderOrder = -1; - this.head.add(head2Mesh); - - this.add(this.head); - - - // Body - this.body = new THREE.Group(); - - let bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0); - addVertices(bodyBox, - toSkinVertices(20, 16, 28, 20), - toSkinVertices(28, 16, 36, 20), - toSkinVertices(16, 20, 20, 32), - toSkinVertices(20, 20, 28, 32), - toSkinVertices(28, 20, 32, 32), - toSkinVertices(32, 20, 40, 32) - ); - let bodyMesh = new THREE.Mesh(bodyBox, layer1Material); - this.body.add(bodyMesh); - - let body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0); - addVertices(body2Box, - toSkinVertices(20, 32, 28, 36), - toSkinVertices(28, 32, 36, 36), - toSkinVertices(16, 36, 20, 48), - toSkinVertices(20, 36, 28, 48), - toSkinVertices(28, 36, 32, 48), - toSkinVertices(32, 36, 40, 48) - ); - let body2Mesh = new THREE.Mesh(body2Box, layer2Material); - this.body.add(body2Mesh); - - this.body.position.y = -10; - this.add(this.body); - - - // Right Arm - this.rightArm = new THREE.Group(); - let rightArmPivot = new THREE.Group(); - - let rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); - if (isSlim) { - addVertices(rightArmBox, - toSkinVertices(44, 16, 47, 20), - toSkinVertices(47, 16, 50, 20), - toSkinVertices(40, 20, 44, 32), - toSkinVertices(44, 20, 47, 32), - toSkinVertices(47, 20, 51, 32), - toSkinVertices(51, 20, 54, 32) - ); - } else { - addVertices(rightArmBox, - toSkinVertices(44, 16, 48, 20), - toSkinVertices(48, 16, 52, 20), - toSkinVertices(40, 20, 44, 32), - toSkinVertices(44, 20, 48, 32), - toSkinVertices(48, 20, 52, 32), - toSkinVertices(52, 20, 56, 32) - ); - } - let rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material); - rightArmPivot.add(rightArmMesh); - - let rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - if (isSlim) { - addVertices(rightArm2Box, - toSkinVertices(44, 32, 47, 36), - toSkinVertices(47, 32, 50, 36), - toSkinVertices(40, 36, 44, 48), - toSkinVertices(44, 36, 47, 48), - toSkinVertices(47, 36, 51, 48), - toSkinVertices(51, 36, 54, 48) - ); - } else { - addVertices(rightArm2Box, - toSkinVertices(44, 32, 48, 36), - toSkinVertices(48, 32, 52, 36), - toSkinVertices(40, 36, 44, 48), - toSkinVertices(44, 36, 48, 48), - toSkinVertices(48, 36, 52, 48), - toSkinVertices(52, 36, 56, 48) - ); - } - let rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material); - rightArm2Mesh.renderOrder = 1; - rightArmPivot.add(rightArm2Mesh); - - rightArmPivot.position.y = -6; - this.rightArm.add(rightArmPivot); - this.rightArm.position.y = -4; - this.rightArm.position.x = isSlim ? -5.5 : -6; - this.add(this.rightArm); - - - // Left Arm - this.leftArm = new THREE.Group(); - let leftArmPivot = new THREE.Group(); - - let leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); - if (isSlim) { - addVertices(leftArmBox, - toSkinVertices(36, 48, 39, 52), - toSkinVertices(39, 48, 42, 52), - toSkinVertices(32, 52, 36, 64), - toSkinVertices(36, 52, 39, 64), - toSkinVertices(39, 52, 43, 64), - toSkinVertices(43, 52, 46, 64) - ); - } else { - addVertices(leftArmBox, - toSkinVertices(36, 48, 40, 52), - toSkinVertices(40, 48, 44, 52), - toSkinVertices(32, 52, 36, 64), - toSkinVertices(36, 52, 40, 64), - toSkinVertices(40, 52, 44, 64), - toSkinVertices(44, 52, 48, 64) - ); - } - let leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material); - leftArmPivot.add(leftArmMesh); - - let leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - if (isSlim) { - addVertices(leftArm2Box, - toSkinVertices(52, 48, 55, 52), - toSkinVertices(55, 48, 58, 52), - toSkinVertices(48, 52, 52, 64), - toSkinVertices(52, 52, 55, 64), - toSkinVertices(55, 52, 59, 64), - toSkinVertices(59, 52, 62, 64) - ); - } else { - addVertices(leftArm2Box, - toSkinVertices(52, 48, 56, 52), - toSkinVertices(56, 48, 60, 52), - toSkinVertices(48, 52, 52, 64), - toSkinVertices(52, 52, 56, 64), - toSkinVertices(56, 52, 60, 64), - toSkinVertices(60, 52, 64, 64) - ); - } - let leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material); - leftArm2Mesh.renderOrder = 1; - leftArmPivot.add(leftArm2Mesh); - - leftArmPivot.position.y = -6; - this.leftArm.add(leftArmPivot); - this.leftArm.position.y = -4; - this.leftArm.position.x = isSlim ? 5.5 : 6; - this.add(this.leftArm); - - - // Right Leg - this.rightLeg = new THREE.Group(); - let rightLegPivot = new THREE.Group(); - - let rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0); - addVertices(rightLegBox, - toSkinVertices(4, 16, 8, 20), - toSkinVertices(8, 16, 12, 20), - toSkinVertices(0, 20, 4, 32), - toSkinVertices(4, 20, 8, 32), - toSkinVertices(8, 20, 12, 32), - toSkinVertices(12, 20, 16, 32) - ); - let rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material); - rightLegPivot.add(rightLegMesh); - - let rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - addVertices(rightLeg2Box, - toSkinVertices(4, 32, 8, 36), - toSkinVertices(8, 32, 12, 36), - toSkinVertices(0, 36, 4, 48), - toSkinVertices(4, 36, 8, 48), - toSkinVertices(8, 36, 12, 48), - toSkinVertices(12, 36, 16, 48) - ); - let rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material); - rightLeg2Mesh.renderOrder = 1; - rightLegPivot.add(rightLeg2Mesh); - - rightLegPivot.position.y = -6; - this.rightLeg.add(rightLegPivot); - this.rightLeg.position.y = -16; - this.rightLeg.position.x = -2; - this.add(this.rightLeg); - - // Left Leg - this.leftLeg = new THREE.Group(); - let leftLegPivot = new THREE.Group(); - - let leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0); - addVertices(leftLegBox, - toSkinVertices(20, 48, 24, 52), - toSkinVertices(24, 48, 28, 52), - toSkinVertices(16, 52, 20, 64), - toSkinVertices(20, 52, 24, 64), - toSkinVertices(24, 52, 28, 64), - toSkinVertices(28, 52, 32, 64) - ); - let leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material); - leftLegPivot.add(leftLegMesh); - - let leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - addVertices(leftLeg2Box, - toSkinVertices(4, 48, 8, 52), - toSkinVertices(8, 48, 12, 52), - toSkinVertices(0, 52, 4, 64), - toSkinVertices(4, 52, 8, 64), - toSkinVertices(8, 52, 12, 64), - toSkinVertices(12, 52, 16, 64) - ); - let leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material); - leftLeg2Mesh.renderOrder = 1; - leftLegPivot.add(leftLeg2Mesh); - - leftLegPivot.position.y = -6; - this.leftLeg.add(leftLegPivot); - this.leftLeg.position.y = -16; - this.leftLeg.position.x = 2; - this.add(this.leftLeg); - } -} - -class CapeObject extends THREE.Group { - constructor(capeMaterial) { - super(); - - // back = outside - // front = inside - let capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0); - addVertices(capeBox, - toCapeVertices(1, 0, 11, 1), - toCapeVertices(11, 0, 21, 1), - toCapeVertices(11, 1, 12, 17), - toCapeVertices(12, 1, 22, 17), - toCapeVertices(0, 1, 1, 17), - toCapeVertices(1, 1, 11, 17) - ); - this.cape = new THREE.Mesh(capeBox, capeMaterial); - this.cape.position.y = -8; - this.cape.position.z = -0.5; - this.add(this.cape); - } -} - -class PlayerObject extends THREE.Group { - constructor(slim, layer1Material, layer2Material, capeMaterial) { - super(); - - this.slim = slim; - - this.skin = new SkinObject(slim, layer1Material, layer2Material); - this.skin.visible = false; - this.add(this.skin); - - this.cape = new CapeObject(capeMaterial); - this.cape.position.z = -2; - this.cape.position.y = -4; - this.cape.rotation.x = 25 * Math.PI / 180; - this.cape.visible = false; - this.add(this.cape); - } -} - -export { SkinObject, CapeObject, PlayerObject }; diff --git a/src/orbit_controls.js b/src/orbit_controls.js deleted file mode 100644 index 08f8af2..0000000 --- a/src/orbit_controls.js +++ /dev/null @@ -1,596 +0,0 @@ -import * as THREE from "three"; - -class OrbitControls extends THREE.EventDispatcher { - /** - * @preserve - * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js - */ - /** - * @license - * Copyright (C) 2010-2017 three.js authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com - */ - - // This set of controls performs orbiting, dollying (zooming), and panning. - // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). - // - // Orbit - left mouse / touch: one finger move - // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish - // Pan - right mouse, or arrow keys / touch: three finger swipe - - constructor(object, domElement) { - super(); - this.object = object; - this.domElement = (domElement !== undefined) ? domElement : document; - - // Set to false to disable this control - this.enabled = true; - - // "target" sets the location of focus, where the object orbits around - this.target = new THREE.Vector3(); - - // How far you can dolly in and out (PerspectiveCamera only) - this.minDistance = 0; - this.maxDistance = Infinity; - - // How far you can zoom in and out (OrthographicCamera only) - this.minZoom = 0; - this.maxZoom = Infinity; - - // How far you can orbit vertically, upper and lower limits. - // Range is 0 to Math.PI radians. - this.minPolarAngle = 0; // radians - this.maxPolarAngle = Math.PI; // radians - - // How far you can orbit horizontally, upper and lower limits. - // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. - this.minAzimuthAngle = -Infinity; // radians - this.maxAzimuthAngle = Infinity; // radians - - // Set to true to enable damping (inertia) - // If damping is enabled, you must call controls.update() in your animation loop - this.enableDamping = false; - this.dampingFactor = 0.25; - - // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. - // Set to false to disable zooming - this.enableZoom = true; - this.zoomSpeed = 1.0; - - // Set to false to disable rotating - this.enableRotate = true; - this.rotateSpeed = 1.0; - - // Set to false to disable panning - this.enablePan = true; - this.keyPanSpeed = 7.0; // pixels moved per arrow key push - - // Set to true to automatically rotate around the target - // If auto-rotate is enabled, you must call controls.update() in your animation loop - this.autoRotate = false; - this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 - - // Set to false to disable use of the keys - this.enableKeys = true; - - // The four arrow keys - this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; - - // Mouse buttons - this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; - - // for reset - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - this.zoom0 = this.object.zoom; - - // - // public methods - // - this.getPolarAngle = function () { - return spherical.phi; - }; - this.getAzimuthalAngle = function () { - return spherical.theta; - }; - this.saveState = function () { - scope.target0.copy(scope.target); - scope.position0.copy(scope.object.position); - scope.zoom0 = scope.object.zoom; - }; - this.reset = function () { - scope.target.copy(scope.target0); - scope.object.position.copy(scope.position0); - scope.object.zoom = scope.zoom0; - scope.object.updateProjectionMatrix(); - scope.dispatchEvent(changeEvent); - scope.update(); - state = STATE.NONE; - }; - - // this method is exposed, but perhaps it would be better if we can make it private... - this.update = function () { - let offset = new THREE.Vector3(); - // so camera.up is the orbit axis - let quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0)); - let quatInverse = quat.clone().inverse(); - let lastPosition = new THREE.Vector3(); - let lastQuaternion = new THREE.Quaternion(); - return function update() { - let position = scope.object.position; - offset.copy(position).sub(scope.target); - // rotate offset to "y-axis-is-up" space - offset.applyQuaternion(quat); - // angle from z-axis around y-axis - spherical.setFromVector3(offset); - if (scope.autoRotate && state === STATE.NONE) { - rotateLeft(getAutoRotationAngle()); - } - spherical.theta += sphericalDelta.theta; - spherical.phi += sphericalDelta.phi; - // restrict theta to be between desired limits - spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); - // restrict phi to be between desired limits - spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); - spherical.makeSafe(); - spherical.radius *= scale; - // restrict radius to be between desired limits - spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); - // move target to panned location - scope.target.add(panOffset); - offset.setFromSpherical(spherical); - // rotate offset back to "camera-up-vector-is-up" space - offset.applyQuaternion(quatInverse); - position.copy(scope.target).add(offset); - scope.object.lookAt(scope.target); - if (scope.enableDamping === true) { - sphericalDelta.theta *= (1 - scope.dampingFactor); - sphericalDelta.phi *= (1 - scope.dampingFactor); - } - else { - sphericalDelta.set(0, 0, 0); - } - scale = 1; - panOffset.set(0, 0, 0); - // update condition is: - // min(camera displacement, camera rotation in radians)^2 > EPS - // using small-angle approximation cos(x/2) = 1 - x^2 / 8 - if (zoomChanged || - lastPosition.distanceToSquared(scope.object.position) > EPS || - 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { - scope.dispatchEvent(changeEvent); - lastPosition.copy(scope.object.position); - lastQuaternion.copy(scope.object.quaternion); - zoomChanged = false; - return true; - } - return false; - }; - }(); - this.dispose = function () { - scope.domElement.removeEventListener("contextmenu", onContextMenu, false); - scope.domElement.removeEventListener("mousedown", onMouseDown, false); - scope.domElement.removeEventListener("wheel", onMouseWheel, false); - scope.domElement.removeEventListener("touchstart", onTouchStart, false); - scope.domElement.removeEventListener("touchend", onTouchEnd, false); - scope.domElement.removeEventListener("touchmove", onTouchMove, false); - document.removeEventListener("mousemove", onMouseMove, false); - document.removeEventListener("mouseup", onMouseUp, false); - window.removeEventListener("keydown", onKeyDown, false); - //scope.dispatchEvent({ type: "dispose" }); // should this be added here? - }; - // - // internals - // - let scope = this; - let changeEvent = { type: "change" }; - let startEvent = { type: "start" }; - let endEvent = { type: "end" }; - let STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; - let state = STATE.NONE; - let EPS = 0.000001; - // current position in spherical coordinates - let spherical = new THREE.Spherical(); - let sphericalDelta = new THREE.Spherical(); - let scale = 1; - let panOffset = new THREE.Vector3(); - let zoomChanged = false; - let rotateStart = new THREE.Vector2(); - let rotateEnd = new THREE.Vector2(); - let rotateDelta = new THREE.Vector2(); - let panStart = new THREE.Vector2(); - let panEnd = new THREE.Vector2(); - let panDelta = new THREE.Vector2(); - let dollyStart = new THREE.Vector2(); - let dollyEnd = new THREE.Vector2(); - let dollyDelta = new THREE.Vector2(); - function getAutoRotationAngle() { - return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; - } - function getZoomScale() { - return Math.pow(0.95, scope.zoomSpeed); - } - function rotateLeft(angle) { - sphericalDelta.theta -= angle; - } - function rotateUp(angle) { - sphericalDelta.phi -= angle; - } - let panLeft = function () { - let v = new THREE.Vector3(); - return function panLeft(distance, objectMatrix) { - v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix - v.multiplyScalar(-distance); - panOffset.add(v); - }; - }(); - let panUp = function () { - let v = new THREE.Vector3(); - return function panUp(distance, objectMatrix) { - v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix - v.multiplyScalar(distance); - panOffset.add(v); - }; - }(); - // deltaX and deltaY are in pixels; right and down are positive - let pan = function () { - let offset = new THREE.Vector3(); - return function pan(deltaX, deltaY) { - let element = scope.domElement === document ? scope.domElement.body : scope.domElement; - if (scope.object instanceof THREE.PerspectiveCamera) { - // perspective - let position = scope.object.position; - offset.copy(position).sub(scope.target); - let targetDistance = offset.length(); - // half of the fov is center to top of screen - targetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0); - // we actually don't use screenWidth, since perspective camera is fixed to screen height - panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); - panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); - } - else if (scope.object instanceof THREE.OrthographicCamera) { - // orthographic - panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); - panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); - } - else { - // camera neither orthographic nor perspective - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); - scope.enablePan = false; - } - }; - }(); - function dollyIn(dollyScale) { - if (scope.object instanceof THREE.PerspectiveCamera) { - scale /= dollyScale; - } - else if (scope.object instanceof THREE.OrthographicCamera) { - scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); - scope.object.updateProjectionMatrix(); - zoomChanged = true; - } - else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - scope.enableZoom = false; - } - } - function dollyOut(dollyScale) { - if (scope.object instanceof THREE.PerspectiveCamera) { - scale *= dollyScale; - } - else if (scope.object instanceof THREE.OrthographicCamera) { - scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); - scope.object.updateProjectionMatrix(); - zoomChanged = true; - } - else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - scope.enableZoom = false; - } - } - // - // event callbacks - update the object state - // - function handleMouseDownRotate(event) { - rotateStart.set(event.clientX, event.clientY); - } - function handleMouseDownDolly(event) { - dollyStart.set(event.clientX, event.clientY); - } - function handleMouseDownPan(event) { - panStart.set(event.clientX, event.clientY); - } - function handleMouseMoveRotate(event) { - rotateEnd.set(event.clientX, event.clientY); - rotateDelta.subVectors(rotateEnd, rotateStart); - let element = scope.domElement === document ? scope.domElement.body : scope.domElement; - // rotating across whole screen goes 360 degrees around - rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); - // rotating up and down along whole screen attempts to go 360, but limited to 180 - rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); - rotateStart.copy(rotateEnd); - scope.update(); - } - function handleMouseMoveDolly(event) { - dollyEnd.set(event.clientX, event.clientY); - dollyDelta.subVectors(dollyEnd, dollyStart); - if (dollyDelta.y > 0) { - dollyIn(getZoomScale()); - } - else if (dollyDelta.y < 0) { - dollyOut(getZoomScale()); - } - dollyStart.copy(dollyEnd); - scope.update(); - } - function handleMouseMovePan(event) { - panEnd.set(event.clientX, event.clientY); - panDelta.subVectors(panEnd, panStart); - pan(panDelta.x, panDelta.y); - panStart.copy(panEnd); - scope.update(); - } - function handleMouseUp(event) { - } - function handleMouseWheel(event) { - if (event.deltaY < 0) { - dollyOut(getZoomScale()); - } - else if (event.deltaY > 0) { - dollyIn(getZoomScale()); - } - scope.update(); - } - function handleKeyDown(event) { - switch (event.keyCode) { - case scope.keys.UP: - pan(0, scope.keyPanSpeed); - scope.update(); - break; - case scope.keys.BOTTOM: - pan(0, -scope.keyPanSpeed); - scope.update(); - break; - case scope.keys.LEFT: - pan(scope.keyPanSpeed, 0); - scope.update(); - break; - case scope.keys.RIGHT: - pan(-scope.keyPanSpeed, 0); - scope.update(); - break; - } - } - function handleTouchStartRotate(event) { - rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); - } - function handleTouchStartDolly(event) { - let dx = event.touches[0].pageX - event.touches[1].pageX; - let dy = event.touches[0].pageY - event.touches[1].pageY; - let distance = Math.sqrt(dx * dx + dy * dy); - dollyStart.set(0, distance); - } - function handleTouchStartPan(event) { - panStart.set(event.touches[0].pageX, event.touches[0].pageY); - } - function handleTouchMoveRotate(event) { - rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); - rotateDelta.subVectors(rotateEnd, rotateStart); - let element = scope.domElement === document ? scope.domElement.body : scope.domElement; - rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); - rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); - rotateStart.copy(rotateEnd); - scope.update(); - } - function handleTouchMoveDolly(event) { - let dx = event.touches[0].pageX - event.touches[1].pageX; - let dy = event.touches[0].pageY - event.touches[1].pageY; - let distance = Math.sqrt(dx * dx + dy * dy); - dollyEnd.set(0, distance); - dollyDelta.subVectors(dollyEnd, dollyStart); - if (dollyDelta.y > 0) { - dollyOut(getZoomScale()); - } - else if (dollyDelta.y < 0) { - dollyIn(getZoomScale()); - } - dollyStart.copy(dollyEnd); - scope.update(); - } - function handleTouchMovePan(event) { - panEnd.set(event.touches[0].pageX, event.touches[0].pageY); - panDelta.subVectors(panEnd, panStart); - pan(panDelta.x, panDelta.y); - panStart.copy(panEnd); - scope.update(); - } - function handleTouchEnd(event) { - } - // - // event handlers - FSM: listen for events and reset state - // - function onMouseDown(event) { - if (scope.enabled === false) - return; - switch (event.button) { - case scope.mouseButtons.ORBIT: - if (scope.enableRotate === false) - return; - handleMouseDownRotate(event); - state = STATE.ROTATE; - break; - case scope.mouseButtons.ZOOM: - if (scope.enableZoom === false) - return; - handleMouseDownDolly(event); - state = STATE.DOLLY; - break; - case scope.mouseButtons.PAN: - if (scope.enablePan === false) - return; - handleMouseDownPan(event); - state = STATE.PAN; - break; - } - event.preventDefault(); - if (state !== STATE.NONE) { - document.addEventListener("mousemove", onMouseMove, false); - document.addEventListener("mouseup", onMouseUp, false); - scope.dispatchEvent(startEvent); - } - } - function onMouseMove(event) { - if (scope.enabled === false) - return; - switch (state) { - case STATE.ROTATE: - if (scope.enableRotate === false) - return; - handleMouseMoveRotate(event); - break; - case STATE.DOLLY: - if (scope.enableZoom === false) - return; - handleMouseMoveDolly(event); - break; - case STATE.PAN: - if (scope.enablePan === false) - return; - handleMouseMovePan(event); - break; - } - event.preventDefault(); - } - function onMouseUp(event) { - if (scope.enabled === false) - return; - handleMouseUp(event); - document.removeEventListener("mousemove", onMouseMove, false); - document.removeEventListener("mouseup", onMouseUp, false); - scope.dispatchEvent(endEvent); - state = STATE.NONE; - } - function onMouseWheel(event) { - if (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE)) - return; - event.preventDefault(); - event.stopPropagation(); - handleMouseWheel(event); - scope.dispatchEvent(startEvent); // not sure why these are here... - scope.dispatchEvent(endEvent); - } - function onKeyDown(event) { - if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) - return; - handleKeyDown(event); - } - function onTouchStart(event) { - if (scope.enabled === false) - return; - switch (event.touches.length) { - case 1:// one-fingered touch: rotate - if (scope.enableRotate === false) - return; - handleTouchStartRotate(event); - state = STATE.TOUCH_ROTATE; - break; - case 2:// two-fingered touch: dolly - if (scope.enableZoom === false) - return; - handleTouchStartDolly(event); - state = STATE.TOUCH_DOLLY; - break; - case 3:// three-fingered touch: pan - if (scope.enablePan === false) - return; - handleTouchStartPan(event); - state = STATE.TOUCH_PAN; - break; - default: - state = STATE.NONE; - } - if (state !== STATE.NONE) { - scope.dispatchEvent(startEvent); - } - } - function onTouchMove(event) { - if (scope.enabled === false) - return; - switch (event.touches.length) { - case 1:// one-fingered touch: rotate - if (scope.enableRotate === false) - return; - if (state !== STATE.TOUCH_ROTATE) - return; // is this needed?... - handleTouchMoveRotate(event); - break; - case 2:// two-fingered touch: dolly - if (scope.enableZoom === false) - return; - if (state !== STATE.TOUCH_DOLLY) - return; // is this needed?... - handleTouchMoveDolly(event); - break; - case 3:// three-fingered touch: pan - if (scope.enablePan === false) - return; - if (state !== STATE.TOUCH_PAN) - return; // is this needed?... - handleTouchMovePan(event); - break; - default: - state = STATE.NONE; - } - event.preventDefault(); - event.stopPropagation(); - } - function onTouchEnd(event) { - if (scope.enabled === false) - return; - handleTouchEnd(event); - scope.dispatchEvent(endEvent); - state = STATE.NONE; - } - function onContextMenu(event) { - if (scope.enabled === false || scope.enablePan === false) - return; - event.preventDefault(); - } - // - scope.domElement.addEventListener("contextmenu", onContextMenu, false); - scope.domElement.addEventListener("mousedown", onMouseDown, false); - scope.domElement.addEventListener("wheel", onMouseWheel, false); - scope.domElement.addEventListener("touchstart", onTouchStart, false); - scope.domElement.addEventListener("touchend", onTouchEnd, false); - scope.domElement.addEventListener("touchmove", onTouchMove, false); - window.addEventListener("keydown", onKeyDown, false); - // force an update at start - this.update(); - } -} - -export { OrbitControls }; diff --git a/src/skinview3d.js b/src/skinview3d.js deleted file mode 100644 index cffcaab..0000000 --- a/src/skinview3d.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @license - * skinview3d - * - * Copyright (C) 2017 the original author or authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - * @author yushijinhun - * @author Hacksore - * @author Kent Rasmussen - */ - -export { SkinObject, CapeObject, PlayerObject } from "./model"; -export { SkinViewer, SkinControl } from "./viewer"; -export { CompositeAnimation, WalkAnimation } from "./animation"; diff --git a/src/viewer.js b/src/viewer.js deleted file mode 100644 index e0f6018..0000000 --- a/src/viewer.js +++ /dev/null @@ -1,245 +0,0 @@ -import * as THREE from "three"; -import { PlayerObject } from "./model"; -import { OrbitControls } from "./orbit_controls"; -import { invokeAnimation } from "./animation"; - -function copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) { - let imgData = context.getImageData(sX, sY, w, h); - if (flipHorizontal) { - for (let y = 0; y < h; y++) { - for (let x = 0; x < (w / 2); x++) { - let index = (x + y * w) * 4; - let index2 = ((w - x - 1) + y * w) * 4; - let pA1 = imgData.data[index]; - let pA2 = imgData.data[index + 1]; - let pA3 = imgData.data[index + 2]; - let pA4 = imgData.data[index + 3]; - - let pB1 = imgData.data[index2]; - let pB2 = imgData.data[index2 + 1]; - let pB3 = imgData.data[index2 + 2]; - let pB4 = imgData.data[index2 + 3]; - - imgData.data[index] = pB1; - imgData.data[index + 1] = pB2; - imgData.data[index + 2] = pB3; - imgData.data[index + 3] = pB4; - - imgData.data[index2] = pA1; - imgData.data[index2 + 1] = pA2; - imgData.data[index2 + 2] = pA3; - imgData.data[index2 + 3] = pA4; - } - } - } - context.putImageData(imgData, dX, dY); -} - -function convertSkinTo1_8(context, width) { - let scale = width / 64.0; - let copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal); - - copySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg - copySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg - copySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg - copySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg - copySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg - copySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg - copySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm - copySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm - copySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm - copySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm - copySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm - copySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm -} - -class SkinViewer { - constructor(options) { - this.domElement = options.domElement; - this.animation = options.animation || null; - this.animationPaused = false; - this.animationTime = 0; - this.disposed = false; - - // texture - this.skinImg = new Image(); - this.skinCanvas = document.createElement("canvas"); - this.skinTexture = new THREE.Texture(this.skinCanvas); - this.skinTexture.magFilter = THREE.NearestFilter; - this.skinTexture.minFilter = THREE.NearestMipMapNearestFilter; - - this.capeImg = new Image(); - this.capeCanvas = document.createElement("canvas"); - this.capeTexture = new THREE.Texture(this.capeCanvas); - this.capeTexture.magFilter = THREE.NearestFilter; - this.capeTexture.minFilter = THREE.NearestMipMapNearestFilter; - - this.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide }); - this.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide }); - this.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture }); - - // scene - this.scene = new THREE.Scene(); - - this.camera = new THREE.PerspectiveCamera(75); - this.camera.position.y = -12; - this.camera.position.z = 30; - - this.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false }); - this.renderer.setSize(300, 300); // default size - this.renderer.context.getShaderInfoLog = () => ""; // shut firefox up - this.domElement.appendChild(this.renderer.domElement); - - this.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial); - this.scene.add(this.playerObject); - - // texture loading - this.skinImg.crossOrigin = ""; - this.skinImg.onerror = () => console.error("Failed loading " + this.skinImg.src); - this.skinImg.onload = () => { - let isOldFormat = false; - if (this.skinImg.width !== this.skinImg.height) { - if (this.skinImg.width === 2 * this.skinImg.height) { - isOldFormat = true; - } else { - console.error("Bad skin size"); - return; - } - } - - let skinContext = this.skinCanvas.getContext("2d"); - if (isOldFormat) { - let width = this.skinImg.width; - this.skinCanvas.width = width; - this.skinCanvas.height = width; - skinContext.clearRect(0, 0, width, width); - skinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0); - convertSkinTo1_8(skinContext, width); - } else { - this.skinCanvas.width = this.skinImg.width; - this.skinCanvas.height = this.skinImg.height; - skinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height); - skinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height); - } - - this.skinTexture.needsUpdate = true; - this.layer1Material.needsUpdate = true; - this.layer2Material.needsUpdate = true; - - this.playerObject.skin.visible = true; - }; - - this.capeImg.crossOrigin = ""; - this.capeImg.onerror = () => console.error("Failed loading " + this.capeImg.src); - this.capeImg.onload = () => { - if (this.capeImg.width !== 2 * this.capeImg.height) { - console.error("Bad cape size"); - return; - } - - this.capeCanvas.width = this.capeImg.width; - this.capeCanvas.height = this.capeImg.height; - let capeContext = this.capeCanvas.getContext("2d"); - capeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height); - capeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height); - - this.capeTexture.needsUpdate = true; - this.capeMaterial.needsUpdate = true; - - this.playerObject.cape.visible = true; - }; - - if (options.skinUrl) this.skinUrl = options.skinUrl; - if (options.capeUrl) this.capeUrl = options.capeUrl; - if (options.width) this.width = options.width; - if (options.height) this.height = options.height; - - let draw = () => { - if (this.disposed) return; - window.requestAnimationFrame(draw); - if (!this.animationPaused) { - this.animationTime++; - if (this.animation) { - invokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0); - } - } - this.renderer.render(this.scene, this.camera); - }; - draw(); - } - - setSize(width, height) { - this.camera.aspect = width / height; - this.camera.updateProjectionMatrix(); - this.renderer.setSize(width, height); - } - - dispose() { - this.disposed = true; - this.domElement.removeChild(this.renderer.domElement); - this.renderer.dispose(); - this.skinTexture.dispose(); - this.capeTexture.dispose(); - } - - get skinUrl() { - return this.skinImg.src; - } - - set skinUrl(url) { - this.skinImg.src = url; - } - - get capeUrl() { - return this.capeImg.src; - } - - set capeUrl(url) { - this.capeImg.src = url; - } - - get width() { - return this.renderer.getSize().width; - } - - set width(newWidth) { - this.setSize(newWidth, this.height); - } - - get height() { - return this.renderer.getSize().height; - } - - set height(newHeight) { - this.setSize(this.width, newHeight); - } -} - -class SkinControl { - constructor(skinViewer) { - this.enableAnimationControl = true; - this.skinViewer = skinViewer; - - this.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement); - this.orbitControls.enablePan = false; - this.orbitControls.target = new THREE.Vector3(0, -12, 0); - this.orbitControls.minDistance = 10; - this.orbitControls.maxDistance = 256; - this.orbitControls.update(); - - this.animationPauseListener = e => { - if (this.enableAnimationControl) { - e.preventDefault(); - this.skinViewer.animationPaused = !this.skinViewer.animationPaused; - } - }; - this.skinViewer.domElement.addEventListener("contextmenu", this.animationPauseListener, false); - } - - dispose() { - this.skinViewer.domElement.removeEventListener("contextmenu", this.animationPauseListener, false); - this.orbitControls.dispose(); - } -} - -export { SkinViewer, SkinControl }; diff --git a/tools/rollup-util.js b/tools/rollup-util.js deleted file mode 100644 index 4de8ae6..0000000 --- a/tools/rollup-util.js +++ /dev/null @@ -1,63 +0,0 @@ -import uglify from "rollup-plugin-uglify"; -import babel from "rollup-plugin-babel"; -import resolve from "rollup-plugin-node-resolve"; - -let buildType = config => { - let options = { - input: "src/skinview3d.js", - output: [], - external:[ - "three" - ], - plugins: [ - resolve() - ] - }; - - switch (config.format) { - case "umd": - options.output.push({ - format: "umd", - name: "skinview3d", - file: `build/skinview3d${config.postfix}.js`, - indent: "\t", - sourcemap: true, - globals: { - "three": "THREE" - } - }); - break; - - case "es": - options.output.push({ - format: "es", - file: `build/skinview3d${config.postfix}.js`, - indent: "\t", - sourcemap: true, - }); - break; - - default: - throw `Unknown format: ${config.format}`; - } - - if (config.babel) { - options.plugins.push( - babel({ - exclude: "node_modules/**" - }) - ); - } - - if (config.uglify) { - options.plugins.push( - uglify({ - output: { - comments: "some" - } - }) - ); - } - return options; -}; -export { buildType }; diff --git a/tools/rollup.browser.js b/tools/rollup.browser.js deleted file mode 100644 index a05689c..0000000 --- a/tools/rollup.browser.js +++ /dev/null @@ -1,7 +0,0 @@ -import { buildType } from "./rollup-util"; -export default buildType({ - postfix: "", - babel: true, - uglify: false, - format: "umd" -}); diff --git a/tools/rollup.browser.min.js b/tools/rollup.browser.min.js deleted file mode 100644 index c31a19d..0000000 --- a/tools/rollup.browser.min.js +++ /dev/null @@ -1,7 +0,0 @@ -import { buildType } from "./rollup-util"; -export default buildType({ - postfix: ".min", - babel: true, - uglify: true, - format: "umd" -}); diff --git a/tools/rollup.module.js b/tools/rollup.module.js deleted file mode 100644 index 359afc3..0000000 --- a/tools/rollup.module.js +++ /dev/null @@ -1,7 +0,0 @@ -import { buildType } from "./rollup-util"; -export default buildType({ - postfix: ".module", - babel: true, - uglify: false, - format: "es" -}); From 13de2acf998f2a8106f8f035ba647dc3b4e724d2 Mon Sep 17 00:00:00 2001 From: Hacksore Date: Sun, 4 Feb 2018 16:46:52 -0600 Subject: [PATCH 2/7] Updated to the latest codebase and refactored the folder structure --- .gitignore | 124 ++-- LICENSE | 1348 +++++++++++++++++++------------------- README.md | 110 ++-- examples/hd.html | 108 +-- examples/javascript.html | 106 +-- examples/jquery.html | 114 ++-- index.html | 134 ++-- js/skinview3d.js | 108 +-- js/skinview3d.module.js | 108 +-- 9 files changed, 1130 insertions(+), 1130 deletions(-) diff --git a/.gitignore b/.gitignore index 0ec4966..13f1014 100644 --- a/.gitignore +++ b/.gitignore @@ -1,63 +1,63 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -build/ -_ignore/ - +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +build/ +_ignore/ + package.json.lock \ No newline at end of file diff --git a/LICENSE b/LICENSE index 9cecc1d..c65825e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,674 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 1a72bbe..70ddc4c 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,55 @@ -skinview3d -======== - -[![Travis](https://img.shields.io/travis/to2mbn/skinview3d.svg?style=flat-square)](https://travis-ci.org/to2mbn/skinview3d) -[![npm](https://img.shields.io/npm/v/skinview3d.svg?style=flat-square)](https://www.npmjs.com/package/skinview3d) -[![license](https://img.shields.io/github/license/to2mbn/skinview3d.svg?style=flat-square)](https://github.com/to2mbn/skinview3d/blob/master/LICENSE) - -Three.js powered Minecraft skin viewer. - -# Features -* 1.8 Skins -* HD Skins -* Capes -* Slim arms - -# Usage -```html -
- -``` - -# Build -`npm run build` +skinview3d +======== + +[![Travis](https://img.shields.io/travis/to2mbn/skinview3d.svg?style=flat-square)](https://travis-ci.org/to2mbn/skinview3d) +[![npm](https://img.shields.io/npm/v/skinview3d.svg?style=flat-square)](https://www.npmjs.com/package/skinview3d) +[![license](https://img.shields.io/github/license/to2mbn/skinview3d.svg?style=flat-square)](https://github.com/to2mbn/skinview3d/blob/master/LICENSE) + +Three.js powered Minecraft skin viewer. + +# Features +* 1.8 Skins +* HD Skins +* Capes +* Slim arms + +# Usage +```html +
+ +``` + +# Build +`npm run build` diff --git a/examples/hd.html b/examples/hd.html index e6dfb5c..d0e2f23 100644 --- a/examples/hd.html +++ b/examples/hd.html @@ -1,55 +1,55 @@ - - - - - skinpreview3d.js example using jQuery - - - - -

HD

-
- - - - - - + + + + + skinpreview3d.js example using jQuery + + + + +

HD

+
+ + + + + + \ No newline at end of file diff --git a/examples/javascript.html b/examples/javascript.html index 6f012b6..7461827 100644 --- a/examples/javascript.html +++ b/examples/javascript.html @@ -1,54 +1,54 @@ - - - - - skinpreview3d.js example using pure javascript - - - -

pure javascript

-
- - - - - + + + + + skinpreview3d.js example using pure javascript + + + +

pure javascript

+
+ + + + + \ No newline at end of file diff --git a/examples/jquery.html b/examples/jquery.html index ce57336..8ed4d54 100644 --- a/examples/jquery.html +++ b/examples/jquery.html @@ -1,58 +1,58 @@ - - - - - skinpreview3d.js example using jQuery - - - - -

jQuery

-
- - - - - - - - + + + + + skinpreview3d.js example using jQuery + + + + +

jQuery

+
+ + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html index 0df9496..682c972 100644 --- a/index.html +++ b/index.html @@ -1,68 +1,68 @@ - - - - - skinpreview3d.js examples - - - - -
- skinview3d lets you display Minecraft charecters on the web with Three.js. -
- - - jQuery - - - Native javascript - - - - HD Skin - - - - - + + + + + skinpreview3d.js examples + + + + +
+ skinview3d lets you display Minecraft charecters on the web with Three.js. +
+ + + jQuery + + + Native javascript + + + + HD Skin + + + + + \ No newline at end of file diff --git a/js/skinview3d.js b/js/skinview3d.js index cbb830d..2bbe5c9 100644 --- a/js/skinview3d.js +++ b/js/skinview3d.js @@ -296,38 +296,38 @@ var OrbitControls = function (_THREE$EventDispatche) { inherits(OrbitControls, _THREE$EventDispatche); - /** - * @preserve - * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js + /** + * @preserve + * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js */ - /** - * @license - * Copyright (C) 2010-2017 three.js authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com + /** + * @license + * Copyright (C) 2010-2017 three.js authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com */ // This set of controls performs orbiting, dollying (zooming), and panning. @@ -1213,29 +1213,29 @@ return SkinControl; }(); - /** - * @license - * skinview3d - * - * Copyright (C) 2017 the original author or authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - * @author yushijinhun - * @author Hacksore - * @author Kent Rasmussen + /** + * @license + * skinview3d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen */ exports.SkinObject = SkinObject; diff --git a/js/skinview3d.module.js b/js/skinview3d.module.js index 0f9e243..298e3e4 100644 --- a/js/skinview3d.module.js +++ b/js/skinview3d.module.js @@ -292,38 +292,38 @@ var PlayerObject = function (_THREE$Group3) { var OrbitControls = function (_THREE$EventDispatche) { inherits(OrbitControls, _THREE$EventDispatche); - /** - * @preserve - * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js + /** + * @preserve + * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js */ - /** - * @license - * Copyright (C) 2010-2017 three.js authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com + /** + * @license + * Copyright (C) 2010-2017 three.js authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com */ // This set of controls performs orbiting, dollying (zooming), and panning. @@ -1209,29 +1209,29 @@ var SkinControl = function () { return SkinControl; }(); -/** - * @license - * skinview3d - * - * Copyright (C) 2017 the original author or authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - * @author yushijinhun - * @author Hacksore - * @author Kent Rasmussen +/** + * @license + * skinview3d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen */ export { SkinObject, CapeObject, PlayerObject, SkinViewer, SkinControl, CompositeAnimation, WalkAnimation }; From 9262218f73a83dbfd79dc729f3952871b7cbd6f7 Mon Sep 17 00:00:00 2001 From: Hacksore Date: Sun, 4 Feb 2018 16:53:26 -0600 Subject: [PATCH 3/7] Fixed paths for resources --- examples/hd.html | 4 ++-- examples/javascript.html | 6 +++--- examples/jquery.html | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/hd.html b/examples/hd.html index d0e2f23..e9856ab 100644 --- a/examples/hd.html +++ b/examples/hd.html @@ -18,14 +18,14 @@ - + - + - + - + - \ No newline at end of file + diff --git a/examples/javascript.html b/examples/javascript.html index 02012be..d76226f 100644 --- a/examples/javascript.html +++ b/examples/javascript.html @@ -2,7 +2,7 @@ - skinpreview3d.js example using pure javascript + skinview3d example using Javascript -

pure javascript

+

Native Javascript

- + - \ No newline at end of file + diff --git a/examples/jquery.html b/examples/jquery.html deleted file mode 100644 index 28c9e38..0000000 --- a/examples/jquery.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - skinpreview3d.js example using jQuery - - - - -

jQuery

-
- - - - - - - - - \ No newline at end of file diff --git a/examples/misc.html b/examples/misc.html new file mode 100644 index 0000000..ed55cb0 --- /dev/null +++ b/examples/misc.html @@ -0,0 +1,56 @@ + + + + + skinview3d Advanced example + + + + +

Miscellaneous example

+
+ +

Hover the avatars

+
+ + + +
+ + + + + + diff --git a/img/haka.png b/img/haka.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcbfc5cb8439ff711c588e451a5556b5251f52e GIT binary patch literal 1973 zcmV;m2TJ&fP)H1O){J1_cEM1_lQP1_%cS2nYxX2M7rX2?_`a3JD1c3JMDe z3JVJh3?6BQK|77`Q|78Vy16&Ms27#J8C6&D#678w^88WtED z8X6lH85%CMO^xCnqN;Atfj%C@CT(DkCN0EHNo9 zF)=YSDlRiKGc+qNG%PSSEipDWHa9LZH#avpE;BedI5{sgIxsalIyyTsHaj~zJTf;u zGdMmpIX^WzKsGx-KtMt^JVHW3Mmj)9JVHoBNJ%|IN!zFAq*%9h zUFToCa}$Em@ZqE95%1xF-^)4Y-kWm>qG=?Bfl5fqYBDLHf^bjORE z#e_3-XDW&kXRZ!lJtp+`-C*Joysfe7rsi`N&rwVs#rS?E64F!C(*WT6-F!OE5JY~i zns;BdZQt?n)YS2D@a%SeIXrahqYpkFVs#xyz`p;*=Y7MUeD>)?fDL~YW^eTbsB`l% zL9Gyw{hd2d38E-OiWMy~K63MVGF!2ykOXt4AZSIk2;Y-ax_$?8fD`49SMp06vjXfECZyyKF~B_*Po%T?jh$6h?758|kIy}3?6(YhV^_x+x5wib zql(Bg=8@jp+uN>%sa2)|aIIJHY_DVtG+N7|euh2AnGBYtTqw6a(Bt?;INQZNP z0oXTToFw54$O$l#MqCR(0~H|`g$-QzQJMl#2>#fnZ@{n~2qpk=(#eAap+F#jTm}N( z;GjVS7Gmwbq+^5`Db3jcpbm#I0rW168XZL-f>Rh`?LH^zT-y}F*qVBXB|Iw2qad1^ z0+HQEoUTKLCV(XAlL*4C1TY~CcSsK6xI=7EhTD`h{Uj7o=g^Ru!jL@zBLg!8%H={> z1b|cu0{|wQ0NE^Jn;L{M!OQ`t5WryvWp;X+m4ikK5CR0if?T4mUn5O`#Mx57h(NOj z;V>>73StplXMmR&Z(KRmrl{NNurb40m`Z6#I*IA zb}m5T)N*3QT2;LiKq-|vr_dTi+-|=4twe(NGHxclnTtfmM0G9`QRmZwpNUM)-^+Cb zh;Fa4Y`XV~W6a=Sv$@BYx5}mU?UJ7v;I+p)<&FS>@r>k6SB-f+1AQJQR$7mE6U*zx z+qGKGe{(=cm&)mm03Rc?s-F=UCfb~k#KgGhkBHvB_pZ8qV-cP>uVpIv)xtt9M_kk< zH#gIzjg8EO0Yv$SYINc0B>k+Ork1=-J5(-3@ zJ5T{Rye$91aoR7_E({EfgGQq@OTr_}-c++o^OIcx51;MsHGt6SpYRa11D1Z-DRc!) z%-nr&uz#>`1DuMW_|vx56#)7NjfOpi(-EZS3h|D$z>VWBC($$v4l^sdZav10-VDu^ z=i#<#%ZVsFTrwps;T-$TCJ7w@rUmFhRwKa#JRkUdjF_$cT)n-uRVX}ue7haMW%M{? z7-jWB!=N|%z21?SR@3s8s#@5tsciwsoEfmWtQ0uTOu;+QKj;^tydaDTqLLVK09sAb zm>UAfng@^}C&``%ilVF}aL+|9YaZZ?A`a2#0T?B~JsS@mRt>mj4SE7xRtC+%0|Urw z*C}JZkj@8yVJmDQkhP6ca~scB1B551u(6Y8ccIfwtXR*5-a8~<2q^P`r1qKKD00000NkvXX Hu0mjfu);A- literal 0 HcmV?d00001 diff --git a/img/sethbling.png b/img/sethbling.png new file mode 100644 index 0000000000000000000000000000000000000000..db47a845b4c139e9df1bf41b38eee5c6c20062cf GIT binary patch literal 1469 zcmV;u1w#6XP)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ5000F@ zNkl>o=cJ#6?B;z%-{#IwM{S2!LC5_W#ucd9cg9 z|H7bl=paSr0|XEgC7NLX-SfD_$N{)KPe_hf01!YV1%QMg1S11{9;H?w&=LRy5YYjE z>~Zu!7|H-3fGExasVQY-$qg0&5I{r+z>D|T*+U%w1Q1Cn0OWCOp2rr`Lm~D-03d*< zQVW0pvWKbZc~DhHjvTQ7Ab=R%gc7^deq1YJFUHlQU~&^{A?qJ2PaN2FwSM8 zN)-qK00G28NCC+63vWZh=+TC5FfA8Q3Z~;#8L3_#pvNl6qad;W$-fxb)%zIK)fpIW zGFUO(n)?MVhpwI!01!Yp0{|B5&D~vKT2Wkr;o90pIQ#y~7ht*CQb=+qHz2SjW8~Hy zxFv|z+Eb4|4h(%vIS?OLfZ!4b2q26AfO%X*3_`=2v>?DNB#)vNBnMLm1C*o)Y|UDH zO52q16(pvOAMqaY7~0z%y}0W7v1McWAm&t{+q5Z~Ot9j*sv#+z3VGeLm>qp<;y zTP|CshOK<$_K56p@<^%DwM5C8}uZ~(v@2y-yZL&!-UY#|N+^E}Aov}z>b zv!42{9VW|Ke;ER1? z0YCsTqK^m2`PKdZ`0*nHKR-VMh&Fh<6h;2vy*GF*1roVhqyftrbz@a&%@XXqNM2u2q26AK=wR{j(5@^*-#_&pDz=?nk@h+qm>xbFsvd=dczLG|m|otwaH&Kr;bIQx(dBF6`;dp}V( z1%Q%0auy&J00a;tpIzR6kmdYxx)`2EreO|57eD>~0*0aBd=3OKIdncca1pQv)3sOE zgXw1NKrp@M!$Hd1{2RC8EfW9&hy~&i%$UcdF|!A_jQD_QC|Dc_4qk;6g8bSLJ~p)= z01jXvfHhi5pnQ4&fB<5FS&rZHAK?zgCJq9i799+H{B#+`l8=ud{DYqnYLHuKumFPv z5Hg?AF0UE^d4K?-I0e9B85w+-%gMlCZ5#{&$=|^RD+t5**gOx@15$^LPip`WKor*k z@cfDeAg3;J0jMUR1Q41z0tg@$SmT43G639Eg_e78ngM&DAO{X%vvJeNWd&IQKtLWK zfEeu*g~4s>3w*YC6&idxj8&YFK1#u^rIZb@nrmC)O#uJ_!~$>X?!)du7{JvezHl2y z3IJAp;A{n|0&!#=VrX(&cccJ-0D?D#VIBlEeX+4|0h}Iyc^;n{B4}Xmj^V-UTVQiQ zY;1s#JU##rKr9*xJPbD;d|?35uzha~00=Mu XfQ3%OJ~(3H00000NkvXXu0mjf0cKJ_ literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 682c972..d9edad5 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - skinpreview3d.js examples + skinview3d examples - - - -

HD

-
- - - - - - + + + + + skinview3d example using Javascript + + + + +

HD

+
+ + + + + + diff --git a/examples/javascript.html b/examples/javascript.html index d76226f..962215f 100644 --- a/examples/javascript.html +++ b/examples/javascript.html @@ -1,54 +1,54 @@ - - - - - skinview3d example using Javascript - - - -

Native Javascript

-
- - - - - - + + + + + skinview3d example using Javascript + + + +

Native Javascript

+
+ + + + + + diff --git a/index.html b/index.html index d9edad5..61daf0e 100644 --- a/index.html +++ b/index.html @@ -1,68 +1,68 @@ - - - - - skinview3d examples - - - - -
- skinview3d lets you display Minecraft charecters on the web with Three.js. -
- - - Basic example - - - - HD Skin example - - - - Miscellaneous example - - - - - + + + + + skinview3d examples + + + + +
+ skinview3d lets you display Minecraft charecters on the web with Three.js. +
+ + + Basic example + + + + HD Skin example + + + + Miscellaneous example + + + + + From 486df8b552a98373bac4cb94cf58a718af6f5887 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Mon, 5 Feb 2018 23:27:35 +0800 Subject: [PATCH 7/7] update codebase --- js/skinview3d.js | 108 ++++++++++++++++++------------------ js/skinview3d.js.map | 2 +- js/skinview3d.min.js.map | 2 +- js/skinview3d.module.js | 108 ++++++++++++++++++------------------ js/skinview3d.module.js.map | 2 +- 5 files changed, 111 insertions(+), 111 deletions(-) diff --git a/js/skinview3d.js b/js/skinview3d.js index 2bbe5c9..cbb830d 100644 --- a/js/skinview3d.js +++ b/js/skinview3d.js @@ -296,38 +296,38 @@ var OrbitControls = function (_THREE$EventDispatche) { inherits(OrbitControls, _THREE$EventDispatche); - /** - * @preserve - * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js + /** + * @preserve + * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js */ - /** - * @license - * Copyright (C) 2010-2017 three.js authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com + /** + * @license + * Copyright (C) 2010-2017 three.js authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com */ // This set of controls performs orbiting, dollying (zooming), and panning. @@ -1213,29 +1213,29 @@ return SkinControl; }(); - /** - * @license - * skinview3d - * - * Copyright (C) 2017 the original author or authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - * @author yushijinhun - * @author Hacksore - * @author Kent Rasmussen + /** + * @license + * skinview3d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen */ exports.SkinObject = SkinObject; diff --git a/js/skinview3d.js.map b/js/skinview3d.js.map index 4a80856..254cf07 100644 --- a/js/skinview3d.js.map +++ b/js/skinview3d.js.map @@ -1 +1 @@ -{"version":3,"file":"skinview3d.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js","../src/skinview3d.js"],"sourcesContent":["import * as THREE from \"three\";\r\n\r\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\r\n\treturn [\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\r\n\t];\r\n}\r\n\r\nfunction toSkinVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\r\n}\r\n\r\nfunction toCapeVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\r\n}\r\n\r\nfunction addVertices(box, top, bottom, left, front, right, back) {\r\n\tbox.faceVertexUvs[0] = [];\r\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\r\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\r\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\r\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\r\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\r\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\r\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\r\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\r\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\r\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\r\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\r\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\r\n}\r\n\r\nconst esp = 0.002;\r\n\r\nclass SkinObject extends THREE.Group {\r\n\tconstructor(isSlim, layer1Material, layer2Material) {\r\n\t\tsuper();\r\n\r\n\t\t// Head\r\n\t\tthis.head = new THREE.Group();\r\n\r\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\r\n\t\taddVertices(headBox,\r\n\t\t\ttoSkinVertices(8, 0, 16, 8),\r\n\t\t\ttoSkinVertices(16, 0, 24, 8),\r\n\t\t\ttoSkinVertices(0, 8, 8, 16),\r\n\t\t\ttoSkinVertices(8, 8, 16, 16),\r\n\t\t\ttoSkinVertices(16, 8, 24, 16),\r\n\t\t\ttoSkinVertices(24, 8, 32, 16)\r\n\t\t);\r\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\r\n\t\tthis.head.add(headMesh);\r\n\r\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\r\n\t\taddVertices(head2Box,\r\n\t\t\ttoSkinVertices(40, 0, 48, 8),\r\n\t\t\ttoSkinVertices(48, 0, 56, 8),\r\n\t\t\ttoSkinVertices(32, 8, 40, 16),\r\n\t\t\ttoSkinVertices(40, 8, 48, 16),\r\n\t\t\ttoSkinVertices(48, 8, 56, 16),\r\n\t\t\ttoSkinVertices(56, 8, 64, 16)\r\n\t\t);\r\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\r\n\t\thead2Mesh.renderOrder = -1;\r\n\t\tthis.head.add(head2Mesh);\r\n\r\n\t\tthis.add(this.head);\r\n\r\n\r\n\t\t// Body\r\n\t\tthis.body = new THREE.Group();\r\n\r\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\r\n\t\taddVertices(bodyBox,\r\n\t\t\ttoSkinVertices(20, 16, 28, 20),\r\n\t\t\ttoSkinVertices(28, 16, 36, 20),\r\n\t\t\ttoSkinVertices(16, 20, 20, 32),\r\n\t\t\ttoSkinVertices(20, 20, 28, 32),\r\n\t\t\ttoSkinVertices(28, 20, 32, 32),\r\n\t\t\ttoSkinVertices(32, 20, 40, 32)\r\n\t\t);\r\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\r\n\t\tthis.body.add(bodyMesh);\r\n\r\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\r\n\t\taddVertices(body2Box,\r\n\t\t\ttoSkinVertices(20, 32, 28, 36),\r\n\t\t\ttoSkinVertices(28, 32, 36, 36),\r\n\t\t\ttoSkinVertices(16, 36, 20, 48),\r\n\t\t\ttoSkinVertices(20, 36, 28, 48),\r\n\t\t\ttoSkinVertices(28, 36, 32, 48),\r\n\t\t\ttoSkinVertices(32, 36, 40, 48)\r\n\t\t);\r\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\r\n\t\tthis.body.add(body2Mesh);\r\n\r\n\t\tthis.body.position.y = -10;\r\n\t\tthis.add(this.body);\r\n\r\n\r\n\t\t// Right Arm\r\n\t\tthis.rightArm = new THREE.Group();\r\n\t\tlet rightArmPivot = new THREE.Group();\r\n\r\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\r\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\r\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\r\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\r\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\r\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\r\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\r\n\t\trightArmPivot.add(rightArmMesh);\r\n\r\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\r\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\r\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\r\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\r\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\r\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\r\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\r\n\t\trightArm2Mesh.renderOrder = 1;\r\n\t\trightArmPivot.add(rightArm2Mesh);\r\n\r\n\t\trightArmPivot.position.y = -6;\r\n\t\tthis.rightArm.add(rightArmPivot);\r\n\t\tthis.rightArm.position.y = -4;\r\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\r\n\t\tthis.add(this.rightArm);\r\n\r\n\r\n\t\t// Left Arm\r\n\t\tthis.leftArm = new THREE.Group();\r\n\t\tlet leftArmPivot = new THREE.Group();\r\n\r\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\r\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\r\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\r\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\r\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\r\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\r\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\r\n\t\tleftArmPivot.add(leftArmMesh);\r\n\r\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\r\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\r\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\r\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\r\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\r\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\r\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\r\n\t\tleftArm2Mesh.renderOrder = 1;\r\n\t\tleftArmPivot.add(leftArm2Mesh);\r\n\r\n\t\tleftArmPivot.position.y = -6;\r\n\t\tthis.leftArm.add(leftArmPivot);\r\n\t\tthis.leftArm.position.y = -4;\r\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\r\n\t\tthis.add(this.leftArm);\r\n\r\n\r\n\t\t// Right Leg\r\n\t\tthis.rightLeg = new THREE.Group();\r\n\t\tlet rightLegPivot = new THREE.Group();\r\n\r\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLegBox,\r\n\t\t\ttoSkinVertices(4, 16, 8, 20),\r\n\t\t\ttoSkinVertices(8, 16, 12, 20),\r\n\t\t\ttoSkinVertices(0, 20, 4, 32),\r\n\t\t\ttoSkinVertices(4, 20, 8, 32),\r\n\t\t\ttoSkinVertices(8, 20, 12, 32),\r\n\t\t\ttoSkinVertices(12, 20, 16, 32)\r\n\t\t);\r\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\r\n\t\trightLegPivot.add(rightLegMesh);\r\n\r\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLeg2Box,\r\n\t\t\ttoSkinVertices(4, 32, 8, 36),\r\n\t\t\ttoSkinVertices(8, 32, 12, 36),\r\n\t\t\ttoSkinVertices(0, 36, 4, 48),\r\n\t\t\ttoSkinVertices(4, 36, 8, 48),\r\n\t\t\ttoSkinVertices(8, 36, 12, 48),\r\n\t\t\ttoSkinVertices(12, 36, 16, 48)\r\n\t\t);\r\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\r\n\t\trightLeg2Mesh.renderOrder = 1;\r\n\t\trightLegPivot.add(rightLeg2Mesh);\r\n\r\n\t\trightLegPivot.position.y = -6;\r\n\t\tthis.rightLeg.add(rightLegPivot);\r\n\t\tthis.rightLeg.position.y = -16;\r\n\t\tthis.rightLeg.position.x = -2;\r\n\t\tthis.add(this.rightLeg);\r\n\r\n\t\t// Left Leg\r\n\t\tthis.leftLeg = new THREE.Group();\r\n\t\tlet leftLegPivot = new THREE.Group();\r\n\r\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLegBox,\r\n\t\t\ttoSkinVertices(20, 48, 24, 52),\r\n\t\t\ttoSkinVertices(24, 48, 28, 52),\r\n\t\t\ttoSkinVertices(16, 52, 20, 64),\r\n\t\t\ttoSkinVertices(20, 52, 24, 64),\r\n\t\t\ttoSkinVertices(24, 52, 28, 64),\r\n\t\t\ttoSkinVertices(28, 52, 32, 64)\r\n\t\t);\r\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\r\n\t\tleftLegPivot.add(leftLegMesh);\r\n\r\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLeg2Box,\r\n\t\t\ttoSkinVertices(4, 48, 8, 52),\r\n\t\t\ttoSkinVertices(8, 48, 12, 52),\r\n\t\t\ttoSkinVertices(0, 52, 4, 64),\r\n\t\t\ttoSkinVertices(4, 52, 8, 64),\r\n\t\t\ttoSkinVertices(8, 52, 12, 64),\r\n\t\t\ttoSkinVertices(12, 52, 16, 64)\r\n\t\t);\r\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\r\n\t\tleftLeg2Mesh.renderOrder = 1;\r\n\t\tleftLegPivot.add(leftLeg2Mesh);\r\n\r\n\t\tleftLegPivot.position.y = -6;\r\n\t\tthis.leftLeg.add(leftLegPivot);\r\n\t\tthis.leftLeg.position.y = -16;\r\n\t\tthis.leftLeg.position.x = 2;\r\n\t\tthis.add(this.leftLeg);\r\n\t}\r\n}\r\n\r\nclass CapeObject extends THREE.Group {\r\n\tconstructor(capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\t// back = outside\r\n\t\t// front = inside\r\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\r\n\t\taddVertices(capeBox,\r\n\t\t\ttoCapeVertices(1, 0, 11, 1),\r\n\t\t\ttoCapeVertices(11, 0, 21, 1),\r\n\t\t\ttoCapeVertices(11, 1, 12, 17),\r\n\t\t\ttoCapeVertices(12, 1, 22, 17),\r\n\t\t\ttoCapeVertices(0, 1, 1, 17),\r\n\t\t\ttoCapeVertices(1, 1, 11, 17)\r\n\t\t);\r\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\r\n\t\tthis.cape.position.y = -8;\r\n\t\tthis.cape.position.z = -0.5;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nclass PlayerObject extends THREE.Group {\r\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\tthis.slim = slim;\r\n\r\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\r\n\t\tthis.skin.visible = false;\r\n\t\tthis.add(this.skin);\r\n\r\n\t\tthis.cape = new CapeObject(capeMaterial);\r\n\t\tthis.cape.position.z = -2;\r\n\t\tthis.cape.position.y = -4;\r\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\r\n\t\tthis.cape.visible = false;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nexport { SkinObject, CapeObject, PlayerObject };\r\n","import * as THREE from \"three\";\r\n\r\nclass OrbitControls extends THREE.EventDispatcher {\r\n\t/**\r\n\t * @preserve\r\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\r\n\t */\r\n\t/**\r\n\t * @license\r\n\t * Copyright (C) 2010-2017 three.js authors\r\n\t *\r\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n\t * of this software and associated documentation files (the \"Software\"), to deal\r\n\t * in the Software without restriction, including without limitation the rights\r\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\t * copies of the Software, and to permit persons to whom the Software is\r\n\t * furnished to do so, subject to the following conditions:\r\n\t *\r\n\t * The above copyright notice and this permission notice shall be included in\r\n\t * all copies or substantial portions of the Software.\r\n\t *\r\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\t * THE SOFTWARE.\r\n\t *\r\n\t *\r\n\t * @author qiao / https://github.com/qiao\r\n\t * @author mrdoob / http://mrdoob.com\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t * @author WestLangley / http://github.com/WestLangley\r\n\t * @author erich666 / http://erichaines.com\r\n\t */\r\n\r\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\r\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n\t//\r\n\t// Orbit - left mouse / touch: one finger move\r\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\r\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\r\n\r\n\tconstructor(object, domElement) {\r\n\t\tsuper();\r\n\t\tthis.object = object;\r\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\r\n\r\n\t\t// Set to false to disable this control\r\n\t\tthis.enabled = true;\r\n\r\n\t\t// \"target\" sets the location of focus, where the object orbits around\r\n\t\tthis.target = new THREE.Vector3();\r\n\r\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\r\n\t\tthis.minDistance = 0;\r\n\t\tthis.maxDistance = Infinity;\r\n\r\n\t\t// How far you can zoom in and out (OrthographicCamera only)\r\n\t\tthis.minZoom = 0;\r\n\t\tthis.maxZoom = Infinity;\r\n\r\n\t\t// How far you can orbit vertically, upper and lower limits.\r\n\t\t// Range is 0 to Math.PI radians.\r\n\t\tthis.minPolarAngle = 0; // radians\r\n\t\tthis.maxPolarAngle = Math.PI; // radians\r\n\r\n\t\t// How far you can orbit horizontally, upper and lower limits.\r\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\r\n\t\tthis.minAzimuthAngle = -Infinity; // radians\r\n\t\tthis.maxAzimuthAngle = Infinity; // radians\r\n\r\n\t\t// Set to true to enable damping (inertia)\r\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.enableDamping = false;\r\n\t\tthis.dampingFactor = 0.25;\r\n\r\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n\t\t// Set to false to disable zooming\r\n\t\tthis.enableZoom = true;\r\n\t\tthis.zoomSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable rotating\r\n\t\tthis.enableRotate = true;\r\n\t\tthis.rotateSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable panning\r\n\t\tthis.enablePan = true;\r\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\r\n\r\n\t\t// Set to true to automatically rotate around the target\r\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.autoRotate = false;\r\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\r\n\r\n\t\t// Set to false to disable use of the keys\r\n\t\tthis.enableKeys = true;\r\n\r\n\t\t// The four arrow keys\r\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\r\n\r\n\t\t// Mouse buttons\r\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\r\n\r\n\t\t// for reset\r\n\t\tthis.target0 = this.target.clone();\r\n\t\tthis.position0 = this.object.position.clone();\r\n\t\tthis.zoom0 = this.object.zoom;\r\n\r\n\t\t//\r\n\t\t// public methods\r\n\t\t//\r\n\t\tthis.getPolarAngle = function () {\r\n\t\t\treturn spherical.phi;\r\n\t\t};\r\n\t\tthis.getAzimuthalAngle = function () {\r\n\t\t\treturn spherical.theta;\r\n\t\t};\r\n\t\tthis.saveState = function () {\r\n\t\t\tscope.target0.copy(scope.target);\r\n\t\t\tscope.position0.copy(scope.object.position);\r\n\t\t\tscope.zoom0 = scope.object.zoom;\r\n\t\t};\r\n\t\tthis.reset = function () {\r\n\t\t\tscope.target.copy(scope.target0);\r\n\t\t\tscope.object.position.copy(scope.position0);\r\n\t\t\tscope.object.zoom = scope.zoom0;\r\n\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\tscope.update();\r\n\t\t\tstate = STATE.NONE;\r\n\t\t};\r\n\r\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\r\n\t\tthis.update = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\t// so camera.up is the orbit axis\r\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\r\n\t\t\tlet quatInverse = quat.clone().inverse();\r\n\t\t\tlet lastPosition = new THREE.Vector3();\r\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\r\n\t\t\treturn function update() {\r\n\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quat);\r\n\t\t\t\t// angle from z-axis around y-axis\r\n\t\t\t\tspherical.setFromVector3(offset);\r\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\r\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\r\n\t\t\t\t}\r\n\t\t\t\tspherical.theta += sphericalDelta.theta;\r\n\t\t\t\tspherical.phi += sphericalDelta.phi;\r\n\t\t\t\t// restrict theta to be between desired limits\r\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\r\n\t\t\t\t// restrict phi to be between desired limits\r\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\r\n\t\t\t\tspherical.makeSafe();\r\n\t\t\t\tspherical.radius *= scale;\r\n\t\t\t\t// restrict radius to be between desired limits\r\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\r\n\t\t\t\t// move target to panned location\r\n\t\t\t\tscope.target.add(panOffset);\r\n\t\t\t\toffset.setFromSpherical(spherical);\r\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quatInverse);\r\n\t\t\t\tposition.copy(scope.target).add(offset);\r\n\t\t\t\tscope.object.lookAt(scope.target);\r\n\t\t\t\tif (scope.enableDamping === true) {\r\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\r\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tscale = 1;\r\n\t\t\t\tpanOffset.set(0, 0, 0);\r\n\t\t\t\t// update condition is:\r\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\r\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\t\t\t\tif (zoomChanged ||\r\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\r\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\r\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\t\t\tlastPosition.copy(scope.object.position);\r\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\r\n\t\t\t\t\tzoomChanged = false;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}();\r\n\t\tthis.dispose = function () {\r\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\r\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\r\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\r\n\t\t};\r\n\t\t//\r\n\t\t// internals\r\n\t\t//\r\n\t\tlet scope = this;\r\n\t\tlet changeEvent = { type: \"change\" };\r\n\t\tlet startEvent = { type: \"start\" };\r\n\t\tlet endEvent = { type: \"end\" };\r\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\r\n\t\tlet state = STATE.NONE;\r\n\t\tlet EPS = 0.000001;\r\n\t\t// current position in spherical coordinates\r\n\t\tlet spherical = new THREE.Spherical();\r\n\t\tlet sphericalDelta = new THREE.Spherical();\r\n\t\tlet scale = 1;\r\n\t\tlet panOffset = new THREE.Vector3();\r\n\t\tlet zoomChanged = false;\r\n\t\tlet rotateStart = new THREE.Vector2();\r\n\t\tlet rotateEnd = new THREE.Vector2();\r\n\t\tlet rotateDelta = new THREE.Vector2();\r\n\t\tlet panStart = new THREE.Vector2();\r\n\t\tlet panEnd = new THREE.Vector2();\r\n\t\tlet panDelta = new THREE.Vector2();\r\n\t\tlet dollyStart = new THREE.Vector2();\r\n\t\tlet dollyEnd = new THREE.Vector2();\r\n\t\tlet dollyDelta = new THREE.Vector2();\r\n\t\tfunction getAutoRotationAngle() {\r\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\t\t}\r\n\t\tfunction getZoomScale() {\r\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\r\n\t\t}\r\n\t\tfunction rotateLeft(angle) {\r\n\t\t\tsphericalDelta.theta -= angle;\r\n\t\t}\r\n\t\tfunction rotateUp(angle) {\r\n\t\t\tsphericalDelta.phi -= angle;\r\n\t\t}\r\n\t\tlet panLeft = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panLeft(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(-distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\tlet panUp = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panUp(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\t// deltaX and deltaY are in pixels; right and down are positive\r\n\t\tlet pan = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\treturn function pan(deltaX, deltaY) {\r\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\t\t// perspective\r\n\t\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t\tlet targetDistance = offset.length();\r\n\t\t\t\t\t// half of the fov is center to top of screen\r\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\r\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\r\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\t\t// orthographic\r\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\r\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// camera neither orthographic nor perspective\r\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\r\n\t\t\t\t\tscope.enablePan = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}();\r\n\t\tfunction dollyIn(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale /= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction dollyOut(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale *= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//\r\n\t\t// event callbacks - update the object state\r\n\t\t//\r\n\t\tfunction handleMouseDownRotate(event) {\r\n\t\t\trotateStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownDolly(event) {\r\n\t\t\tdollyStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownPan(event) {\r\n\t\t\tpanStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.clientX, event.clientY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t// rotating across whole screen goes 360 degrees around\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMoveDolly(event) {\r\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMovePan(event) {\r\n\t\t\tpanEnd.set(event.clientX, event.clientY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseUp(event) {\r\n\t\t}\r\n\t\tfunction handleMouseWheel(event) {\r\n\t\t\tif (event.deltaY < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (event.deltaY > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleKeyDown(event) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase scope.keys.UP:\r\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.BOTTOM:\r\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.LEFT:\r\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.RIGHT:\r\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction handleTouchStartRotate(event) {\r\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchStartDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyStart.set(0, distance);\r\n\t\t}\r\n\t\tfunction handleTouchStartPan(event) {\r\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMoveDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyEnd.set(0, distance);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMovePan(event) {\r\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchEnd(event) {\r\n\t\t}\r\n\t\t//\r\n\t\t// event handlers - FSM: listen for events and reset state\r\n\t\t//\r\n\t\tfunction onMouseDown(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.button) {\r\n\t\t\t\tcase scope.mouseButtons.ORBIT:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownRotate(event);\r\n\t\t\t\t\tstate = STATE.ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.ZOOM:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownDolly(event);\r\n\t\t\t\t\tstate = STATE.DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownPan(event);\r\n\t\t\t\t\tstate = STATE.PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onMouseMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (state) {\r\n\t\t\t\tcase STATE.ROTATE:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.DOLLY:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tfunction onMouseUp(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleMouseUp(event);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onMouseWheel(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\thandleMouseWheel(event);\r\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t}\r\n\t\tfunction onKeyDown(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleKeyDown(event);\r\n\t\t}\r\n\t\tfunction onTouchStart(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartRotate(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartDolly(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartPan(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onTouchMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t\tfunction onTouchEnd(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleTouchEnd(event);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onContextMenu(event) {\r\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\t//\r\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\r\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\r\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\r\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\r\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\r\n\t\t// force an update at start\r\n\t\tthis.update();\r\n\t}\r\n}\r\n\r\nexport { OrbitControls };\r\n","function invokeAnimation(animation, player, time) {\r\n\tif (animation instanceof CompositeAnimation) {\r\n\t\tanimation.play(player, time);\r\n\t} else if (animation instanceof Function) {\r\n\t\tanimation(player, time);\r\n\t} else {\r\n\t\tthrow `Not an animation: ${animation}`;\r\n\t}\r\n}\r\n\r\nclass AnimationHandle {\r\n\tconstructor(animation) {\r\n\t\tthis.animation = animation;\r\n\t\tthis.paused = this._paused = false;\r\n\t\tthis.speed = this._speed = 1.0;\r\n\t\tthis._lastChange = null;\r\n\t\tthis._lastChangeX = null;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tif (this._lastChange === null) {\r\n\t\t\tthis._lastChange = time;\r\n\t\t\tthis._lastChangeX = 0;\r\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tif (this._paused === false) {\r\n\t\t\t\tthis._lastChangeX += dt * this._speed;\r\n\t\t\t}\r\n\t\t\tthis._paused = this.paused;\r\n\t\t\tthis._speed = this.speed;\r\n\t\t\tthis._lastChange = time;\r\n\t\t}\r\n\t\tif (this.paused === false) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\r\n\t\t\tinvokeAnimation(this.animation, player, x);\r\n\t\t}\r\n\t}\r\n\treset(){\r\n\t\tthis._lastChange = null;\r\n\t}\r\n}\r\n\r\nclass CompositeAnimation {\r\n\tconstructor() {\r\n\t\tthis.handles = new Set();\r\n\t}\r\n\tadd(animation) {\r\n\t\tlet handle = new AnimationHandle(animation);\r\n\t\thandle.remove = () => this.handles.delete(handle);\r\n\t\tthis.handles.add(handle);\r\n\t\treturn handle;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tthis.handles.forEach(handle => handle.play(player, time));\r\n\t}\r\n}\r\n\r\nlet WalkAnimation = (player, time) => {\r\n\tlet skin = player.skin;\r\n\tlet angleRot = time + Math.PI / 2;\r\n\r\n\t// Leg Swing\r\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\r\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\r\n\t// Arm Swing\r\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\r\n};\r\n\r\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\r\n","import * as THREE from \"three\";\r\nimport { PlayerObject } from \"./model\";\r\nimport { OrbitControls } from \"./orbit_controls\";\r\nimport { invokeAnimation } from \"./animation\";\r\n\r\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\r\n\tlet imgData = context.getImageData(sX, sY, w, h);\r\n\tif (flipHorizontal) {\r\n\t\tfor (let y = 0; y < h; y++) {\r\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\r\n\t\t\t\tlet index = (x + y * w) * 4;\r\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\r\n\t\t\t\tlet pA1 = imgData.data[index];\r\n\t\t\t\tlet pA2 = imgData.data[index + 1];\r\n\t\t\t\tlet pA3 = imgData.data[index + 2];\r\n\t\t\t\tlet pA4 = imgData.data[index + 3];\r\n\r\n\t\t\t\tlet pB1 = imgData.data[index2];\r\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\r\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\r\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\r\n\r\n\t\t\t\timgData.data[index] = pB1;\r\n\t\t\t\timgData.data[index + 1] = pB2;\r\n\t\t\t\timgData.data[index + 2] = pB3;\r\n\t\t\t\timgData.data[index + 3] = pB4;\r\n\r\n\t\t\t\timgData.data[index2] = pA1;\r\n\t\t\t\timgData.data[index2 + 1] = pA2;\r\n\t\t\t\timgData.data[index2 + 2] = pA3;\r\n\t\t\t\timgData.data[index2 + 3] = pA4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcontext.putImageData(imgData, dX, dY);\r\n}\r\n\r\nfunction convertSkinTo1_8(context, width) {\r\n\tlet scale = width / 64.0;\r\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\r\n\r\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\r\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\r\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\r\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\r\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\r\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\r\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\r\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\r\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\r\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\r\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\r\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\r\n}\r\n\r\nclass SkinViewer {\r\n\tconstructor(options) {\r\n\t\tthis.domElement = options.domElement;\r\n\t\tthis.animation = options.animation || null;\r\n\t\tthis.animationPaused = false;\r\n\t\tthis.animationTime = 0;\r\n\t\tthis.disposed = false;\r\n\r\n\t\t// texture\r\n\t\tthis.skinImg = new Image();\r\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\r\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\r\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.capeImg = new Image();\r\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\r\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\r\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\r\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\r\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\r\n\r\n\t\t// scene\r\n\t\tthis.scene = new THREE.Scene();\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\r\n\t\tthis.camera.position.y = -12;\r\n\t\tthis.camera.position.z = 30;\r\n\r\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\r\n\t\tthis.renderer.setSize(300, 300); // default size\r\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\r\n\t\tthis.domElement.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\r\n\t\tthis.scene.add(this.playerObject);\r\n\r\n\t\t// texture loading\r\n\t\tthis.skinImg.crossOrigin = \"\";\r\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\r\n\t\tthis.skinImg.onload = () => {\r\n\t\t\tlet isOldFormat = false;\r\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\r\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\r\n\t\t\t\t\tisOldFormat = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\"Bad skin size\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\r\n\t\t\tif (isOldFormat) {\r\n\t\t\t\tlet width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.width = width;\r\n\t\t\t\tthis.skinCanvas.height = width;\r\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\r\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\r\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t}\r\n\r\n\t\t\tthis.skinTexture.needsUpdate = true;\r\n\t\t\tthis.layer1Material.needsUpdate = true;\r\n\t\t\tthis.layer2Material.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.skin.visible = true;\r\n\t\t};\r\n\r\n\t\tthis.capeImg.crossOrigin = \"\";\r\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\r\n\t\tthis.capeImg.onload = () => {\r\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\r\n\t\t\t\tconsole.error(\"Bad cape size\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\r\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\r\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\r\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\r\n\t\t\tthis.capeTexture.needsUpdate = true;\r\n\t\t\tthis.capeMaterial.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.cape.visible = true;\r\n\t\t};\r\n\r\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\r\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\r\n\t\tif (options.width) this.width = options.width;\r\n\t\tif (options.height) this.height = options.height;\r\n\r\n\t\tlet draw = () => {\r\n\t\t\tif (this.disposed) return;\r\n\t\t\twindow.requestAnimationFrame(draw);\r\n\t\t\tif (!this.animationPaused) {\r\n\t\t\t\tthis.animationTime++;\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\t\tdraw();\r\n\t}\r\n\r\n\tsetSize(width, height) {\r\n\t\tthis.camera.aspect = width / height;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.disposed = true;\r\n\t\tthis.domElement.removeChild(this.renderer.domElement);\r\n\t\tthis.renderer.dispose();\r\n\t\tthis.skinTexture.dispose();\r\n\t\tthis.capeTexture.dispose();\r\n\t}\r\n\r\n\tget skinUrl() {\r\n\t\treturn this.skinImg.src;\r\n\t}\r\n\r\n\tset skinUrl(url) {\r\n\t\tthis.skinImg.src = url;\r\n\t}\r\n\r\n\tget capeUrl() {\r\n\t\treturn this.capeImg.src;\r\n\t}\r\n\r\n\tset capeUrl(url) {\r\n\t\tthis.capeImg.src = url;\r\n\t}\r\n\r\n\tget width() {\r\n\t\treturn this.renderer.getSize().width;\r\n\t}\r\n\r\n\tset width(newWidth) {\r\n\t\tthis.setSize(newWidth, this.height);\r\n\t}\r\n\r\n\tget height() {\r\n\t\treturn this.renderer.getSize().height;\r\n\t}\r\n\r\n\tset height(newHeight) {\r\n\t\tthis.setSize(this.width, newHeight);\r\n\t}\r\n}\r\n\r\nclass SkinControl {\r\n\tconstructor(skinViewer) {\r\n\t\tthis.enableAnimationControl = true;\r\n\t\tthis.skinViewer = skinViewer;\r\n\r\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\r\n\t\tthis.orbitControls.enablePan = false;\r\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\r\n\t\tthis.orbitControls.minDistance = 10;\r\n\t\tthis.orbitControls.maxDistance = 256;\r\n\t\tthis.orbitControls.update();\r\n\r\n\t\tthis.animationPauseListener = e => {\r\n\t\t\tif (this.enableAnimationControl) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t\tthis.orbitControls.dispose();\r\n\t}\r\n}\r\n\r\nexport { SkinViewer, SkinControl };\r\n","/**\r\n * @license\r\n * skinview3d \r\n *\r\n * Copyright (C) 2017 the original author or authors\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n *\r\n * @author yushijinhun \r\n * @author Hacksore \r\n * @author Kent Rasmussen \r\n */\r\n\r\nexport { SkinObject, CapeObject, PlayerObject } from \"./model\";\r\nexport { SkinViewer, SkinControl } from \"./viewer\";\r\nexport { CompositeAnimation, WalkAnimation } from \"./animation\";\r\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","PlayerObject","slim","skin","visible","rotation","Math","PI","OrbitControls","object","domElement","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","scope","copy","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","state","STATE","NONE","offset","quat","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","sub","applyQuaternion","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","window","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","console","warn","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","event","clientX","clientY","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","dx","dy","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","button","preventDefault","addEventListener","handleMouseUp","stopPropagation","handleTouchEnd","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","WalkAnimation","angleRot","cos","copyImage","context","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","convertSkinTo1_8","width","copySkin","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","alpha","antialias","setSize","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","error","src","onload","isOldFormat","height","skinContext","getContext","clearRect","drawImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener","e"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"skinview3d.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js","../src/skinview3d.js"],"sourcesContent":["import * as THREE from \"three\";\n\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\n\treturn [\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\n\t];\n}\n\nfunction toSkinVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\n}\n\nfunction toCapeVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\n}\n\nfunction addVertices(box, top, bottom, left, front, right, back) {\n\tbox.faceVertexUvs[0] = [];\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\n}\n\nconst esp = 0.002;\n\nclass SkinObject extends THREE.Group {\n\tconstructor(isSlim, layer1Material, layer2Material) {\n\t\tsuper();\n\n\t\t// Head\n\t\tthis.head = new THREE.Group();\n\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\n\t\taddVertices(headBox,\n\t\t\ttoSkinVertices(8, 0, 16, 8),\n\t\t\ttoSkinVertices(16, 0, 24, 8),\n\t\t\ttoSkinVertices(0, 8, 8, 16),\n\t\t\ttoSkinVertices(8, 8, 16, 16),\n\t\t\ttoSkinVertices(16, 8, 24, 16),\n\t\t\ttoSkinVertices(24, 8, 32, 16)\n\t\t);\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\n\t\tthis.head.add(headMesh);\n\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\n\t\taddVertices(head2Box,\n\t\t\ttoSkinVertices(40, 0, 48, 8),\n\t\t\ttoSkinVertices(48, 0, 56, 8),\n\t\t\ttoSkinVertices(32, 8, 40, 16),\n\t\t\ttoSkinVertices(40, 8, 48, 16),\n\t\t\ttoSkinVertices(48, 8, 56, 16),\n\t\t\ttoSkinVertices(56, 8, 64, 16)\n\t\t);\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\n\t\thead2Mesh.renderOrder = -1;\n\t\tthis.head.add(head2Mesh);\n\n\t\tthis.add(this.head);\n\n\n\t\t// Body\n\t\tthis.body = new THREE.Group();\n\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\n\t\taddVertices(bodyBox,\n\t\t\ttoSkinVertices(20, 16, 28, 20),\n\t\t\ttoSkinVertices(28, 16, 36, 20),\n\t\t\ttoSkinVertices(16, 20, 20, 32),\n\t\t\ttoSkinVertices(20, 20, 28, 32),\n\t\t\ttoSkinVertices(28, 20, 32, 32),\n\t\t\ttoSkinVertices(32, 20, 40, 32)\n\t\t);\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\n\t\tthis.body.add(bodyMesh);\n\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\n\t\taddVertices(body2Box,\n\t\t\ttoSkinVertices(20, 32, 28, 36),\n\t\t\ttoSkinVertices(28, 32, 36, 36),\n\t\t\ttoSkinVertices(16, 36, 20, 48),\n\t\t\ttoSkinVertices(20, 36, 28, 48),\n\t\t\ttoSkinVertices(28, 36, 32, 48),\n\t\t\ttoSkinVertices(32, 36, 40, 48)\n\t\t);\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\n\t\tthis.body.add(body2Mesh);\n\n\t\tthis.body.position.y = -10;\n\t\tthis.add(this.body);\n\n\n\t\t// Right Arm\n\t\tthis.rightArm = new THREE.Group();\n\t\tlet rightArmPivot = new THREE.Group();\n\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\n\t\t\t);\n\t\t}\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\n\t\trightArmPivot.add(rightArmMesh);\n\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\n\t\t\t);\n\t\t}\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\n\t\trightArm2Mesh.renderOrder = 1;\n\t\trightArmPivot.add(rightArm2Mesh);\n\n\t\trightArmPivot.position.y = -6;\n\t\tthis.rightArm.add(rightArmPivot);\n\t\tthis.rightArm.position.y = -4;\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\n\t\tthis.add(this.rightArm);\n\n\n\t\t// Left Arm\n\t\tthis.leftArm = new THREE.Group();\n\t\tlet leftArmPivot = new THREE.Group();\n\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\n\t\tleftArmPivot.add(leftArmMesh);\n\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\n\t\tleftArm2Mesh.renderOrder = 1;\n\t\tleftArmPivot.add(leftArm2Mesh);\n\n\t\tleftArmPivot.position.y = -6;\n\t\tthis.leftArm.add(leftArmPivot);\n\t\tthis.leftArm.position.y = -4;\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\n\t\tthis.add(this.leftArm);\n\n\n\t\t// Right Leg\n\t\tthis.rightLeg = new THREE.Group();\n\t\tlet rightLegPivot = new THREE.Group();\n\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(rightLegBox,\n\t\t\ttoSkinVertices(4, 16, 8, 20),\n\t\t\ttoSkinVertices(8, 16, 12, 20),\n\t\t\ttoSkinVertices(0, 20, 4, 32),\n\t\t\ttoSkinVertices(4, 20, 8, 32),\n\t\t\ttoSkinVertices(8, 20, 12, 32),\n\t\t\ttoSkinVertices(12, 20, 16, 32)\n\t\t);\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\n\t\trightLegPivot.add(rightLegMesh);\n\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(rightLeg2Box,\n\t\t\ttoSkinVertices(4, 32, 8, 36),\n\t\t\ttoSkinVertices(8, 32, 12, 36),\n\t\t\ttoSkinVertices(0, 36, 4, 48),\n\t\t\ttoSkinVertices(4, 36, 8, 48),\n\t\t\ttoSkinVertices(8, 36, 12, 48),\n\t\t\ttoSkinVertices(12, 36, 16, 48)\n\t\t);\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\n\t\trightLeg2Mesh.renderOrder = 1;\n\t\trightLegPivot.add(rightLeg2Mesh);\n\n\t\trightLegPivot.position.y = -6;\n\t\tthis.rightLeg.add(rightLegPivot);\n\t\tthis.rightLeg.position.y = -16;\n\t\tthis.rightLeg.position.x = -2;\n\t\tthis.add(this.rightLeg);\n\n\t\t// Left Leg\n\t\tthis.leftLeg = new THREE.Group();\n\t\tlet leftLegPivot = new THREE.Group();\n\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(leftLegBox,\n\t\t\ttoSkinVertices(20, 48, 24, 52),\n\t\t\ttoSkinVertices(24, 48, 28, 52),\n\t\t\ttoSkinVertices(16, 52, 20, 64),\n\t\t\ttoSkinVertices(20, 52, 24, 64),\n\t\t\ttoSkinVertices(24, 52, 28, 64),\n\t\t\ttoSkinVertices(28, 52, 32, 64)\n\t\t);\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\n\t\tleftLegPivot.add(leftLegMesh);\n\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(leftLeg2Box,\n\t\t\ttoSkinVertices(4, 48, 8, 52),\n\t\t\ttoSkinVertices(8, 48, 12, 52),\n\t\t\ttoSkinVertices(0, 52, 4, 64),\n\t\t\ttoSkinVertices(4, 52, 8, 64),\n\t\t\ttoSkinVertices(8, 52, 12, 64),\n\t\t\ttoSkinVertices(12, 52, 16, 64)\n\t\t);\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\n\t\tleftLeg2Mesh.renderOrder = 1;\n\t\tleftLegPivot.add(leftLeg2Mesh);\n\n\t\tleftLegPivot.position.y = -6;\n\t\tthis.leftLeg.add(leftLegPivot);\n\t\tthis.leftLeg.position.y = -16;\n\t\tthis.leftLeg.position.x = 2;\n\t\tthis.add(this.leftLeg);\n\t}\n}\n\nclass CapeObject extends THREE.Group {\n\tconstructor(capeMaterial) {\n\t\tsuper();\n\n\t\t// back = outside\n\t\t// front = inside\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\n\t\taddVertices(capeBox,\n\t\t\ttoCapeVertices(1, 0, 11, 1),\n\t\t\ttoCapeVertices(11, 0, 21, 1),\n\t\t\ttoCapeVertices(11, 1, 12, 17),\n\t\t\ttoCapeVertices(12, 1, 22, 17),\n\t\t\ttoCapeVertices(0, 1, 1, 17),\n\t\t\ttoCapeVertices(1, 1, 11, 17)\n\t\t);\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\n\t\tthis.cape.position.y = -8;\n\t\tthis.cape.position.z = -0.5;\n\t\tthis.add(this.cape);\n\t}\n}\n\nclass PlayerObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\n\t\tsuper();\n\n\t\tthis.slim = slim;\n\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\n\t\tthis.skin.visible = false;\n\t\tthis.add(this.skin);\n\n\t\tthis.cape = new CapeObject(capeMaterial);\n\t\tthis.cape.position.z = -2;\n\t\tthis.cape.position.y = -4;\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\n\t\tthis.cape.visible = false;\n\t\tthis.add(this.cape);\n\t}\n}\n\nexport { SkinObject, CapeObject, PlayerObject };\n","import * as THREE from \"three\";\n\nclass OrbitControls extends THREE.EventDispatcher {\n\t/**\n\t * @preserve\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\n\t */\n\t/**\n\t * @license\n\t * Copyright (C) 2010-2017 three.js authors\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t *\n\t *\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\n\n\tconstructor(object, domElement) {\n\t\tsuper();\n\t\tthis.object = object;\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out (OrthographicCamera only)\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\t\tthis.getPolarAngle = function () {\n\t\t\treturn spherical.phi;\n\t\t};\n\t\tthis.getAzimuthalAngle = function () {\n\t\t\treturn spherical.theta;\n\t\t};\n\t\tthis.saveState = function () {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t\tscope.zoom0 = scope.object.zoom;\n\t\t};\n\t\tthis.reset = function () {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\tscope.update();\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\t// so camera.up is the orbit axis\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\n\t\t\tlet quatInverse = quat.clone().inverse();\n\t\t\tlet lastPosition = new THREE.Vector3();\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\n\t\t\treturn function update() {\n\t\t\t\tlet position = scope.object.position;\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\t\t\t\tspherical.makeSafe();\n\t\t\t\tspherical.radius *= scale;\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\t\t\toffset.setFromSpherical(spherical);\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\t\t\tif (zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}();\n\t\tthis.dispose = function () {\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\n\t\t};\n\t\t//\n\t\t// internals\n\t\t//\n\t\tlet scope = this;\n\t\tlet changeEvent = { type: \"change\" };\n\t\tlet startEvent = { type: \"start\" };\n\t\tlet endEvent = { type: \"end\" };\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\tlet state = STATE.NONE;\n\t\tlet EPS = 0.000001;\n\t\t// current position in spherical coordinates\n\t\tlet spherical = new THREE.Spherical();\n\t\tlet sphericalDelta = new THREE.Spherical();\n\t\tlet scale = 1;\n\t\tlet panOffset = new THREE.Vector3();\n\t\tlet zoomChanged = false;\n\t\tlet rotateStart = new THREE.Vector2();\n\t\tlet rotateEnd = new THREE.Vector2();\n\t\tlet rotateDelta = new THREE.Vector2();\n\t\tlet panStart = new THREE.Vector2();\n\t\tlet panEnd = new THREE.Vector2();\n\t\tlet panDelta = new THREE.Vector2();\n\t\tlet dollyStart = new THREE.Vector2();\n\t\tlet dollyEnd = new THREE.Vector2();\n\t\tlet dollyDelta = new THREE.Vector2();\n\t\tfunction getAutoRotationAngle() {\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\tfunction getZoomScale() {\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\t\tlet panLeft = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\tlet panUp = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar(distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tlet pan = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\t\t// perspective\n\t\t\t\t\tlet position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tlet targetDistance = offset.length();\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t}();\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale /= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale *= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseUp(event) {\n\t\t}\n\t\tfunction handleMouseWheel(event) {\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (event.deltaY > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleKeyDown(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfunction handleTouchStartRotate(event) {\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchStartDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\tfunction handleTouchStartPan(event) {\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyEnd.set(0, distance);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchEnd(event) {\n\t\t}\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\tfunction onMouseDown(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.button) {\n\t\t\t\tcase scope.mouseButtons.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownRotate(event);\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.ZOOM:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownDolly(event);\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownPan(event);\n\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onMouseMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tfunction onMouseUp(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleMouseUp(event);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\thandleMouseWheel(event);\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\tfunction onTouchStart(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartPan(event);\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onTouchMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\tfunction onTouchEnd(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleTouchEnd(event);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t}\n\t\t//\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\n\t\t// force an update at start\n\t\tthis.update();\n\t}\n}\n\nexport { OrbitControls };\n","function invokeAnimation(animation, player, time) {\n\tif (animation instanceof CompositeAnimation) {\n\t\tanimation.play(player, time);\n\t} else if (animation instanceof Function) {\n\t\tanimation(player, time);\n\t} else {\n\t\tthrow `Not an animation: ${animation}`;\n\t}\n}\n\nclass AnimationHandle {\n\tconstructor(animation) {\n\t\tthis.animation = animation;\n\t\tthis.paused = this._paused = false;\n\t\tthis.speed = this._speed = 1.0;\n\t\tthis._lastChange = null;\n\t\tthis._lastChangeX = null;\n\t}\n\tplay(player, time) {\n\t\tif (this._lastChange === null) {\n\t\t\tthis._lastChange = time;\n\t\t\tthis._lastChangeX = 0;\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tif (this._paused === false) {\n\t\t\t\tthis._lastChangeX += dt * this._speed;\n\t\t\t}\n\t\t\tthis._paused = this.paused;\n\t\t\tthis._speed = this.speed;\n\t\t\tthis._lastChange = time;\n\t\t}\n\t\tif (this.paused === false) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\n\t\t\tinvokeAnimation(this.animation, player, x);\n\t\t}\n\t}\n\treset(){\n\t\tthis._lastChange = null;\n\t}\n}\n\nclass CompositeAnimation {\n\tconstructor() {\n\t\tthis.handles = new Set();\n\t}\n\tadd(animation) {\n\t\tlet handle = new AnimationHandle(animation);\n\t\thandle.remove = () => this.handles.delete(handle);\n\t\tthis.handles.add(handle);\n\t\treturn handle;\n\t}\n\tplay(player, time) {\n\t\tthis.handles.forEach(handle => handle.play(player, time));\n\t}\n}\n\nlet WalkAnimation = (player, time) => {\n\tlet skin = player.skin;\n\tlet angleRot = time + Math.PI / 2;\n\n\t// Leg Swing\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\n\n\t// Arm Swing\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\n};\n\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\n","import * as THREE from \"three\";\nimport { PlayerObject } from \"./model\";\nimport { OrbitControls } from \"./orbit_controls\";\nimport { invokeAnimation } from \"./animation\";\n\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\n\tlet imgData = context.getImageData(sX, sY, w, h);\n\tif (flipHorizontal) {\n\t\tfor (let y = 0; y < h; y++) {\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\n\t\t\t\tlet index = (x + y * w) * 4;\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\n\t\t\t\tlet pA1 = imgData.data[index];\n\t\t\t\tlet pA2 = imgData.data[index + 1];\n\t\t\t\tlet pA3 = imgData.data[index + 2];\n\t\t\t\tlet pA4 = imgData.data[index + 3];\n\n\t\t\t\tlet pB1 = imgData.data[index2];\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\n\n\t\t\t\timgData.data[index] = pB1;\n\t\t\t\timgData.data[index + 1] = pB2;\n\t\t\t\timgData.data[index + 2] = pB3;\n\t\t\t\timgData.data[index + 3] = pB4;\n\n\t\t\t\timgData.data[index2] = pA1;\n\t\t\t\timgData.data[index2 + 1] = pA2;\n\t\t\t\timgData.data[index2 + 2] = pA3;\n\t\t\t\timgData.data[index2 + 3] = pA4;\n\t\t\t}\n\t\t}\n\t}\n\tcontext.putImageData(imgData, dX, dY);\n}\n\nfunction convertSkinTo1_8(context, width) {\n\tlet scale = width / 64.0;\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\n\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\n}\n\nclass SkinViewer {\n\tconstructor(options) {\n\t\tthis.domElement = options.domElement;\n\t\tthis.animation = options.animation || null;\n\t\tthis.animationPaused = false;\n\t\tthis.animationTime = 0;\n\t\tthis.disposed = false;\n\n\t\t// texture\n\t\tthis.skinImg = new Image();\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.capeImg = new Image();\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\n\n\t\t// scene\n\t\tthis.scene = new THREE.Scene();\n\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\n\t\tthis.camera.position.y = -12;\n\t\tthis.camera.position.z = 30;\n\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\n\t\tthis.renderer.setSize(300, 300); // default size\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\n\t\tthis.domElement.appendChild(this.renderer.domElement);\n\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\n\t\tthis.scene.add(this.playerObject);\n\n\t\t// texture loading\n\t\tthis.skinImg.crossOrigin = \"\";\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\n\t\tthis.skinImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad skin size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.width = width;\n\t\t\t\tthis.skinCanvas.height = width;\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\n\t\t\t} else {\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t}\n\n\t\t\tthis.skinTexture.needsUpdate = true;\n\t\t\tthis.layer1Material.needsUpdate = true;\n\t\t\tthis.layer2Material.needsUpdate = true;\n\n\t\t\tthis.playerObject.skin.visible = true;\n\t\t};\n\n\t\tthis.capeImg.crossOrigin = \"\";\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\n\t\tthis.capeImg.onload = () => {\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\n\t\t\t\tconsole.error(\"Bad cape size\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\n\t\t\tthis.capeTexture.needsUpdate = true;\n\t\t\tthis.capeMaterial.needsUpdate = true;\n\n\t\t\tthis.playerObject.cape.visible = true;\n\t\t};\n\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\n\t\tif (options.width) this.width = options.width;\n\t\tif (options.height) this.height = options.height;\n\n\t\tlet draw = () => {\n\t\t\tif (this.disposed) return;\n\t\t\twindow.requestAnimationFrame(draw);\n\t\t\tif (!this.animationPaused) {\n\t\t\t\tthis.animationTime++;\n\t\t\t\tif (this.animation) {\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t};\n\t\tdraw();\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.camera.aspect = width / height;\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.renderer.setSize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis.disposed = true;\n\t\tthis.domElement.removeChild(this.renderer.domElement);\n\t\tthis.renderer.dispose();\n\t\tthis.skinTexture.dispose();\n\t\tthis.capeTexture.dispose();\n\t}\n\n\tget skinUrl() {\n\t\treturn this.skinImg.src;\n\t}\n\n\tset skinUrl(url) {\n\t\tthis.skinImg.src = url;\n\t}\n\n\tget capeUrl() {\n\t\treturn this.capeImg.src;\n\t}\n\n\tset capeUrl(url) {\n\t\tthis.capeImg.src = url;\n\t}\n\n\tget width() {\n\t\treturn this.renderer.getSize().width;\n\t}\n\n\tset width(newWidth) {\n\t\tthis.setSize(newWidth, this.height);\n\t}\n\n\tget height() {\n\t\treturn this.renderer.getSize().height;\n\t}\n\n\tset height(newHeight) {\n\t\tthis.setSize(this.width, newHeight);\n\t}\n}\n\nclass SkinControl {\n\tconstructor(skinViewer) {\n\t\tthis.enableAnimationControl = true;\n\t\tthis.skinViewer = skinViewer;\n\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\n\t\tthis.orbitControls.enablePan = false;\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\n\t\tthis.orbitControls.minDistance = 10;\n\t\tthis.orbitControls.maxDistance = 256;\n\t\tthis.orbitControls.update();\n\n\t\tthis.animationPauseListener = e => {\n\t\t\tif (this.enableAnimationControl) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\n\t\t\t}\n\t\t};\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\n\t}\n\n\tdispose() {\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\n\t\tthis.orbitControls.dispose();\n\t}\n}\n\nexport { SkinViewer, SkinControl };\n","/**\n * @license\n * skinview3d \n *\n * Copyright (C) 2017 the original author or authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n *\n * @author yushijinhun \n * @author Hacksore \n * @author Kent Rasmussen \n */\n\nexport { SkinObject, CapeObject, PlayerObject } from \"./model\";\nexport { SkinViewer, SkinControl } from \"./viewer\";\nexport { CompositeAnimation, WalkAnimation } from \"./animation\";\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","PlayerObject","slim","skin","visible","rotation","Math","PI","OrbitControls","object","domElement","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","scope","copy","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","state","STATE","NONE","offset","quat","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","sub","applyQuaternion","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","window","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","console","warn","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","event","clientX","clientY","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","dx","dy","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","button","preventDefault","addEventListener","handleMouseUp","stopPropagation","handleTouchEnd","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","WalkAnimation","angleRot","cos","copyImage","context","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","convertSkinTo1_8","width","copySkin","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","alpha","antialias","setSize","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","error","src","onload","isOldFormat","height","skinContext","getContext","clearRect","drawImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener","e"],"mappings":"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"} \ No newline at end of file diff --git a/js/skinview3d.min.js.map b/js/skinview3d.min.js.map index 4990d81..f0c9088 100644 --- a/js/skinview3d.min.js.map +++ b/js/skinview3d.min.js.map @@ -1 +1 @@ -{"version":3,"file":"skinview3d.min.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js"],"sourcesContent":["import * as THREE from \"three\";\r\n\r\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\r\n\treturn [\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\r\n\t];\r\n}\r\n\r\nfunction toSkinVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\r\n}\r\n\r\nfunction toCapeVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\r\n}\r\n\r\nfunction addVertices(box, top, bottom, left, front, right, back) {\r\n\tbox.faceVertexUvs[0] = [];\r\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\r\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\r\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\r\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\r\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\r\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\r\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\r\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\r\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\r\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\r\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\r\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\r\n}\r\n\r\nconst esp = 0.002;\r\n\r\nclass SkinObject extends THREE.Group {\r\n\tconstructor(isSlim, layer1Material, layer2Material) {\r\n\t\tsuper();\r\n\r\n\t\t// Head\r\n\t\tthis.head = new THREE.Group();\r\n\r\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\r\n\t\taddVertices(headBox,\r\n\t\t\ttoSkinVertices(8, 0, 16, 8),\r\n\t\t\ttoSkinVertices(16, 0, 24, 8),\r\n\t\t\ttoSkinVertices(0, 8, 8, 16),\r\n\t\t\ttoSkinVertices(8, 8, 16, 16),\r\n\t\t\ttoSkinVertices(16, 8, 24, 16),\r\n\t\t\ttoSkinVertices(24, 8, 32, 16)\r\n\t\t);\r\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\r\n\t\tthis.head.add(headMesh);\r\n\r\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\r\n\t\taddVertices(head2Box,\r\n\t\t\ttoSkinVertices(40, 0, 48, 8),\r\n\t\t\ttoSkinVertices(48, 0, 56, 8),\r\n\t\t\ttoSkinVertices(32, 8, 40, 16),\r\n\t\t\ttoSkinVertices(40, 8, 48, 16),\r\n\t\t\ttoSkinVertices(48, 8, 56, 16),\r\n\t\t\ttoSkinVertices(56, 8, 64, 16)\r\n\t\t);\r\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\r\n\t\thead2Mesh.renderOrder = -1;\r\n\t\tthis.head.add(head2Mesh);\r\n\r\n\t\tthis.add(this.head);\r\n\r\n\r\n\t\t// Body\r\n\t\tthis.body = new THREE.Group();\r\n\r\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\r\n\t\taddVertices(bodyBox,\r\n\t\t\ttoSkinVertices(20, 16, 28, 20),\r\n\t\t\ttoSkinVertices(28, 16, 36, 20),\r\n\t\t\ttoSkinVertices(16, 20, 20, 32),\r\n\t\t\ttoSkinVertices(20, 20, 28, 32),\r\n\t\t\ttoSkinVertices(28, 20, 32, 32),\r\n\t\t\ttoSkinVertices(32, 20, 40, 32)\r\n\t\t);\r\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\r\n\t\tthis.body.add(bodyMesh);\r\n\r\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\r\n\t\taddVertices(body2Box,\r\n\t\t\ttoSkinVertices(20, 32, 28, 36),\r\n\t\t\ttoSkinVertices(28, 32, 36, 36),\r\n\t\t\ttoSkinVertices(16, 36, 20, 48),\r\n\t\t\ttoSkinVertices(20, 36, 28, 48),\r\n\t\t\ttoSkinVertices(28, 36, 32, 48),\r\n\t\t\ttoSkinVertices(32, 36, 40, 48)\r\n\t\t);\r\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\r\n\t\tthis.body.add(body2Mesh);\r\n\r\n\t\tthis.body.position.y = -10;\r\n\t\tthis.add(this.body);\r\n\r\n\r\n\t\t// Right Arm\r\n\t\tthis.rightArm = new THREE.Group();\r\n\t\tlet rightArmPivot = new THREE.Group();\r\n\r\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\r\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\r\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\r\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\r\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\r\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\r\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\r\n\t\trightArmPivot.add(rightArmMesh);\r\n\r\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\r\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\r\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\r\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\r\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\r\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\r\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\r\n\t\trightArm2Mesh.renderOrder = 1;\r\n\t\trightArmPivot.add(rightArm2Mesh);\r\n\r\n\t\trightArmPivot.position.y = -6;\r\n\t\tthis.rightArm.add(rightArmPivot);\r\n\t\tthis.rightArm.position.y = -4;\r\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\r\n\t\tthis.add(this.rightArm);\r\n\r\n\r\n\t\t// Left Arm\r\n\t\tthis.leftArm = new THREE.Group();\r\n\t\tlet leftArmPivot = new THREE.Group();\r\n\r\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\r\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\r\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\r\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\r\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\r\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\r\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\r\n\t\tleftArmPivot.add(leftArmMesh);\r\n\r\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\r\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\r\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\r\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\r\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\r\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\r\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\r\n\t\tleftArm2Mesh.renderOrder = 1;\r\n\t\tleftArmPivot.add(leftArm2Mesh);\r\n\r\n\t\tleftArmPivot.position.y = -6;\r\n\t\tthis.leftArm.add(leftArmPivot);\r\n\t\tthis.leftArm.position.y = -4;\r\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\r\n\t\tthis.add(this.leftArm);\r\n\r\n\r\n\t\t// Right Leg\r\n\t\tthis.rightLeg = new THREE.Group();\r\n\t\tlet rightLegPivot = new THREE.Group();\r\n\r\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLegBox,\r\n\t\t\ttoSkinVertices(4, 16, 8, 20),\r\n\t\t\ttoSkinVertices(8, 16, 12, 20),\r\n\t\t\ttoSkinVertices(0, 20, 4, 32),\r\n\t\t\ttoSkinVertices(4, 20, 8, 32),\r\n\t\t\ttoSkinVertices(8, 20, 12, 32),\r\n\t\t\ttoSkinVertices(12, 20, 16, 32)\r\n\t\t);\r\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\r\n\t\trightLegPivot.add(rightLegMesh);\r\n\r\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLeg2Box,\r\n\t\t\ttoSkinVertices(4, 32, 8, 36),\r\n\t\t\ttoSkinVertices(8, 32, 12, 36),\r\n\t\t\ttoSkinVertices(0, 36, 4, 48),\r\n\t\t\ttoSkinVertices(4, 36, 8, 48),\r\n\t\t\ttoSkinVertices(8, 36, 12, 48),\r\n\t\t\ttoSkinVertices(12, 36, 16, 48)\r\n\t\t);\r\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\r\n\t\trightLeg2Mesh.renderOrder = 1;\r\n\t\trightLegPivot.add(rightLeg2Mesh);\r\n\r\n\t\trightLegPivot.position.y = -6;\r\n\t\tthis.rightLeg.add(rightLegPivot);\r\n\t\tthis.rightLeg.position.y = -16;\r\n\t\tthis.rightLeg.position.x = -2;\r\n\t\tthis.add(this.rightLeg);\r\n\r\n\t\t// Left Leg\r\n\t\tthis.leftLeg = new THREE.Group();\r\n\t\tlet leftLegPivot = new THREE.Group();\r\n\r\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLegBox,\r\n\t\t\ttoSkinVertices(20, 48, 24, 52),\r\n\t\t\ttoSkinVertices(24, 48, 28, 52),\r\n\t\t\ttoSkinVertices(16, 52, 20, 64),\r\n\t\t\ttoSkinVertices(20, 52, 24, 64),\r\n\t\t\ttoSkinVertices(24, 52, 28, 64),\r\n\t\t\ttoSkinVertices(28, 52, 32, 64)\r\n\t\t);\r\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\r\n\t\tleftLegPivot.add(leftLegMesh);\r\n\r\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLeg2Box,\r\n\t\t\ttoSkinVertices(4, 48, 8, 52),\r\n\t\t\ttoSkinVertices(8, 48, 12, 52),\r\n\t\t\ttoSkinVertices(0, 52, 4, 64),\r\n\t\t\ttoSkinVertices(4, 52, 8, 64),\r\n\t\t\ttoSkinVertices(8, 52, 12, 64),\r\n\t\t\ttoSkinVertices(12, 52, 16, 64)\r\n\t\t);\r\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\r\n\t\tleftLeg2Mesh.renderOrder = 1;\r\n\t\tleftLegPivot.add(leftLeg2Mesh);\r\n\r\n\t\tleftLegPivot.position.y = -6;\r\n\t\tthis.leftLeg.add(leftLegPivot);\r\n\t\tthis.leftLeg.position.y = -16;\r\n\t\tthis.leftLeg.position.x = 2;\r\n\t\tthis.add(this.leftLeg);\r\n\t}\r\n}\r\n\r\nclass CapeObject extends THREE.Group {\r\n\tconstructor(capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\t// back = outside\r\n\t\t// front = inside\r\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\r\n\t\taddVertices(capeBox,\r\n\t\t\ttoCapeVertices(1, 0, 11, 1),\r\n\t\t\ttoCapeVertices(11, 0, 21, 1),\r\n\t\t\ttoCapeVertices(11, 1, 12, 17),\r\n\t\t\ttoCapeVertices(12, 1, 22, 17),\r\n\t\t\ttoCapeVertices(0, 1, 1, 17),\r\n\t\t\ttoCapeVertices(1, 1, 11, 17)\r\n\t\t);\r\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\r\n\t\tthis.cape.position.y = -8;\r\n\t\tthis.cape.position.z = -0.5;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nclass PlayerObject extends THREE.Group {\r\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\tthis.slim = slim;\r\n\r\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\r\n\t\tthis.skin.visible = false;\r\n\t\tthis.add(this.skin);\r\n\r\n\t\tthis.cape = new CapeObject(capeMaterial);\r\n\t\tthis.cape.position.z = -2;\r\n\t\tthis.cape.position.y = -4;\r\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\r\n\t\tthis.cape.visible = false;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nexport { SkinObject, CapeObject, PlayerObject };\r\n","import * as THREE from \"three\";\r\n\r\nclass OrbitControls extends THREE.EventDispatcher {\r\n\t/**\r\n\t * @preserve\r\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\r\n\t */\r\n\t/**\r\n\t * @license\r\n\t * Copyright (C) 2010-2017 three.js authors\r\n\t *\r\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n\t * of this software and associated documentation files (the \"Software\"), to deal\r\n\t * in the Software without restriction, including without limitation the rights\r\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\t * copies of the Software, and to permit persons to whom the Software is\r\n\t * furnished to do so, subject to the following conditions:\r\n\t *\r\n\t * The above copyright notice and this permission notice shall be included in\r\n\t * all copies or substantial portions of the Software.\r\n\t *\r\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\t * THE SOFTWARE.\r\n\t *\r\n\t *\r\n\t * @author qiao / https://github.com/qiao\r\n\t * @author mrdoob / http://mrdoob.com\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t * @author WestLangley / http://github.com/WestLangley\r\n\t * @author erich666 / http://erichaines.com\r\n\t */\r\n\r\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\r\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n\t//\r\n\t// Orbit - left mouse / touch: one finger move\r\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\r\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\r\n\r\n\tconstructor(object, domElement) {\r\n\t\tsuper();\r\n\t\tthis.object = object;\r\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\r\n\r\n\t\t// Set to false to disable this control\r\n\t\tthis.enabled = true;\r\n\r\n\t\t// \"target\" sets the location of focus, where the object orbits around\r\n\t\tthis.target = new THREE.Vector3();\r\n\r\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\r\n\t\tthis.minDistance = 0;\r\n\t\tthis.maxDistance = Infinity;\r\n\r\n\t\t// How far you can zoom in and out (OrthographicCamera only)\r\n\t\tthis.minZoom = 0;\r\n\t\tthis.maxZoom = Infinity;\r\n\r\n\t\t// How far you can orbit vertically, upper and lower limits.\r\n\t\t// Range is 0 to Math.PI radians.\r\n\t\tthis.minPolarAngle = 0; // radians\r\n\t\tthis.maxPolarAngle = Math.PI; // radians\r\n\r\n\t\t// How far you can orbit horizontally, upper and lower limits.\r\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\r\n\t\tthis.minAzimuthAngle = -Infinity; // radians\r\n\t\tthis.maxAzimuthAngle = Infinity; // radians\r\n\r\n\t\t// Set to true to enable damping (inertia)\r\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.enableDamping = false;\r\n\t\tthis.dampingFactor = 0.25;\r\n\r\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n\t\t// Set to false to disable zooming\r\n\t\tthis.enableZoom = true;\r\n\t\tthis.zoomSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable rotating\r\n\t\tthis.enableRotate = true;\r\n\t\tthis.rotateSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable panning\r\n\t\tthis.enablePan = true;\r\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\r\n\r\n\t\t// Set to true to automatically rotate around the target\r\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.autoRotate = false;\r\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\r\n\r\n\t\t// Set to false to disable use of the keys\r\n\t\tthis.enableKeys = true;\r\n\r\n\t\t// The four arrow keys\r\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\r\n\r\n\t\t// Mouse buttons\r\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\r\n\r\n\t\t// for reset\r\n\t\tthis.target0 = this.target.clone();\r\n\t\tthis.position0 = this.object.position.clone();\r\n\t\tthis.zoom0 = this.object.zoom;\r\n\r\n\t\t//\r\n\t\t// public methods\r\n\t\t//\r\n\t\tthis.getPolarAngle = function () {\r\n\t\t\treturn spherical.phi;\r\n\t\t};\r\n\t\tthis.getAzimuthalAngle = function () {\r\n\t\t\treturn spherical.theta;\r\n\t\t};\r\n\t\tthis.saveState = function () {\r\n\t\t\tscope.target0.copy(scope.target);\r\n\t\t\tscope.position0.copy(scope.object.position);\r\n\t\t\tscope.zoom0 = scope.object.zoom;\r\n\t\t};\r\n\t\tthis.reset = function () {\r\n\t\t\tscope.target.copy(scope.target0);\r\n\t\t\tscope.object.position.copy(scope.position0);\r\n\t\t\tscope.object.zoom = scope.zoom0;\r\n\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\tscope.update();\r\n\t\t\tstate = STATE.NONE;\r\n\t\t};\r\n\r\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\r\n\t\tthis.update = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\t// so camera.up is the orbit axis\r\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\r\n\t\t\tlet quatInverse = quat.clone().inverse();\r\n\t\t\tlet lastPosition = new THREE.Vector3();\r\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\r\n\t\t\treturn function update() {\r\n\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quat);\r\n\t\t\t\t// angle from z-axis around y-axis\r\n\t\t\t\tspherical.setFromVector3(offset);\r\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\r\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\r\n\t\t\t\t}\r\n\t\t\t\tspherical.theta += sphericalDelta.theta;\r\n\t\t\t\tspherical.phi += sphericalDelta.phi;\r\n\t\t\t\t// restrict theta to be between desired limits\r\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\r\n\t\t\t\t// restrict phi to be between desired limits\r\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\r\n\t\t\t\tspherical.makeSafe();\r\n\t\t\t\tspherical.radius *= scale;\r\n\t\t\t\t// restrict radius to be between desired limits\r\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\r\n\t\t\t\t// move target to panned location\r\n\t\t\t\tscope.target.add(panOffset);\r\n\t\t\t\toffset.setFromSpherical(spherical);\r\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quatInverse);\r\n\t\t\t\tposition.copy(scope.target).add(offset);\r\n\t\t\t\tscope.object.lookAt(scope.target);\r\n\t\t\t\tif (scope.enableDamping === true) {\r\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\r\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tscale = 1;\r\n\t\t\t\tpanOffset.set(0, 0, 0);\r\n\t\t\t\t// update condition is:\r\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\r\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\t\t\t\tif (zoomChanged ||\r\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\r\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\r\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\t\t\tlastPosition.copy(scope.object.position);\r\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\r\n\t\t\t\t\tzoomChanged = false;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}();\r\n\t\tthis.dispose = function () {\r\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\r\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\r\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\r\n\t\t};\r\n\t\t//\r\n\t\t// internals\r\n\t\t//\r\n\t\tlet scope = this;\r\n\t\tlet changeEvent = { type: \"change\" };\r\n\t\tlet startEvent = { type: \"start\" };\r\n\t\tlet endEvent = { type: \"end\" };\r\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\r\n\t\tlet state = STATE.NONE;\r\n\t\tlet EPS = 0.000001;\r\n\t\t// current position in spherical coordinates\r\n\t\tlet spherical = new THREE.Spherical();\r\n\t\tlet sphericalDelta = new THREE.Spherical();\r\n\t\tlet scale = 1;\r\n\t\tlet panOffset = new THREE.Vector3();\r\n\t\tlet zoomChanged = false;\r\n\t\tlet rotateStart = new THREE.Vector2();\r\n\t\tlet rotateEnd = new THREE.Vector2();\r\n\t\tlet rotateDelta = new THREE.Vector2();\r\n\t\tlet panStart = new THREE.Vector2();\r\n\t\tlet panEnd = new THREE.Vector2();\r\n\t\tlet panDelta = new THREE.Vector2();\r\n\t\tlet dollyStart = new THREE.Vector2();\r\n\t\tlet dollyEnd = new THREE.Vector2();\r\n\t\tlet dollyDelta = new THREE.Vector2();\r\n\t\tfunction getAutoRotationAngle() {\r\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\t\t}\r\n\t\tfunction getZoomScale() {\r\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\r\n\t\t}\r\n\t\tfunction rotateLeft(angle) {\r\n\t\t\tsphericalDelta.theta -= angle;\r\n\t\t}\r\n\t\tfunction rotateUp(angle) {\r\n\t\t\tsphericalDelta.phi -= angle;\r\n\t\t}\r\n\t\tlet panLeft = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panLeft(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(-distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\tlet panUp = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panUp(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\t// deltaX and deltaY are in pixels; right and down are positive\r\n\t\tlet pan = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\treturn function pan(deltaX, deltaY) {\r\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\t\t// perspective\r\n\t\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t\tlet targetDistance = offset.length();\r\n\t\t\t\t\t// half of the fov is center to top of screen\r\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\r\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\r\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\t\t// orthographic\r\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\r\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// camera neither orthographic nor perspective\r\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\r\n\t\t\t\t\tscope.enablePan = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}();\r\n\t\tfunction dollyIn(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale /= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction dollyOut(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale *= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//\r\n\t\t// event callbacks - update the object state\r\n\t\t//\r\n\t\tfunction handleMouseDownRotate(event) {\r\n\t\t\trotateStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownDolly(event) {\r\n\t\t\tdollyStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownPan(event) {\r\n\t\t\tpanStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.clientX, event.clientY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t// rotating across whole screen goes 360 degrees around\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMoveDolly(event) {\r\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMovePan(event) {\r\n\t\t\tpanEnd.set(event.clientX, event.clientY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseUp(event) {\r\n\t\t}\r\n\t\tfunction handleMouseWheel(event) {\r\n\t\t\tif (event.deltaY < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (event.deltaY > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleKeyDown(event) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase scope.keys.UP:\r\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.BOTTOM:\r\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.LEFT:\r\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.RIGHT:\r\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction handleTouchStartRotate(event) {\r\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchStartDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyStart.set(0, distance);\r\n\t\t}\r\n\t\tfunction handleTouchStartPan(event) {\r\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMoveDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyEnd.set(0, distance);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMovePan(event) {\r\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchEnd(event) {\r\n\t\t}\r\n\t\t//\r\n\t\t// event handlers - FSM: listen for events and reset state\r\n\t\t//\r\n\t\tfunction onMouseDown(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.button) {\r\n\t\t\t\tcase scope.mouseButtons.ORBIT:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownRotate(event);\r\n\t\t\t\t\tstate = STATE.ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.ZOOM:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownDolly(event);\r\n\t\t\t\t\tstate = STATE.DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownPan(event);\r\n\t\t\t\t\tstate = STATE.PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onMouseMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (state) {\r\n\t\t\t\tcase STATE.ROTATE:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.DOLLY:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tfunction onMouseUp(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleMouseUp(event);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onMouseWheel(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\thandleMouseWheel(event);\r\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t}\r\n\t\tfunction onKeyDown(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleKeyDown(event);\r\n\t\t}\r\n\t\tfunction onTouchStart(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartRotate(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartDolly(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartPan(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onTouchMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t\tfunction onTouchEnd(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleTouchEnd(event);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onContextMenu(event) {\r\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\t//\r\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\r\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\r\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\r\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\r\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\r\n\t\t// force an update at start\r\n\t\tthis.update();\r\n\t}\r\n}\r\n\r\nexport { OrbitControls };\r\n","function invokeAnimation(animation, player, time) {\r\n\tif (animation instanceof CompositeAnimation) {\r\n\t\tanimation.play(player, time);\r\n\t} else if (animation instanceof Function) {\r\n\t\tanimation(player, time);\r\n\t} else {\r\n\t\tthrow `Not an animation: ${animation}`;\r\n\t}\r\n}\r\n\r\nclass AnimationHandle {\r\n\tconstructor(animation) {\r\n\t\tthis.animation = animation;\r\n\t\tthis.paused = this._paused = false;\r\n\t\tthis.speed = this._speed = 1.0;\r\n\t\tthis._lastChange = null;\r\n\t\tthis._lastChangeX = null;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tif (this._lastChange === null) {\r\n\t\t\tthis._lastChange = time;\r\n\t\t\tthis._lastChangeX = 0;\r\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tif (this._paused === false) {\r\n\t\t\t\tthis._lastChangeX += dt * this._speed;\r\n\t\t\t}\r\n\t\t\tthis._paused = this.paused;\r\n\t\t\tthis._speed = this.speed;\r\n\t\t\tthis._lastChange = time;\r\n\t\t}\r\n\t\tif (this.paused === false) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\r\n\t\t\tinvokeAnimation(this.animation, player, x);\r\n\t\t}\r\n\t}\r\n\treset(){\r\n\t\tthis._lastChange = null;\r\n\t}\r\n}\r\n\r\nclass CompositeAnimation {\r\n\tconstructor() {\r\n\t\tthis.handles = new Set();\r\n\t}\r\n\tadd(animation) {\r\n\t\tlet handle = new AnimationHandle(animation);\r\n\t\thandle.remove = () => this.handles.delete(handle);\r\n\t\tthis.handles.add(handle);\r\n\t\treturn handle;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tthis.handles.forEach(handle => handle.play(player, time));\r\n\t}\r\n}\r\n\r\nlet WalkAnimation = (player, time) => {\r\n\tlet skin = player.skin;\r\n\tlet angleRot = time + Math.PI / 2;\r\n\r\n\t// Leg Swing\r\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\r\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\r\n\t// Arm Swing\r\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\r\n};\r\n\r\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\r\n","import * as THREE from \"three\";\r\nimport { PlayerObject } from \"./model\";\r\nimport { OrbitControls } from \"./orbit_controls\";\r\nimport { invokeAnimation } from \"./animation\";\r\n\r\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\r\n\tlet imgData = context.getImageData(sX, sY, w, h);\r\n\tif (flipHorizontal) {\r\n\t\tfor (let y = 0; y < h; y++) {\r\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\r\n\t\t\t\tlet index = (x + y * w) * 4;\r\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\r\n\t\t\t\tlet pA1 = imgData.data[index];\r\n\t\t\t\tlet pA2 = imgData.data[index + 1];\r\n\t\t\t\tlet pA3 = imgData.data[index + 2];\r\n\t\t\t\tlet pA4 = imgData.data[index + 3];\r\n\r\n\t\t\t\tlet pB1 = imgData.data[index2];\r\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\r\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\r\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\r\n\r\n\t\t\t\timgData.data[index] = pB1;\r\n\t\t\t\timgData.data[index + 1] = pB2;\r\n\t\t\t\timgData.data[index + 2] = pB3;\r\n\t\t\t\timgData.data[index + 3] = pB4;\r\n\r\n\t\t\t\timgData.data[index2] = pA1;\r\n\t\t\t\timgData.data[index2 + 1] = pA2;\r\n\t\t\t\timgData.data[index2 + 2] = pA3;\r\n\t\t\t\timgData.data[index2 + 3] = pA4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcontext.putImageData(imgData, dX, dY);\r\n}\r\n\r\nfunction convertSkinTo1_8(context, width) {\r\n\tlet scale = width / 64.0;\r\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\r\n\r\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\r\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\r\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\r\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\r\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\r\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\r\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\r\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\r\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\r\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\r\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\r\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\r\n}\r\n\r\nclass SkinViewer {\r\n\tconstructor(options) {\r\n\t\tthis.domElement = options.domElement;\r\n\t\tthis.animation = options.animation || null;\r\n\t\tthis.animationPaused = false;\r\n\t\tthis.animationTime = 0;\r\n\t\tthis.disposed = false;\r\n\r\n\t\t// texture\r\n\t\tthis.skinImg = new Image();\r\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\r\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\r\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.capeImg = new Image();\r\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\r\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\r\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\r\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\r\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\r\n\r\n\t\t// scene\r\n\t\tthis.scene = new THREE.Scene();\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\r\n\t\tthis.camera.position.y = -12;\r\n\t\tthis.camera.position.z = 30;\r\n\r\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\r\n\t\tthis.renderer.setSize(300, 300); // default size\r\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\r\n\t\tthis.domElement.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\r\n\t\tthis.scene.add(this.playerObject);\r\n\r\n\t\t// texture loading\r\n\t\tthis.skinImg.crossOrigin = \"\";\r\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\r\n\t\tthis.skinImg.onload = () => {\r\n\t\t\tlet isOldFormat = false;\r\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\r\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\r\n\t\t\t\t\tisOldFormat = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\"Bad skin size\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\r\n\t\t\tif (isOldFormat) {\r\n\t\t\t\tlet width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.width = width;\r\n\t\t\t\tthis.skinCanvas.height = width;\r\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\r\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\r\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t}\r\n\r\n\t\t\tthis.skinTexture.needsUpdate = true;\r\n\t\t\tthis.layer1Material.needsUpdate = true;\r\n\t\t\tthis.layer2Material.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.skin.visible = true;\r\n\t\t};\r\n\r\n\t\tthis.capeImg.crossOrigin = \"\";\r\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\r\n\t\tthis.capeImg.onload = () => {\r\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\r\n\t\t\t\tconsole.error(\"Bad cape size\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\r\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\r\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\r\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\r\n\t\t\tthis.capeTexture.needsUpdate = true;\r\n\t\t\tthis.capeMaterial.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.cape.visible = true;\r\n\t\t};\r\n\r\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\r\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\r\n\t\tif (options.width) this.width = options.width;\r\n\t\tif (options.height) this.height = options.height;\r\n\r\n\t\tlet draw = () => {\r\n\t\t\tif (this.disposed) return;\r\n\t\t\twindow.requestAnimationFrame(draw);\r\n\t\t\tif (!this.animationPaused) {\r\n\t\t\t\tthis.animationTime++;\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\t\tdraw();\r\n\t}\r\n\r\n\tsetSize(width, height) {\r\n\t\tthis.camera.aspect = width / height;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.disposed = true;\r\n\t\tthis.domElement.removeChild(this.renderer.domElement);\r\n\t\tthis.renderer.dispose();\r\n\t\tthis.skinTexture.dispose();\r\n\t\tthis.capeTexture.dispose();\r\n\t}\r\n\r\n\tget skinUrl() {\r\n\t\treturn this.skinImg.src;\r\n\t}\r\n\r\n\tset skinUrl(url) {\r\n\t\tthis.skinImg.src = url;\r\n\t}\r\n\r\n\tget capeUrl() {\r\n\t\treturn this.capeImg.src;\r\n\t}\r\n\r\n\tset capeUrl(url) {\r\n\t\tthis.capeImg.src = url;\r\n\t}\r\n\r\n\tget width() {\r\n\t\treturn this.renderer.getSize().width;\r\n\t}\r\n\r\n\tset width(newWidth) {\r\n\t\tthis.setSize(newWidth, this.height);\r\n\t}\r\n\r\n\tget height() {\r\n\t\treturn this.renderer.getSize().height;\r\n\t}\r\n\r\n\tset height(newHeight) {\r\n\t\tthis.setSize(this.width, newHeight);\r\n\t}\r\n}\r\n\r\nclass SkinControl {\r\n\tconstructor(skinViewer) {\r\n\t\tthis.enableAnimationControl = true;\r\n\t\tthis.skinViewer = skinViewer;\r\n\r\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\r\n\t\tthis.orbitControls.enablePan = false;\r\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\r\n\t\tthis.orbitControls.minDistance = 10;\r\n\t\tthis.orbitControls.maxDistance = 256;\r\n\t\tthis.orbitControls.update();\r\n\r\n\t\tthis.animationPauseListener = e => {\r\n\t\t\tif (this.enableAnimationControl) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t\tthis.orbitControls.dispose();\r\n\t}\r\n}\r\n\r\nexport { SkinViewer, SkinControl };\r\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","_this","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","_this2","PlayerObject","slim","skin","visible","_this3","rotation","Math","PI","OrbitControls","object","domElement","offset","quat","quatInverse","lastPosition","lastQuaternion","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","copy","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","STATE","NONE","setFromUnitVectors","up","inverse","sub","applyQuaternion","setFromVector3","state","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","rotateLeft","angle","rotateUp","v","panLeft","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","warn","dollyIn","dollyScale","dollyOut","event","button","clientX","clientY","preventDefault","addEventListener","subVectors","stopPropagation","keyCode","touches","pageX","pageY","dx","dy","sqrt","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","this","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","angleRot","alpha","antialias","setSize","context","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","console","error","src","onload","isOldFormat","width","height","skinContext","getContext","clearRect","drawImage","copySkin","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","copyImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener","cos"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"skinview3d.min.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js"],"sourcesContent":["import * as THREE from \"three\";\n\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\n\treturn [\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\n\t];\n}\n\nfunction toSkinVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\n}\n\nfunction toCapeVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\n}\n\nfunction addVertices(box, top, bottom, left, front, right, back) {\n\tbox.faceVertexUvs[0] = [];\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\n}\n\nconst esp = 0.002;\n\nclass SkinObject extends THREE.Group {\n\tconstructor(isSlim, layer1Material, layer2Material) {\n\t\tsuper();\n\n\t\t// Head\n\t\tthis.head = new THREE.Group();\n\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\n\t\taddVertices(headBox,\n\t\t\ttoSkinVertices(8, 0, 16, 8),\n\t\t\ttoSkinVertices(16, 0, 24, 8),\n\t\t\ttoSkinVertices(0, 8, 8, 16),\n\t\t\ttoSkinVertices(8, 8, 16, 16),\n\t\t\ttoSkinVertices(16, 8, 24, 16),\n\t\t\ttoSkinVertices(24, 8, 32, 16)\n\t\t);\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\n\t\tthis.head.add(headMesh);\n\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\n\t\taddVertices(head2Box,\n\t\t\ttoSkinVertices(40, 0, 48, 8),\n\t\t\ttoSkinVertices(48, 0, 56, 8),\n\t\t\ttoSkinVertices(32, 8, 40, 16),\n\t\t\ttoSkinVertices(40, 8, 48, 16),\n\t\t\ttoSkinVertices(48, 8, 56, 16),\n\t\t\ttoSkinVertices(56, 8, 64, 16)\n\t\t);\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\n\t\thead2Mesh.renderOrder = -1;\n\t\tthis.head.add(head2Mesh);\n\n\t\tthis.add(this.head);\n\n\n\t\t// Body\n\t\tthis.body = new THREE.Group();\n\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\n\t\taddVertices(bodyBox,\n\t\t\ttoSkinVertices(20, 16, 28, 20),\n\t\t\ttoSkinVertices(28, 16, 36, 20),\n\t\t\ttoSkinVertices(16, 20, 20, 32),\n\t\t\ttoSkinVertices(20, 20, 28, 32),\n\t\t\ttoSkinVertices(28, 20, 32, 32),\n\t\t\ttoSkinVertices(32, 20, 40, 32)\n\t\t);\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\n\t\tthis.body.add(bodyMesh);\n\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\n\t\taddVertices(body2Box,\n\t\t\ttoSkinVertices(20, 32, 28, 36),\n\t\t\ttoSkinVertices(28, 32, 36, 36),\n\t\t\ttoSkinVertices(16, 36, 20, 48),\n\t\t\ttoSkinVertices(20, 36, 28, 48),\n\t\t\ttoSkinVertices(28, 36, 32, 48),\n\t\t\ttoSkinVertices(32, 36, 40, 48)\n\t\t);\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\n\t\tthis.body.add(body2Mesh);\n\n\t\tthis.body.position.y = -10;\n\t\tthis.add(this.body);\n\n\n\t\t// Right Arm\n\t\tthis.rightArm = new THREE.Group();\n\t\tlet rightArmPivot = new THREE.Group();\n\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\n\t\t\t);\n\t\t}\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\n\t\trightArmPivot.add(rightArmMesh);\n\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\n\t\t\t);\n\t\t}\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\n\t\trightArm2Mesh.renderOrder = 1;\n\t\trightArmPivot.add(rightArm2Mesh);\n\n\t\trightArmPivot.position.y = -6;\n\t\tthis.rightArm.add(rightArmPivot);\n\t\tthis.rightArm.position.y = -4;\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\n\t\tthis.add(this.rightArm);\n\n\n\t\t// Left Arm\n\t\tthis.leftArm = new THREE.Group();\n\t\tlet leftArmPivot = new THREE.Group();\n\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\n\t\tleftArmPivot.add(leftArmMesh);\n\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\n\t\tleftArm2Mesh.renderOrder = 1;\n\t\tleftArmPivot.add(leftArm2Mesh);\n\n\t\tleftArmPivot.position.y = -6;\n\t\tthis.leftArm.add(leftArmPivot);\n\t\tthis.leftArm.position.y = -4;\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\n\t\tthis.add(this.leftArm);\n\n\n\t\t// Right Leg\n\t\tthis.rightLeg = new THREE.Group();\n\t\tlet rightLegPivot = new THREE.Group();\n\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(rightLegBox,\n\t\t\ttoSkinVertices(4, 16, 8, 20),\n\t\t\ttoSkinVertices(8, 16, 12, 20),\n\t\t\ttoSkinVertices(0, 20, 4, 32),\n\t\t\ttoSkinVertices(4, 20, 8, 32),\n\t\t\ttoSkinVertices(8, 20, 12, 32),\n\t\t\ttoSkinVertices(12, 20, 16, 32)\n\t\t);\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\n\t\trightLegPivot.add(rightLegMesh);\n\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(rightLeg2Box,\n\t\t\ttoSkinVertices(4, 32, 8, 36),\n\t\t\ttoSkinVertices(8, 32, 12, 36),\n\t\t\ttoSkinVertices(0, 36, 4, 48),\n\t\t\ttoSkinVertices(4, 36, 8, 48),\n\t\t\ttoSkinVertices(8, 36, 12, 48),\n\t\t\ttoSkinVertices(12, 36, 16, 48)\n\t\t);\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\n\t\trightLeg2Mesh.renderOrder = 1;\n\t\trightLegPivot.add(rightLeg2Mesh);\n\n\t\trightLegPivot.position.y = -6;\n\t\tthis.rightLeg.add(rightLegPivot);\n\t\tthis.rightLeg.position.y = -16;\n\t\tthis.rightLeg.position.x = -2;\n\t\tthis.add(this.rightLeg);\n\n\t\t// Left Leg\n\t\tthis.leftLeg = new THREE.Group();\n\t\tlet leftLegPivot = new THREE.Group();\n\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(leftLegBox,\n\t\t\ttoSkinVertices(20, 48, 24, 52),\n\t\t\ttoSkinVertices(24, 48, 28, 52),\n\t\t\ttoSkinVertices(16, 52, 20, 64),\n\t\t\ttoSkinVertices(20, 52, 24, 64),\n\t\t\ttoSkinVertices(24, 52, 28, 64),\n\t\t\ttoSkinVertices(28, 52, 32, 64)\n\t\t);\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\n\t\tleftLegPivot.add(leftLegMesh);\n\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(leftLeg2Box,\n\t\t\ttoSkinVertices(4, 48, 8, 52),\n\t\t\ttoSkinVertices(8, 48, 12, 52),\n\t\t\ttoSkinVertices(0, 52, 4, 64),\n\t\t\ttoSkinVertices(4, 52, 8, 64),\n\t\t\ttoSkinVertices(8, 52, 12, 64),\n\t\t\ttoSkinVertices(12, 52, 16, 64)\n\t\t);\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\n\t\tleftLeg2Mesh.renderOrder = 1;\n\t\tleftLegPivot.add(leftLeg2Mesh);\n\n\t\tleftLegPivot.position.y = -6;\n\t\tthis.leftLeg.add(leftLegPivot);\n\t\tthis.leftLeg.position.y = -16;\n\t\tthis.leftLeg.position.x = 2;\n\t\tthis.add(this.leftLeg);\n\t}\n}\n\nclass CapeObject extends THREE.Group {\n\tconstructor(capeMaterial) {\n\t\tsuper();\n\n\t\t// back = outside\n\t\t// front = inside\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\n\t\taddVertices(capeBox,\n\t\t\ttoCapeVertices(1, 0, 11, 1),\n\t\t\ttoCapeVertices(11, 0, 21, 1),\n\t\t\ttoCapeVertices(11, 1, 12, 17),\n\t\t\ttoCapeVertices(12, 1, 22, 17),\n\t\t\ttoCapeVertices(0, 1, 1, 17),\n\t\t\ttoCapeVertices(1, 1, 11, 17)\n\t\t);\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\n\t\tthis.cape.position.y = -8;\n\t\tthis.cape.position.z = -0.5;\n\t\tthis.add(this.cape);\n\t}\n}\n\nclass PlayerObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\n\t\tsuper();\n\n\t\tthis.slim = slim;\n\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\n\t\tthis.skin.visible = false;\n\t\tthis.add(this.skin);\n\n\t\tthis.cape = new CapeObject(capeMaterial);\n\t\tthis.cape.position.z = -2;\n\t\tthis.cape.position.y = -4;\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\n\t\tthis.cape.visible = false;\n\t\tthis.add(this.cape);\n\t}\n}\n\nexport { SkinObject, CapeObject, PlayerObject };\n","import * as THREE from \"three\";\n\nclass OrbitControls extends THREE.EventDispatcher {\n\t/**\n\t * @preserve\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\n\t */\n\t/**\n\t * @license\n\t * Copyright (C) 2010-2017 three.js authors\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t *\n\t *\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\n\n\tconstructor(object, domElement) {\n\t\tsuper();\n\t\tthis.object = object;\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out (OrthographicCamera only)\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\t\tthis.getPolarAngle = function () {\n\t\t\treturn spherical.phi;\n\t\t};\n\t\tthis.getAzimuthalAngle = function () {\n\t\t\treturn spherical.theta;\n\t\t};\n\t\tthis.saveState = function () {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t\tscope.zoom0 = scope.object.zoom;\n\t\t};\n\t\tthis.reset = function () {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\tscope.update();\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\t// so camera.up is the orbit axis\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\n\t\t\tlet quatInverse = quat.clone().inverse();\n\t\t\tlet lastPosition = new THREE.Vector3();\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\n\t\t\treturn function update() {\n\t\t\t\tlet position = scope.object.position;\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\t\t\t\tspherical.makeSafe();\n\t\t\t\tspherical.radius *= scale;\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\t\t\toffset.setFromSpherical(spherical);\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\t\t\tif (zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}();\n\t\tthis.dispose = function () {\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\n\t\t};\n\t\t//\n\t\t// internals\n\t\t//\n\t\tlet scope = this;\n\t\tlet changeEvent = { type: \"change\" };\n\t\tlet startEvent = { type: \"start\" };\n\t\tlet endEvent = { type: \"end\" };\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\tlet state = STATE.NONE;\n\t\tlet EPS = 0.000001;\n\t\t// current position in spherical coordinates\n\t\tlet spherical = new THREE.Spherical();\n\t\tlet sphericalDelta = new THREE.Spherical();\n\t\tlet scale = 1;\n\t\tlet panOffset = new THREE.Vector3();\n\t\tlet zoomChanged = false;\n\t\tlet rotateStart = new THREE.Vector2();\n\t\tlet rotateEnd = new THREE.Vector2();\n\t\tlet rotateDelta = new THREE.Vector2();\n\t\tlet panStart = new THREE.Vector2();\n\t\tlet panEnd = new THREE.Vector2();\n\t\tlet panDelta = new THREE.Vector2();\n\t\tlet dollyStart = new THREE.Vector2();\n\t\tlet dollyEnd = new THREE.Vector2();\n\t\tlet dollyDelta = new THREE.Vector2();\n\t\tfunction getAutoRotationAngle() {\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\tfunction getZoomScale() {\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\t\tlet panLeft = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\tlet panUp = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar(distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tlet pan = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\t\t// perspective\n\t\t\t\t\tlet position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tlet targetDistance = offset.length();\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t}();\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale /= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale *= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseUp(event) {\n\t\t}\n\t\tfunction handleMouseWheel(event) {\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (event.deltaY > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleKeyDown(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfunction handleTouchStartRotate(event) {\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchStartDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\tfunction handleTouchStartPan(event) {\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyEnd.set(0, distance);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchEnd(event) {\n\t\t}\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\tfunction onMouseDown(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.button) {\n\t\t\t\tcase scope.mouseButtons.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownRotate(event);\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.ZOOM:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownDolly(event);\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownPan(event);\n\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onMouseMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tfunction onMouseUp(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleMouseUp(event);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\thandleMouseWheel(event);\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\tfunction onTouchStart(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartPan(event);\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onTouchMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\tfunction onTouchEnd(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleTouchEnd(event);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t}\n\t\t//\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\n\t\t// force an update at start\n\t\tthis.update();\n\t}\n}\n\nexport { OrbitControls };\n","function invokeAnimation(animation, player, time) {\n\tif (animation instanceof CompositeAnimation) {\n\t\tanimation.play(player, time);\n\t} else if (animation instanceof Function) {\n\t\tanimation(player, time);\n\t} else {\n\t\tthrow `Not an animation: ${animation}`;\n\t}\n}\n\nclass AnimationHandle {\n\tconstructor(animation) {\n\t\tthis.animation = animation;\n\t\tthis.paused = this._paused = false;\n\t\tthis.speed = this._speed = 1.0;\n\t\tthis._lastChange = null;\n\t\tthis._lastChangeX = null;\n\t}\n\tplay(player, time) {\n\t\tif (this._lastChange === null) {\n\t\t\tthis._lastChange = time;\n\t\t\tthis._lastChangeX = 0;\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tif (this._paused === false) {\n\t\t\t\tthis._lastChangeX += dt * this._speed;\n\t\t\t}\n\t\t\tthis._paused = this.paused;\n\t\t\tthis._speed = this.speed;\n\t\t\tthis._lastChange = time;\n\t\t}\n\t\tif (this.paused === false) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\n\t\t\tinvokeAnimation(this.animation, player, x);\n\t\t}\n\t}\n\treset(){\n\t\tthis._lastChange = null;\n\t}\n}\n\nclass CompositeAnimation {\n\tconstructor() {\n\t\tthis.handles = new Set();\n\t}\n\tadd(animation) {\n\t\tlet handle = new AnimationHandle(animation);\n\t\thandle.remove = () => this.handles.delete(handle);\n\t\tthis.handles.add(handle);\n\t\treturn handle;\n\t}\n\tplay(player, time) {\n\t\tthis.handles.forEach(handle => handle.play(player, time));\n\t}\n}\n\nlet WalkAnimation = (player, time) => {\n\tlet skin = player.skin;\n\tlet angleRot = time + Math.PI / 2;\n\n\t// Leg Swing\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\n\n\t// Arm Swing\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\n};\n\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\n","import * as THREE from \"three\";\nimport { PlayerObject } from \"./model\";\nimport { OrbitControls } from \"./orbit_controls\";\nimport { invokeAnimation } from \"./animation\";\n\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\n\tlet imgData = context.getImageData(sX, sY, w, h);\n\tif (flipHorizontal) {\n\t\tfor (let y = 0; y < h; y++) {\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\n\t\t\t\tlet index = (x + y * w) * 4;\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\n\t\t\t\tlet pA1 = imgData.data[index];\n\t\t\t\tlet pA2 = imgData.data[index + 1];\n\t\t\t\tlet pA3 = imgData.data[index + 2];\n\t\t\t\tlet pA4 = imgData.data[index + 3];\n\n\t\t\t\tlet pB1 = imgData.data[index2];\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\n\n\t\t\t\timgData.data[index] = pB1;\n\t\t\t\timgData.data[index + 1] = pB2;\n\t\t\t\timgData.data[index + 2] = pB3;\n\t\t\t\timgData.data[index + 3] = pB4;\n\n\t\t\t\timgData.data[index2] = pA1;\n\t\t\t\timgData.data[index2 + 1] = pA2;\n\t\t\t\timgData.data[index2 + 2] = pA3;\n\t\t\t\timgData.data[index2 + 3] = pA4;\n\t\t\t}\n\t\t}\n\t}\n\tcontext.putImageData(imgData, dX, dY);\n}\n\nfunction convertSkinTo1_8(context, width) {\n\tlet scale = width / 64.0;\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\n\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\n}\n\nclass SkinViewer {\n\tconstructor(options) {\n\t\tthis.domElement = options.domElement;\n\t\tthis.animation = options.animation || null;\n\t\tthis.animationPaused = false;\n\t\tthis.animationTime = 0;\n\t\tthis.disposed = false;\n\n\t\t// texture\n\t\tthis.skinImg = new Image();\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.capeImg = new Image();\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\n\n\t\t// scene\n\t\tthis.scene = new THREE.Scene();\n\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\n\t\tthis.camera.position.y = -12;\n\t\tthis.camera.position.z = 30;\n\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\n\t\tthis.renderer.setSize(300, 300); // default size\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\n\t\tthis.domElement.appendChild(this.renderer.domElement);\n\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\n\t\tthis.scene.add(this.playerObject);\n\n\t\t// texture loading\n\t\tthis.skinImg.crossOrigin = \"\";\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\n\t\tthis.skinImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad skin size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.width = width;\n\t\t\t\tthis.skinCanvas.height = width;\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\n\t\t\t} else {\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t}\n\n\t\t\tthis.skinTexture.needsUpdate = true;\n\t\t\tthis.layer1Material.needsUpdate = true;\n\t\t\tthis.layer2Material.needsUpdate = true;\n\n\t\t\tthis.playerObject.skin.visible = true;\n\t\t};\n\n\t\tthis.capeImg.crossOrigin = \"\";\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\n\t\tthis.capeImg.onload = () => {\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\n\t\t\t\tconsole.error(\"Bad cape size\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\n\t\t\tthis.capeTexture.needsUpdate = true;\n\t\t\tthis.capeMaterial.needsUpdate = true;\n\n\t\t\tthis.playerObject.cape.visible = true;\n\t\t};\n\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\n\t\tif (options.width) this.width = options.width;\n\t\tif (options.height) this.height = options.height;\n\n\t\tlet draw = () => {\n\t\t\tif (this.disposed) return;\n\t\t\twindow.requestAnimationFrame(draw);\n\t\t\tif (!this.animationPaused) {\n\t\t\t\tthis.animationTime++;\n\t\t\t\tif (this.animation) {\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t};\n\t\tdraw();\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.camera.aspect = width / height;\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.renderer.setSize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis.disposed = true;\n\t\tthis.domElement.removeChild(this.renderer.domElement);\n\t\tthis.renderer.dispose();\n\t\tthis.skinTexture.dispose();\n\t\tthis.capeTexture.dispose();\n\t}\n\n\tget skinUrl() {\n\t\treturn this.skinImg.src;\n\t}\n\n\tset skinUrl(url) {\n\t\tthis.skinImg.src = url;\n\t}\n\n\tget capeUrl() {\n\t\treturn this.capeImg.src;\n\t}\n\n\tset capeUrl(url) {\n\t\tthis.capeImg.src = url;\n\t}\n\n\tget width() {\n\t\treturn this.renderer.getSize().width;\n\t}\n\n\tset width(newWidth) {\n\t\tthis.setSize(newWidth, this.height);\n\t}\n\n\tget height() {\n\t\treturn this.renderer.getSize().height;\n\t}\n\n\tset height(newHeight) {\n\t\tthis.setSize(this.width, newHeight);\n\t}\n}\n\nclass SkinControl {\n\tconstructor(skinViewer) {\n\t\tthis.enableAnimationControl = true;\n\t\tthis.skinViewer = skinViewer;\n\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\n\t\tthis.orbitControls.enablePan = false;\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\n\t\tthis.orbitControls.minDistance = 10;\n\t\tthis.orbitControls.maxDistance = 256;\n\t\tthis.orbitControls.update();\n\n\t\tthis.animationPauseListener = e => {\n\t\t\tif (this.enableAnimationControl) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\n\t\t\t}\n\t\t};\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\n\t}\n\n\tdispose() {\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\n\t\tthis.orbitControls.dispose();\n\t}\n}\n\nexport { SkinViewer, SkinControl };\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","_this","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","_this2","PlayerObject","slim","skin","visible","_this3","rotation","Math","PI","OrbitControls","object","domElement","offset","quat","quatInverse","lastPosition","lastQuaternion","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","copy","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","STATE","NONE","setFromUnitVectors","up","inverse","sub","applyQuaternion","setFromVector3","state","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","rotateLeft","angle","rotateUp","v","panLeft","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","warn","dollyIn","dollyScale","dollyOut","event","button","clientX","clientY","preventDefault","addEventListener","subVectors","stopPropagation","keyCode","touches","pageX","pageY","dx","dy","sqrt","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","this","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","angleRot","alpha","antialias","setSize","context","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","console","error","src","onload","isOldFormat","width","height","skinContext","getContext","clearRect","drawImage","copySkin","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","copyImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener","cos"],"mappings":"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"} \ No newline at end of file diff --git a/js/skinview3d.module.js b/js/skinview3d.module.js index 298e3e4..0f9e243 100644 --- a/js/skinview3d.module.js +++ b/js/skinview3d.module.js @@ -292,38 +292,38 @@ var PlayerObject = function (_THREE$Group3) { var OrbitControls = function (_THREE$EventDispatche) { inherits(OrbitControls, _THREE$EventDispatche); - /** - * @preserve - * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js + /** + * @preserve + * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js */ - /** - * @license - * Copyright (C) 2010-2017 three.js authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com + /** + * @license + * Copyright (C) 2010-2017 three.js authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com */ // This set of controls performs orbiting, dollying (zooming), and panning. @@ -1209,29 +1209,29 @@ var SkinControl = function () { return SkinControl; }(); -/** - * @license - * skinview3d - * - * Copyright (C) 2017 the original author or authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - * @author yushijinhun - * @author Hacksore - * @author Kent Rasmussen +/** + * @license + * skinview3d + * + * Copyright (C) 2017 the original author or authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * @author yushijinhun + * @author Hacksore + * @author Kent Rasmussen */ export { SkinObject, CapeObject, PlayerObject, SkinViewer, SkinControl, CompositeAnimation, WalkAnimation }; diff --git a/js/skinview3d.module.js.map b/js/skinview3d.module.js.map index aa50154..1c6c4ac 100644 --- a/js/skinview3d.module.js.map +++ b/js/skinview3d.module.js.map @@ -1 +1 @@ -{"version":3,"file":"skinview3d.module.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js","../src/skinview3d.js"],"sourcesContent":["import * as THREE from \"three\";\r\n\r\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\r\n\treturn [\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\r\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\r\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\r\n\t];\r\n}\r\n\r\nfunction toSkinVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\r\n}\r\n\r\nfunction toCapeVertices(x1, y1, x2, y2) {\r\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\r\n}\r\n\r\nfunction addVertices(box, top, bottom, left, front, right, back) {\r\n\tbox.faceVertexUvs[0] = [];\r\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\r\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\r\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\r\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\r\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\r\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\r\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\r\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\r\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\r\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\r\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\r\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\r\n}\r\n\r\nconst esp = 0.002;\r\n\r\nclass SkinObject extends THREE.Group {\r\n\tconstructor(isSlim, layer1Material, layer2Material) {\r\n\t\tsuper();\r\n\r\n\t\t// Head\r\n\t\tthis.head = new THREE.Group();\r\n\r\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\r\n\t\taddVertices(headBox,\r\n\t\t\ttoSkinVertices(8, 0, 16, 8),\r\n\t\t\ttoSkinVertices(16, 0, 24, 8),\r\n\t\t\ttoSkinVertices(0, 8, 8, 16),\r\n\t\t\ttoSkinVertices(8, 8, 16, 16),\r\n\t\t\ttoSkinVertices(16, 8, 24, 16),\r\n\t\t\ttoSkinVertices(24, 8, 32, 16)\r\n\t\t);\r\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\r\n\t\tthis.head.add(headMesh);\r\n\r\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\r\n\t\taddVertices(head2Box,\r\n\t\t\ttoSkinVertices(40, 0, 48, 8),\r\n\t\t\ttoSkinVertices(48, 0, 56, 8),\r\n\t\t\ttoSkinVertices(32, 8, 40, 16),\r\n\t\t\ttoSkinVertices(40, 8, 48, 16),\r\n\t\t\ttoSkinVertices(48, 8, 56, 16),\r\n\t\t\ttoSkinVertices(56, 8, 64, 16)\r\n\t\t);\r\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\r\n\t\thead2Mesh.renderOrder = -1;\r\n\t\tthis.head.add(head2Mesh);\r\n\r\n\t\tthis.add(this.head);\r\n\r\n\r\n\t\t// Body\r\n\t\tthis.body = new THREE.Group();\r\n\r\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\r\n\t\taddVertices(bodyBox,\r\n\t\t\ttoSkinVertices(20, 16, 28, 20),\r\n\t\t\ttoSkinVertices(28, 16, 36, 20),\r\n\t\t\ttoSkinVertices(16, 20, 20, 32),\r\n\t\t\ttoSkinVertices(20, 20, 28, 32),\r\n\t\t\ttoSkinVertices(28, 20, 32, 32),\r\n\t\t\ttoSkinVertices(32, 20, 40, 32)\r\n\t\t);\r\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\r\n\t\tthis.body.add(bodyMesh);\r\n\r\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\r\n\t\taddVertices(body2Box,\r\n\t\t\ttoSkinVertices(20, 32, 28, 36),\r\n\t\t\ttoSkinVertices(28, 32, 36, 36),\r\n\t\t\ttoSkinVertices(16, 36, 20, 48),\r\n\t\t\ttoSkinVertices(20, 36, 28, 48),\r\n\t\t\ttoSkinVertices(28, 36, 32, 48),\r\n\t\t\ttoSkinVertices(32, 36, 40, 48)\r\n\t\t);\r\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\r\n\t\tthis.body.add(body2Mesh);\r\n\r\n\t\tthis.body.position.y = -10;\r\n\t\tthis.add(this.body);\r\n\r\n\r\n\t\t// Right Arm\r\n\t\tthis.rightArm = new THREE.Group();\r\n\t\tlet rightArmPivot = new THREE.Group();\r\n\r\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\r\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\r\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\r\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArmBox,\r\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\r\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\r\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\r\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\r\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\r\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\r\n\t\trightArmPivot.add(rightArmMesh);\r\n\r\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\r\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\r\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\r\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(rightArm2Box,\r\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\r\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\r\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\r\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\r\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\r\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\r\n\t\trightArm2Mesh.renderOrder = 1;\r\n\t\trightArmPivot.add(rightArm2Mesh);\r\n\r\n\t\trightArmPivot.position.y = -6;\r\n\t\tthis.rightArm.add(rightArmPivot);\r\n\t\tthis.rightArm.position.y = -4;\r\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\r\n\t\tthis.add(this.rightArm);\r\n\r\n\r\n\t\t// Left Arm\r\n\t\tthis.leftArm = new THREE.Group();\r\n\t\tlet leftArmPivot = new THREE.Group();\r\n\r\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\r\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\r\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\r\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArmBox,\r\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\r\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\r\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\r\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\r\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\r\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\r\n\t\tleftArmPivot.add(leftArmMesh);\r\n\r\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\tif (isSlim) {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\r\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\r\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\r\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\taddVertices(leftArm2Box,\r\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\r\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\r\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\r\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\r\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\r\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\r\n\t\tleftArm2Mesh.renderOrder = 1;\r\n\t\tleftArmPivot.add(leftArm2Mesh);\r\n\r\n\t\tleftArmPivot.position.y = -6;\r\n\t\tthis.leftArm.add(leftArmPivot);\r\n\t\tthis.leftArm.position.y = -4;\r\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\r\n\t\tthis.add(this.leftArm);\r\n\r\n\r\n\t\t// Right Leg\r\n\t\tthis.rightLeg = new THREE.Group();\r\n\t\tlet rightLegPivot = new THREE.Group();\r\n\r\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLegBox,\r\n\t\t\ttoSkinVertices(4, 16, 8, 20),\r\n\t\t\ttoSkinVertices(8, 16, 12, 20),\r\n\t\t\ttoSkinVertices(0, 20, 4, 32),\r\n\t\t\ttoSkinVertices(4, 20, 8, 32),\r\n\t\t\ttoSkinVertices(8, 20, 12, 32),\r\n\t\t\ttoSkinVertices(12, 20, 16, 32)\r\n\t\t);\r\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\r\n\t\trightLegPivot.add(rightLegMesh);\r\n\r\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(rightLeg2Box,\r\n\t\t\ttoSkinVertices(4, 32, 8, 36),\r\n\t\t\ttoSkinVertices(8, 32, 12, 36),\r\n\t\t\ttoSkinVertices(0, 36, 4, 48),\r\n\t\t\ttoSkinVertices(4, 36, 8, 48),\r\n\t\t\ttoSkinVertices(8, 36, 12, 48),\r\n\t\t\ttoSkinVertices(12, 36, 16, 48)\r\n\t\t);\r\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\r\n\t\trightLeg2Mesh.renderOrder = 1;\r\n\t\trightLegPivot.add(rightLeg2Mesh);\r\n\r\n\t\trightLegPivot.position.y = -6;\r\n\t\tthis.rightLeg.add(rightLegPivot);\r\n\t\tthis.rightLeg.position.y = -16;\r\n\t\tthis.rightLeg.position.x = -2;\r\n\t\tthis.add(this.rightLeg);\r\n\r\n\t\t// Left Leg\r\n\t\tthis.leftLeg = new THREE.Group();\r\n\t\tlet leftLegPivot = new THREE.Group();\r\n\r\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLegBox,\r\n\t\t\ttoSkinVertices(20, 48, 24, 52),\r\n\t\t\ttoSkinVertices(24, 48, 28, 52),\r\n\t\t\ttoSkinVertices(16, 52, 20, 64),\r\n\t\t\ttoSkinVertices(20, 52, 24, 64),\r\n\t\t\ttoSkinVertices(24, 52, 28, 64),\r\n\t\t\ttoSkinVertices(28, 52, 32, 64)\r\n\t\t);\r\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\r\n\t\tleftLegPivot.add(leftLegMesh);\r\n\r\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\r\n\t\taddVertices(leftLeg2Box,\r\n\t\t\ttoSkinVertices(4, 48, 8, 52),\r\n\t\t\ttoSkinVertices(8, 48, 12, 52),\r\n\t\t\ttoSkinVertices(0, 52, 4, 64),\r\n\t\t\ttoSkinVertices(4, 52, 8, 64),\r\n\t\t\ttoSkinVertices(8, 52, 12, 64),\r\n\t\t\ttoSkinVertices(12, 52, 16, 64)\r\n\t\t);\r\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\r\n\t\tleftLeg2Mesh.renderOrder = 1;\r\n\t\tleftLegPivot.add(leftLeg2Mesh);\r\n\r\n\t\tleftLegPivot.position.y = -6;\r\n\t\tthis.leftLeg.add(leftLegPivot);\r\n\t\tthis.leftLeg.position.y = -16;\r\n\t\tthis.leftLeg.position.x = 2;\r\n\t\tthis.add(this.leftLeg);\r\n\t}\r\n}\r\n\r\nclass CapeObject extends THREE.Group {\r\n\tconstructor(capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\t// back = outside\r\n\t\t// front = inside\r\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\r\n\t\taddVertices(capeBox,\r\n\t\t\ttoCapeVertices(1, 0, 11, 1),\r\n\t\t\ttoCapeVertices(11, 0, 21, 1),\r\n\t\t\ttoCapeVertices(11, 1, 12, 17),\r\n\t\t\ttoCapeVertices(12, 1, 22, 17),\r\n\t\t\ttoCapeVertices(0, 1, 1, 17),\r\n\t\t\ttoCapeVertices(1, 1, 11, 17)\r\n\t\t);\r\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\r\n\t\tthis.cape.position.y = -8;\r\n\t\tthis.cape.position.z = -0.5;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nclass PlayerObject extends THREE.Group {\r\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\r\n\t\tsuper();\r\n\r\n\t\tthis.slim = slim;\r\n\r\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\r\n\t\tthis.skin.visible = false;\r\n\t\tthis.add(this.skin);\r\n\r\n\t\tthis.cape = new CapeObject(capeMaterial);\r\n\t\tthis.cape.position.z = -2;\r\n\t\tthis.cape.position.y = -4;\r\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\r\n\t\tthis.cape.visible = false;\r\n\t\tthis.add(this.cape);\r\n\t}\r\n}\r\n\r\nexport { SkinObject, CapeObject, PlayerObject };\r\n","import * as THREE from \"three\";\r\n\r\nclass OrbitControls extends THREE.EventDispatcher {\r\n\t/**\r\n\t * @preserve\r\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\r\n\t */\r\n\t/**\r\n\t * @license\r\n\t * Copyright (C) 2010-2017 three.js authors\r\n\t *\r\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n\t * of this software and associated documentation files (the \"Software\"), to deal\r\n\t * in the Software without restriction, including without limitation the rights\r\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\t * copies of the Software, and to permit persons to whom the Software is\r\n\t * furnished to do so, subject to the following conditions:\r\n\t *\r\n\t * The above copyright notice and this permission notice shall be included in\r\n\t * all copies or substantial portions of the Software.\r\n\t *\r\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\t * THE SOFTWARE.\r\n\t *\r\n\t *\r\n\t * @author qiao / https://github.com/qiao\r\n\t * @author mrdoob / http://mrdoob.com\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t * @author WestLangley / http://github.com/WestLangley\r\n\t * @author erich666 / http://erichaines.com\r\n\t */\r\n\r\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\r\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n\t//\r\n\t// Orbit - left mouse / touch: one finger move\r\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\r\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\r\n\r\n\tconstructor(object, domElement) {\r\n\t\tsuper();\r\n\t\tthis.object = object;\r\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\r\n\r\n\t\t// Set to false to disable this control\r\n\t\tthis.enabled = true;\r\n\r\n\t\t// \"target\" sets the location of focus, where the object orbits around\r\n\t\tthis.target = new THREE.Vector3();\r\n\r\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\r\n\t\tthis.minDistance = 0;\r\n\t\tthis.maxDistance = Infinity;\r\n\r\n\t\t// How far you can zoom in and out (OrthographicCamera only)\r\n\t\tthis.minZoom = 0;\r\n\t\tthis.maxZoom = Infinity;\r\n\r\n\t\t// How far you can orbit vertically, upper and lower limits.\r\n\t\t// Range is 0 to Math.PI radians.\r\n\t\tthis.minPolarAngle = 0; // radians\r\n\t\tthis.maxPolarAngle = Math.PI; // radians\r\n\r\n\t\t// How far you can orbit horizontally, upper and lower limits.\r\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\r\n\t\tthis.minAzimuthAngle = -Infinity; // radians\r\n\t\tthis.maxAzimuthAngle = Infinity; // radians\r\n\r\n\t\t// Set to true to enable damping (inertia)\r\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.enableDamping = false;\r\n\t\tthis.dampingFactor = 0.25;\r\n\r\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n\t\t// Set to false to disable zooming\r\n\t\tthis.enableZoom = true;\r\n\t\tthis.zoomSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable rotating\r\n\t\tthis.enableRotate = true;\r\n\t\tthis.rotateSpeed = 1.0;\r\n\r\n\t\t// Set to false to disable panning\r\n\t\tthis.enablePan = true;\r\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\r\n\r\n\t\t// Set to true to automatically rotate around the target\r\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n\t\tthis.autoRotate = false;\r\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\r\n\r\n\t\t// Set to false to disable use of the keys\r\n\t\tthis.enableKeys = true;\r\n\r\n\t\t// The four arrow keys\r\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\r\n\r\n\t\t// Mouse buttons\r\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\r\n\r\n\t\t// for reset\r\n\t\tthis.target0 = this.target.clone();\r\n\t\tthis.position0 = this.object.position.clone();\r\n\t\tthis.zoom0 = this.object.zoom;\r\n\r\n\t\t//\r\n\t\t// public methods\r\n\t\t//\r\n\t\tthis.getPolarAngle = function () {\r\n\t\t\treturn spherical.phi;\r\n\t\t};\r\n\t\tthis.getAzimuthalAngle = function () {\r\n\t\t\treturn spherical.theta;\r\n\t\t};\r\n\t\tthis.saveState = function () {\r\n\t\t\tscope.target0.copy(scope.target);\r\n\t\t\tscope.position0.copy(scope.object.position);\r\n\t\t\tscope.zoom0 = scope.object.zoom;\r\n\t\t};\r\n\t\tthis.reset = function () {\r\n\t\t\tscope.target.copy(scope.target0);\r\n\t\t\tscope.object.position.copy(scope.position0);\r\n\t\t\tscope.object.zoom = scope.zoom0;\r\n\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\tscope.update();\r\n\t\t\tstate = STATE.NONE;\r\n\t\t};\r\n\r\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\r\n\t\tthis.update = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\t// so camera.up is the orbit axis\r\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\r\n\t\t\tlet quatInverse = quat.clone().inverse();\r\n\t\t\tlet lastPosition = new THREE.Vector3();\r\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\r\n\t\t\treturn function update() {\r\n\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quat);\r\n\t\t\t\t// angle from z-axis around y-axis\r\n\t\t\t\tspherical.setFromVector3(offset);\r\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\r\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\r\n\t\t\t\t}\r\n\t\t\t\tspherical.theta += sphericalDelta.theta;\r\n\t\t\t\tspherical.phi += sphericalDelta.phi;\r\n\t\t\t\t// restrict theta to be between desired limits\r\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\r\n\t\t\t\t// restrict phi to be between desired limits\r\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\r\n\t\t\t\tspherical.makeSafe();\r\n\t\t\t\tspherical.radius *= scale;\r\n\t\t\t\t// restrict radius to be between desired limits\r\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\r\n\t\t\t\t// move target to panned location\r\n\t\t\t\tscope.target.add(panOffset);\r\n\t\t\t\toffset.setFromSpherical(spherical);\r\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\r\n\t\t\t\toffset.applyQuaternion(quatInverse);\r\n\t\t\t\tposition.copy(scope.target).add(offset);\r\n\t\t\t\tscope.object.lookAt(scope.target);\r\n\t\t\t\tif (scope.enableDamping === true) {\r\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\r\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tscale = 1;\r\n\t\t\t\tpanOffset.set(0, 0, 0);\r\n\t\t\t\t// update condition is:\r\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\r\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\t\t\t\tif (zoomChanged ||\r\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\r\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\r\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\r\n\t\t\t\t\tlastPosition.copy(scope.object.position);\r\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\r\n\t\t\t\t\tzoomChanged = false;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}();\r\n\t\tthis.dispose = function () {\r\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\r\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\r\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\r\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\r\n\t\t};\r\n\t\t//\r\n\t\t// internals\r\n\t\t//\r\n\t\tlet scope = this;\r\n\t\tlet changeEvent = { type: \"change\" };\r\n\t\tlet startEvent = { type: \"start\" };\r\n\t\tlet endEvent = { type: \"end\" };\r\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\r\n\t\tlet state = STATE.NONE;\r\n\t\tlet EPS = 0.000001;\r\n\t\t// current position in spherical coordinates\r\n\t\tlet spherical = new THREE.Spherical();\r\n\t\tlet sphericalDelta = new THREE.Spherical();\r\n\t\tlet scale = 1;\r\n\t\tlet panOffset = new THREE.Vector3();\r\n\t\tlet zoomChanged = false;\r\n\t\tlet rotateStart = new THREE.Vector2();\r\n\t\tlet rotateEnd = new THREE.Vector2();\r\n\t\tlet rotateDelta = new THREE.Vector2();\r\n\t\tlet panStart = new THREE.Vector2();\r\n\t\tlet panEnd = new THREE.Vector2();\r\n\t\tlet panDelta = new THREE.Vector2();\r\n\t\tlet dollyStart = new THREE.Vector2();\r\n\t\tlet dollyEnd = new THREE.Vector2();\r\n\t\tlet dollyDelta = new THREE.Vector2();\r\n\t\tfunction getAutoRotationAngle() {\r\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\t\t}\r\n\t\tfunction getZoomScale() {\r\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\r\n\t\t}\r\n\t\tfunction rotateLeft(angle) {\r\n\t\t\tsphericalDelta.theta -= angle;\r\n\t\t}\r\n\t\tfunction rotateUp(angle) {\r\n\t\t\tsphericalDelta.phi -= angle;\r\n\t\t}\r\n\t\tlet panLeft = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panLeft(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(-distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\tlet panUp = function () {\r\n\t\t\tlet v = new THREE.Vector3();\r\n\t\t\treturn function panUp(distance, objectMatrix) {\r\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\r\n\t\t\t\tv.multiplyScalar(distance);\r\n\t\t\t\tpanOffset.add(v);\r\n\t\t\t};\r\n\t\t}();\r\n\t\t// deltaX and deltaY are in pixels; right and down are positive\r\n\t\tlet pan = function () {\r\n\t\t\tlet offset = new THREE.Vector3();\r\n\t\t\treturn function pan(deltaX, deltaY) {\r\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\t\t// perspective\r\n\t\t\t\t\tlet position = scope.object.position;\r\n\t\t\t\t\toffset.copy(position).sub(scope.target);\r\n\t\t\t\t\tlet targetDistance = offset.length();\r\n\t\t\t\t\t// half of the fov is center to top of screen\r\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\r\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\r\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\t\t// orthographic\r\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\r\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// camera neither orthographic nor perspective\r\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\r\n\t\t\t\t\tscope.enablePan = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}();\r\n\t\tfunction dollyIn(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale /= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction dollyOut(dollyScale) {\r\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\r\n\t\t\t\tscale *= dollyScale;\r\n\t\t\t}\r\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\r\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\r\n\t\t\t\tscope.object.updateProjectionMatrix();\r\n\t\t\t\tzoomChanged = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\r\n\t\t\t\tscope.enableZoom = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//\r\n\t\t// event callbacks - update the object state\r\n\t\t//\r\n\t\tfunction handleMouseDownRotate(event) {\r\n\t\t\trotateStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownDolly(event) {\r\n\t\t\tdollyStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseDownPan(event) {\r\n\t\t\tpanStart.set(event.clientX, event.clientY);\r\n\t\t}\r\n\t\tfunction handleMouseMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.clientX, event.clientY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\t// rotating across whole screen goes 360 degrees around\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMoveDolly(event) {\r\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseMovePan(event) {\r\n\t\t\tpanEnd.set(event.clientX, event.clientY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleMouseUp(event) {\r\n\t\t}\r\n\t\tfunction handleMouseWheel(event) {\r\n\t\t\tif (event.deltaY < 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (event.deltaY > 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleKeyDown(event) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase scope.keys.UP:\r\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.BOTTOM:\r\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.LEFT:\r\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.keys.RIGHT:\r\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\r\n\t\t\t\t\tscope.update();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction handleTouchStartRotate(event) {\r\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchStartDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyStart.set(0, distance);\r\n\t\t}\r\n\t\tfunction handleTouchStartPan(event) {\r\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t}\r\n\t\tfunction handleTouchMoveRotate(event) {\r\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\r\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\r\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\r\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\r\n\t\t\trotateStart.copy(rotateEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMoveDolly(event) {\r\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\r\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\r\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tdollyEnd.set(0, distance);\r\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\r\n\t\t\tif (dollyDelta.y > 0) {\r\n\t\t\t\tdollyOut(getZoomScale());\r\n\t\t\t}\r\n\t\t\telse if (dollyDelta.y < 0) {\r\n\t\t\t\tdollyIn(getZoomScale());\r\n\t\t\t}\r\n\t\t\tdollyStart.copy(dollyEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchMovePan(event) {\r\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\r\n\t\t\tpanDelta.subVectors(panEnd, panStart);\r\n\t\t\tpan(panDelta.x, panDelta.y);\r\n\t\t\tpanStart.copy(panEnd);\r\n\t\t\tscope.update();\r\n\t\t}\r\n\t\tfunction handleTouchEnd(event) {\r\n\t\t}\r\n\t\t//\r\n\t\t// event handlers - FSM: listen for events and reset state\r\n\t\t//\r\n\t\tfunction onMouseDown(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.button) {\r\n\t\t\t\tcase scope.mouseButtons.ORBIT:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownRotate(event);\r\n\t\t\t\t\tstate = STATE.ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.ZOOM:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownDolly(event);\r\n\t\t\t\t\tstate = STATE.DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase scope.mouseButtons.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseDownPan(event);\r\n\t\t\t\t\tstate = STATE.PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onMouseMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (state) {\r\n\t\t\t\tcase STATE.ROTATE:\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.DOLLY:\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase STATE.PAN:\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleMouseMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tfunction onMouseUp(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleMouseUp(event);\r\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onMouseWheel(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\thandleMouseWheel(event);\r\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t}\r\n\t\tfunction onKeyDown(event) {\r\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleKeyDown(event);\r\n\t\t}\r\n\t\tfunction onTouchStart(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartRotate(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartDolly(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\thandleTouchStartPan(event);\r\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tif (state !== STATE.NONE) {\r\n\t\t\t\tscope.dispatchEvent(startEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction onTouchMove(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\tswitch (event.touches.length) {\r\n\t\t\t\tcase 1:// one-fingered touch: rotate\r\n\t\t\t\t\tif (scope.enableRotate === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveRotate(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:// two-fingered touch: dolly\r\n\t\t\t\t\tif (scope.enableZoom === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMoveDolly(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:// three-fingered touch: pan\r\n\t\t\t\t\tif (scope.enablePan === false)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\r\n\t\t\t\t\t\treturn; // is this needed?...\r\n\t\t\t\t\thandleTouchMovePan(event);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstate = STATE.NONE;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t\tfunction onTouchEnd(event) {\r\n\t\t\tif (scope.enabled === false)\r\n\t\t\t\treturn;\r\n\t\t\thandleTouchEnd(event);\r\n\t\t\tscope.dispatchEvent(endEvent);\r\n\t\t\tstate = STATE.NONE;\r\n\t\t}\r\n\t\tfunction onContextMenu(event) {\r\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\r\n\t\t\t\treturn;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\t//\r\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\r\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\r\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\r\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\r\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\r\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\r\n\t\t// force an update at start\r\n\t\tthis.update();\r\n\t}\r\n}\r\n\r\nexport { OrbitControls };\r\n","function invokeAnimation(animation, player, time) {\r\n\tif (animation instanceof CompositeAnimation) {\r\n\t\tanimation.play(player, time);\r\n\t} else if (animation instanceof Function) {\r\n\t\tanimation(player, time);\r\n\t} else {\r\n\t\tthrow `Not an animation: ${animation}`;\r\n\t}\r\n}\r\n\r\nclass AnimationHandle {\r\n\tconstructor(animation) {\r\n\t\tthis.animation = animation;\r\n\t\tthis.paused = this._paused = false;\r\n\t\tthis.speed = this._speed = 1.0;\r\n\t\tthis._lastChange = null;\r\n\t\tthis._lastChangeX = null;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tif (this._lastChange === null) {\r\n\t\t\tthis._lastChange = time;\r\n\t\t\tthis._lastChangeX = 0;\r\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tif (this._paused === false) {\r\n\t\t\t\tthis._lastChangeX += dt * this._speed;\r\n\t\t\t}\r\n\t\t\tthis._paused = this.paused;\r\n\t\t\tthis._speed = this.speed;\r\n\t\t\tthis._lastChange = time;\r\n\t\t}\r\n\t\tif (this.paused === false) {\r\n\t\t\tlet dt = time - this._lastChange;\r\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\r\n\t\t\tinvokeAnimation(this.animation, player, x);\r\n\t\t}\r\n\t}\r\n\treset(){\r\n\t\tthis._lastChange = null;\r\n\t}\r\n}\r\n\r\nclass CompositeAnimation {\r\n\tconstructor() {\r\n\t\tthis.handles = new Set();\r\n\t}\r\n\tadd(animation) {\r\n\t\tlet handle = new AnimationHandle(animation);\r\n\t\thandle.remove = () => this.handles.delete(handle);\r\n\t\tthis.handles.add(handle);\r\n\t\treturn handle;\r\n\t}\r\n\tplay(player, time) {\r\n\t\tthis.handles.forEach(handle => handle.play(player, time));\r\n\t}\r\n}\r\n\r\nlet WalkAnimation = (player, time) => {\r\n\tlet skin = player.skin;\r\n\tlet angleRot = time + Math.PI / 2;\r\n\r\n\t// Leg Swing\r\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\r\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\r\n\t// Arm Swing\r\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\r\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\r\n};\r\n\r\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\r\n","import * as THREE from \"three\";\r\nimport { PlayerObject } from \"./model\";\r\nimport { OrbitControls } from \"./orbit_controls\";\r\nimport { invokeAnimation } from \"./animation\";\r\n\r\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\r\n\tlet imgData = context.getImageData(sX, sY, w, h);\r\n\tif (flipHorizontal) {\r\n\t\tfor (let y = 0; y < h; y++) {\r\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\r\n\t\t\t\tlet index = (x + y * w) * 4;\r\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\r\n\t\t\t\tlet pA1 = imgData.data[index];\r\n\t\t\t\tlet pA2 = imgData.data[index + 1];\r\n\t\t\t\tlet pA3 = imgData.data[index + 2];\r\n\t\t\t\tlet pA4 = imgData.data[index + 3];\r\n\r\n\t\t\t\tlet pB1 = imgData.data[index2];\r\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\r\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\r\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\r\n\r\n\t\t\t\timgData.data[index] = pB1;\r\n\t\t\t\timgData.data[index + 1] = pB2;\r\n\t\t\t\timgData.data[index + 2] = pB3;\r\n\t\t\t\timgData.data[index + 3] = pB4;\r\n\r\n\t\t\t\timgData.data[index2] = pA1;\r\n\t\t\t\timgData.data[index2 + 1] = pA2;\r\n\t\t\t\timgData.data[index2 + 2] = pA3;\r\n\t\t\t\timgData.data[index2 + 3] = pA4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcontext.putImageData(imgData, dX, dY);\r\n}\r\n\r\nfunction convertSkinTo1_8(context, width) {\r\n\tlet scale = width / 64.0;\r\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\r\n\r\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\r\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\r\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\r\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\r\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\r\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\r\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\r\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\r\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\r\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\r\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\r\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\r\n}\r\n\r\nclass SkinViewer {\r\n\tconstructor(options) {\r\n\t\tthis.domElement = options.domElement;\r\n\t\tthis.animation = options.animation || null;\r\n\t\tthis.animationPaused = false;\r\n\t\tthis.animationTime = 0;\r\n\t\tthis.disposed = false;\r\n\r\n\t\t// texture\r\n\t\tthis.skinImg = new Image();\r\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\r\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\r\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.capeImg = new Image();\r\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\r\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\r\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\r\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\r\n\r\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\r\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\r\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\r\n\r\n\t\t// scene\r\n\t\tthis.scene = new THREE.Scene();\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\r\n\t\tthis.camera.position.y = -12;\r\n\t\tthis.camera.position.z = 30;\r\n\r\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\r\n\t\tthis.renderer.setSize(300, 300); // default size\r\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\r\n\t\tthis.domElement.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\r\n\t\tthis.scene.add(this.playerObject);\r\n\r\n\t\t// texture loading\r\n\t\tthis.skinImg.crossOrigin = \"\";\r\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\r\n\t\tthis.skinImg.onload = () => {\r\n\t\t\tlet isOldFormat = false;\r\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\r\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\r\n\t\t\t\t\tisOldFormat = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\"Bad skin size\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\r\n\t\t\tif (isOldFormat) {\r\n\t\t\t\tlet width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.width = width;\r\n\t\t\t\tthis.skinCanvas.height = width;\r\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\r\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\r\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\r\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\r\n\t\t\t}\r\n\r\n\t\t\tthis.skinTexture.needsUpdate = true;\r\n\t\t\tthis.layer1Material.needsUpdate = true;\r\n\t\t\tthis.layer2Material.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.skin.visible = true;\r\n\t\t};\r\n\r\n\t\tthis.capeImg.crossOrigin = \"\";\r\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\r\n\t\tthis.capeImg.onload = () => {\r\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\r\n\t\t\t\tconsole.error(\"Bad cape size\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\r\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\r\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\r\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\r\n\r\n\t\t\tthis.capeTexture.needsUpdate = true;\r\n\t\t\tthis.capeMaterial.needsUpdate = true;\r\n\r\n\t\t\tthis.playerObject.cape.visible = true;\r\n\t\t};\r\n\r\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\r\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\r\n\t\tif (options.width) this.width = options.width;\r\n\t\tif (options.height) this.height = options.height;\r\n\r\n\t\tlet draw = () => {\r\n\t\t\tif (this.disposed) return;\r\n\t\t\twindow.requestAnimationFrame(draw);\r\n\t\t\tif (!this.animationPaused) {\r\n\t\t\t\tthis.animationTime++;\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\t\tdraw();\r\n\t}\r\n\r\n\tsetSize(width, height) {\r\n\t\tthis.camera.aspect = width / height;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.disposed = true;\r\n\t\tthis.domElement.removeChild(this.renderer.domElement);\r\n\t\tthis.renderer.dispose();\r\n\t\tthis.skinTexture.dispose();\r\n\t\tthis.capeTexture.dispose();\r\n\t}\r\n\r\n\tget skinUrl() {\r\n\t\treturn this.skinImg.src;\r\n\t}\r\n\r\n\tset skinUrl(url) {\r\n\t\tthis.skinImg.src = url;\r\n\t}\r\n\r\n\tget capeUrl() {\r\n\t\treturn this.capeImg.src;\r\n\t}\r\n\r\n\tset capeUrl(url) {\r\n\t\tthis.capeImg.src = url;\r\n\t}\r\n\r\n\tget width() {\r\n\t\treturn this.renderer.getSize().width;\r\n\t}\r\n\r\n\tset width(newWidth) {\r\n\t\tthis.setSize(newWidth, this.height);\r\n\t}\r\n\r\n\tget height() {\r\n\t\treturn this.renderer.getSize().height;\r\n\t}\r\n\r\n\tset height(newHeight) {\r\n\t\tthis.setSize(this.width, newHeight);\r\n\t}\r\n}\r\n\r\nclass SkinControl {\r\n\tconstructor(skinViewer) {\r\n\t\tthis.enableAnimationControl = true;\r\n\t\tthis.skinViewer = skinViewer;\r\n\r\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\r\n\t\tthis.orbitControls.enablePan = false;\r\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\r\n\t\tthis.orbitControls.minDistance = 10;\r\n\t\tthis.orbitControls.maxDistance = 256;\r\n\t\tthis.orbitControls.update();\r\n\r\n\t\tthis.animationPauseListener = e => {\r\n\t\t\tif (this.enableAnimationControl) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\r\n\t\tthis.orbitControls.dispose();\r\n\t}\r\n}\r\n\r\nexport { SkinViewer, SkinControl };\r\n","/**\r\n * @license\r\n * skinview3d \r\n *\r\n * Copyright (C) 2017 the original author or authors\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n *\r\n * @author yushijinhun \r\n * @author Hacksore \r\n * @author Kent Rasmussen \r\n */\r\n\r\nexport { SkinObject, CapeObject, PlayerObject } from \"./model\";\r\nexport { SkinViewer, SkinControl } from \"./viewer\";\r\nexport { CompositeAnimation, WalkAnimation } from \"./animation\";\r\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","PlayerObject","slim","skin","visible","rotation","Math","PI","OrbitControls","object","domElement","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","copy","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","STATE","NONE","offset","quat","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","sub","applyQuaternion","setFromVector3","state","getAutoRotationAngle","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","rotateLeft","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","warn","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","event","clientX","clientY","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","dx","dy","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","button","preventDefault","addEventListener","stopPropagation","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","WalkAnimation","angleRot","cos","copyImage","context","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","convertSkinTo1_8","width","copySkin","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","alpha","antialias","setSize","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","console","error","src","onload","isOldFormat","height","skinContext","getContext","clearRect","drawImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"skinview3d.module.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js","../src/skinview3d.js"],"sourcesContent":["import * as THREE from \"three\";\n\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\n\treturn [\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\n\t];\n}\n\nfunction toSkinVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\n}\n\nfunction toCapeVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\n}\n\nfunction addVertices(box, top, bottom, left, front, right, back) {\n\tbox.faceVertexUvs[0] = [];\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\n}\n\nconst esp = 0.002;\n\nclass SkinObject extends THREE.Group {\n\tconstructor(isSlim, layer1Material, layer2Material) {\n\t\tsuper();\n\n\t\t// Head\n\t\tthis.head = new THREE.Group();\n\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\n\t\taddVertices(headBox,\n\t\t\ttoSkinVertices(8, 0, 16, 8),\n\t\t\ttoSkinVertices(16, 0, 24, 8),\n\t\t\ttoSkinVertices(0, 8, 8, 16),\n\t\t\ttoSkinVertices(8, 8, 16, 16),\n\t\t\ttoSkinVertices(16, 8, 24, 16),\n\t\t\ttoSkinVertices(24, 8, 32, 16)\n\t\t);\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\n\t\tthis.head.add(headMesh);\n\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\n\t\taddVertices(head2Box,\n\t\t\ttoSkinVertices(40, 0, 48, 8),\n\t\t\ttoSkinVertices(48, 0, 56, 8),\n\t\t\ttoSkinVertices(32, 8, 40, 16),\n\t\t\ttoSkinVertices(40, 8, 48, 16),\n\t\t\ttoSkinVertices(48, 8, 56, 16),\n\t\t\ttoSkinVertices(56, 8, 64, 16)\n\t\t);\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\n\t\thead2Mesh.renderOrder = -1;\n\t\tthis.head.add(head2Mesh);\n\n\t\tthis.add(this.head);\n\n\n\t\t// Body\n\t\tthis.body = new THREE.Group();\n\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\n\t\taddVertices(bodyBox,\n\t\t\ttoSkinVertices(20, 16, 28, 20),\n\t\t\ttoSkinVertices(28, 16, 36, 20),\n\t\t\ttoSkinVertices(16, 20, 20, 32),\n\t\t\ttoSkinVertices(20, 20, 28, 32),\n\t\t\ttoSkinVertices(28, 20, 32, 32),\n\t\t\ttoSkinVertices(32, 20, 40, 32)\n\t\t);\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\n\t\tthis.body.add(bodyMesh);\n\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\n\t\taddVertices(body2Box,\n\t\t\ttoSkinVertices(20, 32, 28, 36),\n\t\t\ttoSkinVertices(28, 32, 36, 36),\n\t\t\ttoSkinVertices(16, 36, 20, 48),\n\t\t\ttoSkinVertices(20, 36, 28, 48),\n\t\t\ttoSkinVertices(28, 36, 32, 48),\n\t\t\ttoSkinVertices(32, 36, 40, 48)\n\t\t);\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\n\t\tthis.body.add(body2Mesh);\n\n\t\tthis.body.position.y = -10;\n\t\tthis.add(this.body);\n\n\n\t\t// Right Arm\n\t\tthis.rightArm = new THREE.Group();\n\t\tlet rightArmPivot = new THREE.Group();\n\n\t\tlet rightArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\n\t\t\t);\n\t\t}\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\n\t\trightArmPivot.add(rightArmMesh);\n\n\t\tlet rightArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\n\t\t\t);\n\t\t}\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\n\t\trightArm2Mesh.renderOrder = 1;\n\t\trightArmPivot.add(rightArm2Mesh);\n\n\t\trightArmPivot.position.y = -6;\n\t\tthis.rightArm.add(rightArmPivot);\n\t\tthis.rightArm.position.y = -4;\n\t\tthis.rightArm.position.x = isSlim ? -5.5 : -6;\n\t\tthis.add(this.rightArm);\n\n\n\t\t// Left Arm\n\t\tthis.leftArm = new THREE.Group();\n\t\tlet leftArmPivot = new THREE.Group();\n\n\t\tlet leftArmBox = new THREE.BoxGeometry((isSlim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\n\t\tleftArmPivot.add(leftArmMesh);\n\n\t\tlet leftArm2Box = new THREE.BoxGeometry((isSlim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (isSlim) {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\n\t\tleftArm2Mesh.renderOrder = 1;\n\t\tleftArmPivot.add(leftArm2Mesh);\n\n\t\tleftArmPivot.position.y = -6;\n\t\tthis.leftArm.add(leftArmPivot);\n\t\tthis.leftArm.position.y = -4;\n\t\tthis.leftArm.position.x = isSlim ? 5.5 : 6;\n\t\tthis.add(this.leftArm);\n\n\n\t\t// Right Leg\n\t\tthis.rightLeg = new THREE.Group();\n\t\tlet rightLegPivot = new THREE.Group();\n\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(rightLegBox,\n\t\t\ttoSkinVertices(4, 16, 8, 20),\n\t\t\ttoSkinVertices(8, 16, 12, 20),\n\t\t\ttoSkinVertices(0, 20, 4, 32),\n\t\t\ttoSkinVertices(4, 20, 8, 32),\n\t\t\ttoSkinVertices(8, 20, 12, 32),\n\t\t\ttoSkinVertices(12, 20, 16, 32)\n\t\t);\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\n\t\trightLegPivot.add(rightLegMesh);\n\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(rightLeg2Box,\n\t\t\ttoSkinVertices(4, 32, 8, 36),\n\t\t\ttoSkinVertices(8, 32, 12, 36),\n\t\t\ttoSkinVertices(0, 36, 4, 48),\n\t\t\ttoSkinVertices(4, 36, 8, 48),\n\t\t\ttoSkinVertices(8, 36, 12, 48),\n\t\t\ttoSkinVertices(12, 36, 16, 48)\n\t\t);\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\n\t\trightLeg2Mesh.renderOrder = 1;\n\t\trightLegPivot.add(rightLeg2Mesh);\n\n\t\trightLegPivot.position.y = -6;\n\t\tthis.rightLeg.add(rightLegPivot);\n\t\tthis.rightLeg.position.y = -16;\n\t\tthis.rightLeg.position.x = -2;\n\t\tthis.add(this.rightLeg);\n\n\t\t// Left Leg\n\t\tthis.leftLeg = new THREE.Group();\n\t\tlet leftLegPivot = new THREE.Group();\n\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(leftLegBox,\n\t\t\ttoSkinVertices(20, 48, 24, 52),\n\t\t\ttoSkinVertices(24, 48, 28, 52),\n\t\t\ttoSkinVertices(16, 52, 20, 64),\n\t\t\ttoSkinVertices(20, 52, 24, 64),\n\t\t\ttoSkinVertices(24, 52, 28, 64),\n\t\t\ttoSkinVertices(28, 52, 32, 64)\n\t\t);\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\n\t\tleftLegPivot.add(leftLegMesh);\n\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(leftLeg2Box,\n\t\t\ttoSkinVertices(4, 48, 8, 52),\n\t\t\ttoSkinVertices(8, 48, 12, 52),\n\t\t\ttoSkinVertices(0, 52, 4, 64),\n\t\t\ttoSkinVertices(4, 52, 8, 64),\n\t\t\ttoSkinVertices(8, 52, 12, 64),\n\t\t\ttoSkinVertices(12, 52, 16, 64)\n\t\t);\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\n\t\tleftLeg2Mesh.renderOrder = 1;\n\t\tleftLegPivot.add(leftLeg2Mesh);\n\n\t\tleftLegPivot.position.y = -6;\n\t\tthis.leftLeg.add(leftLegPivot);\n\t\tthis.leftLeg.position.y = -16;\n\t\tthis.leftLeg.position.x = 2;\n\t\tthis.add(this.leftLeg);\n\t}\n}\n\nclass CapeObject extends THREE.Group {\n\tconstructor(capeMaterial) {\n\t\tsuper();\n\n\t\t// back = outside\n\t\t// front = inside\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\n\t\taddVertices(capeBox,\n\t\t\ttoCapeVertices(1, 0, 11, 1),\n\t\t\ttoCapeVertices(11, 0, 21, 1),\n\t\t\ttoCapeVertices(11, 1, 12, 17),\n\t\t\ttoCapeVertices(12, 1, 22, 17),\n\t\t\ttoCapeVertices(0, 1, 1, 17),\n\t\t\ttoCapeVertices(1, 1, 11, 17)\n\t\t);\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\n\t\tthis.cape.position.y = -8;\n\t\tthis.cape.position.z = -0.5;\n\t\tthis.add(this.cape);\n\t}\n}\n\nclass PlayerObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\n\t\tsuper();\n\n\t\tthis.slim = slim;\n\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\n\t\tthis.skin.visible = false;\n\t\tthis.add(this.skin);\n\n\t\tthis.cape = new CapeObject(capeMaterial);\n\t\tthis.cape.position.z = -2;\n\t\tthis.cape.position.y = -4;\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\n\t\tthis.cape.visible = false;\n\t\tthis.add(this.cape);\n\t}\n}\n\nexport { SkinObject, CapeObject, PlayerObject };\n","import * as THREE from \"three\";\n\nclass OrbitControls extends THREE.EventDispatcher {\n\t/**\n\t * @preserve\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\n\t */\n\t/**\n\t * @license\n\t * Copyright (C) 2010-2017 three.js authors\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t *\n\t *\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\n\n\tconstructor(object, domElement) {\n\t\tsuper();\n\t\tthis.object = object;\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out (OrthographicCamera only)\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\t\tthis.getPolarAngle = function () {\n\t\t\treturn spherical.phi;\n\t\t};\n\t\tthis.getAzimuthalAngle = function () {\n\t\t\treturn spherical.theta;\n\t\t};\n\t\tthis.saveState = function () {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t\tscope.zoom0 = scope.object.zoom;\n\t\t};\n\t\tthis.reset = function () {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\tscope.update();\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\t// so camera.up is the orbit axis\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\n\t\t\tlet quatInverse = quat.clone().inverse();\n\t\t\tlet lastPosition = new THREE.Vector3();\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\n\t\t\treturn function update() {\n\t\t\t\tlet position = scope.object.position;\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\t\t\t\tspherical.makeSafe();\n\t\t\t\tspherical.radius *= scale;\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\t\t\toffset.setFromSpherical(spherical);\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\t\t\tif (zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}();\n\t\tthis.dispose = function () {\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\n\t\t};\n\t\t//\n\t\t// internals\n\t\t//\n\t\tlet scope = this;\n\t\tlet changeEvent = { type: \"change\" };\n\t\tlet startEvent = { type: \"start\" };\n\t\tlet endEvent = { type: \"end\" };\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\tlet state = STATE.NONE;\n\t\tlet EPS = 0.000001;\n\t\t// current position in spherical coordinates\n\t\tlet spherical = new THREE.Spherical();\n\t\tlet sphericalDelta = new THREE.Spherical();\n\t\tlet scale = 1;\n\t\tlet panOffset = new THREE.Vector3();\n\t\tlet zoomChanged = false;\n\t\tlet rotateStart = new THREE.Vector2();\n\t\tlet rotateEnd = new THREE.Vector2();\n\t\tlet rotateDelta = new THREE.Vector2();\n\t\tlet panStart = new THREE.Vector2();\n\t\tlet panEnd = new THREE.Vector2();\n\t\tlet panDelta = new THREE.Vector2();\n\t\tlet dollyStart = new THREE.Vector2();\n\t\tlet dollyEnd = new THREE.Vector2();\n\t\tlet dollyDelta = new THREE.Vector2();\n\t\tfunction getAutoRotationAngle() {\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\tfunction getZoomScale() {\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\t\tlet panLeft = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\tlet panUp = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar(distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tlet pan = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\t\t// perspective\n\t\t\t\t\tlet position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tlet targetDistance = offset.length();\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t}();\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale /= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale *= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseUp(event) {\n\t\t}\n\t\tfunction handleMouseWheel(event) {\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (event.deltaY > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleKeyDown(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfunction handleTouchStartRotate(event) {\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchStartDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\tfunction handleTouchStartPan(event) {\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyEnd.set(0, distance);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchEnd(event) {\n\t\t}\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\tfunction onMouseDown(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.button) {\n\t\t\t\tcase scope.mouseButtons.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownRotate(event);\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.ZOOM:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownDolly(event);\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownPan(event);\n\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onMouseMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tfunction onMouseUp(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleMouseUp(event);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\thandleMouseWheel(event);\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\tfunction onTouchStart(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartPan(event);\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onTouchMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\tfunction onTouchEnd(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleTouchEnd(event);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t}\n\t\t//\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\n\t\t// force an update at start\n\t\tthis.update();\n\t}\n}\n\nexport { OrbitControls };\n","function invokeAnimation(animation, player, time) {\n\tif (animation instanceof CompositeAnimation) {\n\t\tanimation.play(player, time);\n\t} else if (animation instanceof Function) {\n\t\tanimation(player, time);\n\t} else {\n\t\tthrow `Not an animation: ${animation}`;\n\t}\n}\n\nclass AnimationHandle {\n\tconstructor(animation) {\n\t\tthis.animation = animation;\n\t\tthis.paused = this._paused = false;\n\t\tthis.speed = this._speed = 1.0;\n\t\tthis._lastChange = null;\n\t\tthis._lastChangeX = null;\n\t}\n\tplay(player, time) {\n\t\tif (this._lastChange === null) {\n\t\t\tthis._lastChange = time;\n\t\t\tthis._lastChangeX = 0;\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tif (this._paused === false) {\n\t\t\t\tthis._lastChangeX += dt * this._speed;\n\t\t\t}\n\t\t\tthis._paused = this.paused;\n\t\t\tthis._speed = this.speed;\n\t\t\tthis._lastChange = time;\n\t\t}\n\t\tif (this.paused === false) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tlet x = this._lastChangeX + this.speed * dt;\n\t\t\tinvokeAnimation(this.animation, player, x);\n\t\t}\n\t}\n\treset(){\n\t\tthis._lastChange = null;\n\t}\n}\n\nclass CompositeAnimation {\n\tconstructor() {\n\t\tthis.handles = new Set();\n\t}\n\tadd(animation) {\n\t\tlet handle = new AnimationHandle(animation);\n\t\thandle.remove = () => this.handles.delete(handle);\n\t\tthis.handles.add(handle);\n\t\treturn handle;\n\t}\n\tplay(player, time) {\n\t\tthis.handles.forEach(handle => handle.play(player, time));\n\t}\n}\n\nlet WalkAnimation = (player, time) => {\n\tlet skin = player.skin;\n\tlet angleRot = time + Math.PI / 2;\n\n\t// Leg Swing\n\tskin.leftLeg.rotation.x = Math.cos(angleRot);\n\tskin.rightLeg.rotation.x = Math.cos(angleRot + (Math.PI));\n\n\t// Arm Swing\n\tskin.leftArm.rotation.x = Math.cos(angleRot + (Math.PI));\n\tskin.rightArm.rotation.x = Math.cos(angleRot);\n};\n\nexport { CompositeAnimation, WalkAnimation, invokeAnimation };\n","import * as THREE from \"three\";\nimport { PlayerObject } from \"./model\";\nimport { OrbitControls } from \"./orbit_controls\";\nimport { invokeAnimation } from \"./animation\";\n\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\n\tlet imgData = context.getImageData(sX, sY, w, h);\n\tif (flipHorizontal) {\n\t\tfor (let y = 0; y < h; y++) {\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\n\t\t\t\tlet index = (x + y * w) * 4;\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\n\t\t\t\tlet pA1 = imgData.data[index];\n\t\t\t\tlet pA2 = imgData.data[index + 1];\n\t\t\t\tlet pA3 = imgData.data[index + 2];\n\t\t\t\tlet pA4 = imgData.data[index + 3];\n\n\t\t\t\tlet pB1 = imgData.data[index2];\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\n\n\t\t\t\timgData.data[index] = pB1;\n\t\t\t\timgData.data[index + 1] = pB2;\n\t\t\t\timgData.data[index + 2] = pB3;\n\t\t\t\timgData.data[index + 3] = pB4;\n\n\t\t\t\timgData.data[index2] = pA1;\n\t\t\t\timgData.data[index2 + 1] = pA2;\n\t\t\t\timgData.data[index2 + 2] = pA3;\n\t\t\t\timgData.data[index2 + 3] = pA4;\n\t\t\t}\n\t\t}\n\t}\n\tcontext.putImageData(imgData, dX, dY);\n}\n\nfunction convertSkinTo1_8(context, width) {\n\tlet scale = width / 64.0;\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\n\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\n}\n\nclass SkinViewer {\n\tconstructor(options) {\n\t\tthis.domElement = options.domElement;\n\t\tthis.animation = options.animation || null;\n\t\tthis.animationPaused = false;\n\t\tthis.animationTime = 0;\n\t\tthis.disposed = false;\n\n\t\t// texture\n\t\tthis.skinImg = new Image();\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.capeImg = new Image();\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\n\n\t\t// scene\n\t\tthis.scene = new THREE.Scene();\n\n\t\tthis.camera = new THREE.PerspectiveCamera(75);\n\t\tthis.camera.position.y = -12;\n\t\tthis.camera.position.z = 30;\n\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\n\t\tthis.renderer.setSize(300, 300); // default size\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\n\t\tthis.domElement.appendChild(this.renderer.domElement);\n\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\n\t\tthis.scene.add(this.playerObject);\n\n\t\t// texture loading\n\t\tthis.skinImg.crossOrigin = \"\";\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\n\t\tthis.skinImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad skin size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.width = width;\n\t\t\t\tthis.skinCanvas.height = width;\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\n\t\t\t} else {\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t}\n\n\t\t\tthis.skinTexture.needsUpdate = true;\n\t\t\tthis.layer1Material.needsUpdate = true;\n\t\t\tthis.layer2Material.needsUpdate = true;\n\n\t\t\tthis.playerObject.skin.visible = true;\n\t\t};\n\n\t\tthis.capeImg.crossOrigin = \"\";\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\n\t\tthis.capeImg.onload = () => {\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\n\t\t\t\tconsole.error(\"Bad cape size\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.capeCanvas.width = this.capeImg.width;\n\t\t\tthis.capeCanvas.height = this.capeImg.height;\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\n\t\t\tthis.capeTexture.needsUpdate = true;\n\t\t\tthis.capeMaterial.needsUpdate = true;\n\n\t\t\tthis.playerObject.cape.visible = true;\n\t\t};\n\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\n\t\tif (options.width) this.width = options.width;\n\t\tif (options.height) this.height = options.height;\n\n\t\tlet draw = () => {\n\t\t\tif (this.disposed) return;\n\t\t\twindow.requestAnimationFrame(draw);\n\t\t\tif (!this.animationPaused) {\n\t\t\t\tthis.animationTime++;\n\t\t\t\tif (this.animation) {\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t};\n\t\tdraw();\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.camera.aspect = width / height;\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.renderer.setSize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis.disposed = true;\n\t\tthis.domElement.removeChild(this.renderer.domElement);\n\t\tthis.renderer.dispose();\n\t\tthis.skinTexture.dispose();\n\t\tthis.capeTexture.dispose();\n\t}\n\n\tget skinUrl() {\n\t\treturn this.skinImg.src;\n\t}\n\n\tset skinUrl(url) {\n\t\tthis.skinImg.src = url;\n\t}\n\n\tget capeUrl() {\n\t\treturn this.capeImg.src;\n\t}\n\n\tset capeUrl(url) {\n\t\tthis.capeImg.src = url;\n\t}\n\n\tget width() {\n\t\treturn this.renderer.getSize().width;\n\t}\n\n\tset width(newWidth) {\n\t\tthis.setSize(newWidth, this.height);\n\t}\n\n\tget height() {\n\t\treturn this.renderer.getSize().height;\n\t}\n\n\tset height(newHeight) {\n\t\tthis.setSize(this.width, newHeight);\n\t}\n}\n\nclass SkinControl {\n\tconstructor(skinViewer) {\n\t\tthis.enableAnimationControl = true;\n\t\tthis.skinViewer = skinViewer;\n\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\n\t\tthis.orbitControls.enablePan = false;\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\n\t\tthis.orbitControls.minDistance = 10;\n\t\tthis.orbitControls.maxDistance = 256;\n\t\tthis.orbitControls.update();\n\n\t\tthis.animationPauseListener = e => {\n\t\t\tif (this.enableAnimationControl) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.skinViewer.animationPaused = !this.skinViewer.animationPaused;\n\t\t\t}\n\t\t};\n\t\tthis.skinViewer.domElement.addEventListener(\"contextmenu\", this.animationPauseListener, false);\n\t}\n\n\tdispose() {\n\t\tthis.skinViewer.domElement.removeEventListener(\"contextmenu\", this.animationPauseListener, false);\n\t\tthis.orbitControls.dispose();\n\t}\n}\n\nexport { SkinViewer, SkinControl };\n","/**\n * @license\n * skinview3d \n *\n * Copyright (C) 2017 the original author or authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n *\n * @author yushijinhun \n * @author Hacksore \n * @author Kent Rasmussen \n */\n\nexport { SkinObject, CapeObject, PlayerObject } from \"./model\";\nexport { SkinViewer, SkinControl } from \"./viewer\";\nexport { CompositeAnimation, WalkAnimation } from \"./animation\";\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","isSlim","layer1Material","layer2Material","head","headBox","headMesh","add","head2Box","head2Mesh","renderOrder","body","bodyBox","bodyMesh","body2Box","body2Mesh","position","y","rightArm","rightArmPivot","rightArmBox","rightArmMesh","rightArm2Box","rightArm2Mesh","x","leftArm","leftArmPivot","leftArmBox","leftArmMesh","leftArm2Box","leftArm2Mesh","rightLeg","rightLegPivot","rightLegBox","rightLegMesh","rightLeg2Box","rightLeg2Mesh","leftLeg","leftLegPivot","leftLegBox","leftLegMesh","leftLeg2Box","leftLeg2Mesh","CapeObject","capeMaterial","capeBox","cape","z","PlayerObject","slim","skin","visible","rotation","Math","PI","OrbitControls","object","domElement","undefined","document","enabled","target","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","target0","clone","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","copy","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","update","STATE","NONE","offset","quat","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","sub","applyQuaternion","setFromVector3","state","getAutoRotationAngle","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","type","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","rotateLeft","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","multiplyScalar","panUp","pan","deltaX","deltaY","element","targetDistance","length","tan","fov","clientHeight","matrix","clientWidth","warn","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","event","clientX","clientY","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","dx","dy","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","button","preventDefault","addEventListener","stopPropagation","invokeAnimation","animation","player","time","CompositeAnimation","play","Function","AnimationHandle","paused","_paused","speed","_speed","_lastChange","_lastChangeX","dt","handles","Set","handle","remove","delete","forEach","WalkAnimation","angleRot","cos","copyImage","context","sX","sY","dX","dY","flipHorizontal","imgData","getImageData","index","index2","pA1","data","pA2","pA3","pA4","pB1","pB2","pB3","pB4","putImageData","convertSkinTo1_8","width","copySkin","SkinViewer","options","animationPaused","animationTime","disposed","skinImg","Image","skinCanvas","createElement","skinTexture","magFilter","minFilter","capeImg","capeCanvas","capeTexture","map","side","transparent","opacity","scene","camera","renderer","alpha","antialias","setSize","getShaderInfoLog","appendChild","playerObject","crossOrigin","onerror","console","error","src","onload","isOldFormat","height","skinContext","getContext","clearRect","drawImage","needsUpdate","capeContext","skinUrl","capeUrl","draw","requestAnimationFrame","render","aspect","removeChild","url","getSize","newWidth","newHeight","SkinControl","skinViewer","enableAnimationControl","orbitControls","animationPauseListener"],"mappings":"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"} \ No newline at end of file
+ skinview3d lets you display Minecraft charecters on the web with Three.js. +