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 0000000..a206b32
Binary files /dev/null and b/img/1_8_texturemap_redux.png differ
diff --git a/img/Hacksore.png b/img/Hacksore.png
new file mode 100644
index 0000000..72f254f
Binary files /dev/null and b/img/Hacksore.png differ
diff --git a/img/cape.png b/img/cape.png
new file mode 100644
index 0000000..01a8f65
Binary files /dev/null and b/img/cape.png differ
diff --git a/img/hatsune_miku.png b/img/hatsune_miku.png
new file mode 100644
index 0000000..d434946
Binary files /dev/null and b/img/hatsune_miku.png differ
diff --git a/img/ironman_hd.png b/img/ironman_hd.png
new file mode 100644
index 0000000..bae9374
Binary files /dev/null and b/img/ironman_hd.png differ
diff --git a/img/mojang_cape.png b/img/mojang_cape.png
new file mode 100644
index 0000000..deac5c5
Binary files /dev/null and b/img/mojang_cape.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..0df9496
--- /dev/null
+++ b/index.html
@@ -0,0 +1,68 @@
+
+
+
+
+ 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
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"
-});