diff --git a/js/skinview3d.js b/js/skinview3d.js deleted file mode 100644 index 4b91a54..0000000 --- a/js/skinview3d.js +++ /dev/null @@ -1,1334 +0,0 @@ -/** - * skinview3d (https://github.com/to2mbn/skinview3d) - * - * MIT License - * - * Original work Copyright (c) 2014-2018 Kent Rasmussen - * Modified work Copyright (c) 2017-2018 Haowei Wen, Sean Boult, Pig Fang and contributors - * - * 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. - */ - -(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(slim, layer1Material, layer2Material) { - classCallCheck(this, SkinObject); - - var _this = possibleConstructorReturn(this, (SkinObject.__proto__ || Object.getPrototypeOf(SkinObject)).call(this)); - - _this.slim = slim; - - // Head - _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((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); - if (slim) { - 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((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - if (slim) { - 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 = slim ? -5.5 : -6; - _this.add(_this.rightArm); - - // Left Arm - _this.leftArm = new THREE.Group(); - var leftArmPivot = new THREE.Group(); - - var leftArmBox = new THREE.BoxGeometry((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); - if (slim) { - 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((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - if (slim) { - 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 = slim ? 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.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; - this._animationNaturalSpeed = animation.naturalSpeed; - } - - 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 * this._animationNaturalSpeed * _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 WalkingAnimation = function WalkingAnimation(player, time) { - var skin = player.skin; - - // Leg swing - skin.leftLeg.rotation.x = Math.sin(time) * 0.3; - skin.rightLeg.rotation.x = Math.sin(time + Math.PI) * 0.3; - - // Arm swing - skin.leftArm.rotation.x = Math.sin(time + Math.PI) * 0.5; - skin.rightArm.rotation.x = Math.sin(time) * 0.5; - var basicArmRotationZ = Math.PI * 0.02; - skin.leftArm.rotation.z = Math.cos(time) * 0.03 + basicArmRotationZ; - skin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.03 - basicArmRotationZ; - - // Head shaking with different frequency & amplitude - skin.head.rotation.y = Math.sin(time / 2) * 0.2; - skin.head.rotation.x = Math.sin(time / 3) * 0.15; - - // Always add an angle for cape around the x axis - var basicCapeRotationX = Math.PI * 0.06; - player.cape.rotation.x = Math.sin(time / 1.5) * 0.06 + basicCapeRotationX; - }; - - WalkingAnimation.naturalSpeed = 5; - - var RunningAnimation = function RunningAnimation(player, time) { - var skin = player.skin; - - // Leg swing with larger amplitude - skin.leftLeg.rotation.x = Math.cos(time + Math.PI) * 1.3; - skin.rightLeg.rotation.x = Math.cos(time) * 1.3; - - // Arm swing - skin.leftArm.rotation.x = Math.cos(time) * 1.5; - skin.rightArm.rotation.x = Math.cos(time + Math.PI) * 1.5; - var basicArmRotationZ = Math.PI * 0.1; - skin.leftArm.rotation.z = Math.cos(time) * 0.1 + basicArmRotationZ; - skin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.1 - basicArmRotationZ; - - // Jumping - player.position.y = Math.cos(time * 2); - // Dodging when running - player.position.x = Math.cos(time) * 0.15; - // Slightly tilting when running - player.rotation.z = Math.cos(time + Math.PI) * 0.01; - - // Apply higher swing frequency, lower amplitude, - // and greater basic rotation around x axis, - // to cape when running. - var basicCapeRotationX = Math.PI * 0.3; - player.cape.rotation.x = Math.sin(time * 2) * 0.1 + basicCapeRotationX; - - // What about head shaking? - // You shouldn't glance right and left when running dude :P - }; - - RunningAnimation.naturalSpeed = 13; - - var RotatingAnimation = function RotatingAnimation(player, time) { - player.rotation.y = time; - }; - - RotatingAnimation.naturalSpeed = 1; - - 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(); - - // Use smaller fov to avoid distortion - this.camera = new THREE.PerspectiveCamera(40); - this.camera.position.y = -12; - this.camera.position.z = 60; - - 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 () { - var isOldFormat = false; - if (_this.capeImg.width !== 2 * _this.capeImg.height) { - if (_this.capeImg.width * 17 == _this.capeImg.height * 22) { - // width/height = 22/17 - isOldFormat = true; - } else { - console.error("Bad cape size"); - return; - } - } - - var capeContext = _this.capeCanvas.getContext("2d"); - if (isOldFormat) { - var width = _this.capeImg.width * 64 / 22; - _this.capeCanvas.width = width; - _this.capeCanvas.height = width / 2; - } else { - _this.capeCanvas.width = _this.capeImg.width; - _this.capeCanvas.height = _this.capeImg.height; - } - capeContext.clearRect(0, 0, _this.capeCanvas.width, _this.capeCanvas.height); - capeContext.drawImage(_this.capeImg, 0, 0, _this.capeImg.width, _this.capeImg.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 MouseControl = function () { - function MouseControl(skinViewer) { - classCallCheck(this, MouseControl); - - 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(); - } - - createClass(MouseControl, [{ - key: "dispose", - value: function dispose() { - this.orbitControls.dispose(); - } - }, { - key: "rotation", - get: function get$$1() { - return this.orbitControls.enableRotate; - }, - set: function set$$1(value) { - this.orbitControls.enableRotate = value; - } - }, { - key: "zoom", - get: function get$$1() { - return this.orbitControls.enableZoom; - }, - set: function set$$1(value) { - this.orbitControls.enableZoom = value; - } - }, { - key: "pan", - get: function get$$1() { - return this.orbitControls.enablePan; - }, - set: function set$$1(value) { - this.orbitControls.enablePan = value; - } - }]); - return MouseControl; - }(); - - exports.SkinObject = SkinObject; - exports.CapeObject = CapeObject; - exports.PlayerObject = PlayerObject; - exports.SkinViewer = SkinViewer; - exports.MouseControl = MouseControl; - exports.invokeAnimation = invokeAnimation; - exports.CompositeAnimation = CompositeAnimation; - exports.WalkingAnimation = WalkingAnimation; - exports.RunningAnimation = RunningAnimation; - exports.RotatingAnimation = RotatingAnimation; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -//# sourceMappingURL=skinview3d.js.map diff --git a/js/skinview3d.js.map b/js/skinview3d.js.map deleted file mode 100644 index ec36c4e..0000000 --- a/js/skinview3d.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"skinview3d.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js"],"sourcesContent":["import * as THREE from \"three\";\n\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\n\treturn [\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\n\t];\n}\n\nfunction toSkinVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\n}\n\nfunction toCapeVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\n}\n\nfunction addVertices(box, top, bottom, left, front, right, back) {\n\tbox.faceVertexUvs[0] = [];\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\n}\n\nconst esp = 0.002;\n\nclass SkinObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material) {\n\t\tsuper();\n\n\t\tthis.slim = slim;\n\n\t\t// Head\n\t\tthis.head = new THREE.Group();\n\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\n\t\taddVertices(headBox,\n\t\t\ttoSkinVertices(8, 0, 16, 8),\n\t\t\ttoSkinVertices(16, 0, 24, 8),\n\t\t\ttoSkinVertices(0, 8, 8, 16),\n\t\t\ttoSkinVertices(8, 8, 16, 16),\n\t\t\ttoSkinVertices(16, 8, 24, 16),\n\t\t\ttoSkinVertices(24, 8, 32, 16)\n\t\t);\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\n\t\tthis.head.add(headMesh);\n\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\n\t\taddVertices(head2Box,\n\t\t\ttoSkinVertices(40, 0, 48, 8),\n\t\t\ttoSkinVertices(48, 0, 56, 8),\n\t\t\ttoSkinVertices(32, 8, 40, 16),\n\t\t\ttoSkinVertices(40, 8, 48, 16),\n\t\t\ttoSkinVertices(48, 8, 56, 16),\n\t\t\ttoSkinVertices(56, 8, 64, 16)\n\t\t);\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\n\t\thead2Mesh.renderOrder = -1;\n\t\tthis.head.add(head2Mesh);\n\n\t\tthis.add(this.head);\n\n\n\t\t// Body\n\t\tthis.body = new THREE.Group();\n\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\n\t\taddVertices(bodyBox,\n\t\t\ttoSkinVertices(20, 16, 28, 20),\n\t\t\ttoSkinVertices(28, 16, 36, 20),\n\t\t\ttoSkinVertices(16, 20, 20, 32),\n\t\t\ttoSkinVertices(20, 20, 28, 32),\n\t\t\ttoSkinVertices(28, 20, 32, 32),\n\t\t\ttoSkinVertices(32, 20, 40, 32)\n\t\t);\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\n\t\tthis.body.add(bodyMesh);\n\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\n\t\taddVertices(body2Box,\n\t\t\ttoSkinVertices(20, 32, 28, 36),\n\t\t\ttoSkinVertices(28, 32, 36, 36),\n\t\t\ttoSkinVertices(16, 36, 20, 48),\n\t\t\ttoSkinVertices(20, 36, 28, 48),\n\t\t\ttoSkinVertices(28, 36, 32, 48),\n\t\t\ttoSkinVertices(32, 36, 40, 48)\n\t\t);\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\n\t\tthis.body.add(body2Mesh);\n\n\t\tthis.body.position.y = -10;\n\t\tthis.add(this.body);\n\n\n\t\t// Right Arm\n\t\tthis.rightArm = new THREE.Group();\n\t\tlet rightArmPivot = new THREE.Group();\n\n\t\tlet rightArmBox = new THREE.BoxGeometry((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\n\t\t\t);\n\t\t}\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\n\t\trightArmPivot.add(rightArmMesh);\n\n\t\tlet rightArm2Box = new THREE.BoxGeometry((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\n\t\t\t);\n\t\t}\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\n\t\trightArm2Mesh.renderOrder = 1;\n\t\trightArmPivot.add(rightArm2Mesh);\n\n\t\trightArmPivot.position.y = -6;\n\t\tthis.rightArm.add(rightArmPivot);\n\t\tthis.rightArm.position.y = -4;\n\t\tthis.rightArm.position.x = slim ? -5.5 : -6;\n\t\tthis.add(this.rightArm);\n\n\n\t\t// Left Arm\n\t\tthis.leftArm = new THREE.Group();\n\t\tlet leftArmPivot = new THREE.Group();\n\n\t\tlet leftArmBox = new THREE.BoxGeometry((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\n\t\tleftArmPivot.add(leftArmMesh);\n\n\t\tlet leftArm2Box = new THREE.BoxGeometry((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\n\t\tleftArm2Mesh.renderOrder = 1;\n\t\tleftArmPivot.add(leftArm2Mesh);\n\n\t\tleftArmPivot.position.y = -6;\n\t\tthis.leftArm.add(leftArmPivot);\n\t\tthis.leftArm.position.y = -4;\n\t\tthis.leftArm.position.x = slim ? 5.5 : 6;\n\t\tthis.add(this.leftArm);\n\n\n\t\t// Right Leg\n\t\tthis.rightLeg = new THREE.Group();\n\t\tlet rightLegPivot = new THREE.Group();\n\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(rightLegBox,\n\t\t\ttoSkinVertices(4, 16, 8, 20),\n\t\t\ttoSkinVertices(8, 16, 12, 20),\n\t\t\ttoSkinVertices(0, 20, 4, 32),\n\t\t\ttoSkinVertices(4, 20, 8, 32),\n\t\t\ttoSkinVertices(8, 20, 12, 32),\n\t\t\ttoSkinVertices(12, 20, 16, 32)\n\t\t);\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\n\t\trightLegPivot.add(rightLegMesh);\n\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(rightLeg2Box,\n\t\t\ttoSkinVertices(4, 32, 8, 36),\n\t\t\ttoSkinVertices(8, 32, 12, 36),\n\t\t\ttoSkinVertices(0, 36, 4, 48),\n\t\t\ttoSkinVertices(4, 36, 8, 48),\n\t\t\ttoSkinVertices(8, 36, 12, 48),\n\t\t\ttoSkinVertices(12, 36, 16, 48)\n\t\t);\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\n\t\trightLeg2Mesh.renderOrder = 1;\n\t\trightLegPivot.add(rightLeg2Mesh);\n\n\t\trightLegPivot.position.y = -6;\n\t\tthis.rightLeg.add(rightLegPivot);\n\t\tthis.rightLeg.position.y = -16;\n\t\tthis.rightLeg.position.x = -2;\n\t\tthis.add(this.rightLeg);\n\n\t\t// Left Leg\n\t\tthis.leftLeg = new THREE.Group();\n\t\tlet leftLegPivot = new THREE.Group();\n\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(leftLegBox,\n\t\t\ttoSkinVertices(20, 48, 24, 52),\n\t\t\ttoSkinVertices(24, 48, 28, 52),\n\t\t\ttoSkinVertices(16, 52, 20, 64),\n\t\t\ttoSkinVertices(20, 52, 24, 64),\n\t\t\ttoSkinVertices(24, 52, 28, 64),\n\t\t\ttoSkinVertices(28, 52, 32, 64)\n\t\t);\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\n\t\tleftLegPivot.add(leftLegMesh);\n\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(leftLeg2Box,\n\t\t\ttoSkinVertices(4, 48, 8, 52),\n\t\t\ttoSkinVertices(8, 48, 12, 52),\n\t\t\ttoSkinVertices(0, 52, 4, 64),\n\t\t\ttoSkinVertices(4, 52, 8, 64),\n\t\t\ttoSkinVertices(8, 52, 12, 64),\n\t\t\ttoSkinVertices(12, 52, 16, 64)\n\t\t);\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\n\t\tleftLeg2Mesh.renderOrder = 1;\n\t\tleftLegPivot.add(leftLeg2Mesh);\n\n\t\tleftLegPivot.position.y = -6;\n\t\tthis.leftLeg.add(leftLegPivot);\n\t\tthis.leftLeg.position.y = -16;\n\t\tthis.leftLeg.position.x = 2;\n\t\tthis.add(this.leftLeg);\n\t}\n}\n\nclass CapeObject extends THREE.Group {\n\tconstructor(capeMaterial) {\n\t\tsuper();\n\n\t\t// back = outside\n\t\t// front = inside\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\n\t\taddVertices(capeBox,\n\t\t\ttoCapeVertices(1, 0, 11, 1),\n\t\t\ttoCapeVertices(11, 0, 21, 1),\n\t\t\ttoCapeVertices(11, 1, 12, 17),\n\t\t\ttoCapeVertices(12, 1, 22, 17),\n\t\t\ttoCapeVertices(0, 1, 1, 17),\n\t\t\ttoCapeVertices(1, 1, 11, 17)\n\t\t);\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\n\t\tthis.cape.position.y = -8;\n\t\tthis.cape.position.z = -0.5;\n\t\tthis.add(this.cape);\n\t}\n}\n\nclass PlayerObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\n\t\tsuper();\n\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\n\t\tthis.skin.visible = false;\n\t\tthis.add(this.skin);\n\n\t\tthis.cape = new CapeObject(capeMaterial);\n\t\tthis.cape.position.z = -2;\n\t\tthis.cape.position.y = -4;\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\n\t\tthis.cape.visible = false;\n\t\tthis.add(this.cape);\n\t}\n}\n\nexport { SkinObject, CapeObject, PlayerObject };\n","import * as THREE from \"three\";\n\nclass OrbitControls extends THREE.EventDispatcher {\n\t/**\n\t * @preserve\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\n\t */\n\t/**\n\t * @license\n\t * Copyright (C) 2010-2017 three.js authors\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t *\n\t *\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\n\n\tconstructor(object, domElement) {\n\t\tsuper();\n\t\tthis.object = object;\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out (OrthographicCamera only)\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\t\tthis.getPolarAngle = function () {\n\t\t\treturn spherical.phi;\n\t\t};\n\t\tthis.getAzimuthalAngle = function () {\n\t\t\treturn spherical.theta;\n\t\t};\n\t\tthis.saveState = function () {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t\tscope.zoom0 = scope.object.zoom;\n\t\t};\n\t\tthis.reset = function () {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\tscope.update();\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\t// so camera.up is the orbit axis\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\n\t\t\tlet quatInverse = quat.clone().inverse();\n\t\t\tlet lastPosition = new THREE.Vector3();\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\n\t\t\treturn function update() {\n\t\t\t\tlet position = scope.object.position;\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\t\t\t\tspherical.makeSafe();\n\t\t\t\tspherical.radius *= scale;\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\t\t\toffset.setFromSpherical(spherical);\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\t\t\tif (zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}();\n\t\tthis.dispose = function () {\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\n\t\t};\n\t\t//\n\t\t// internals\n\t\t//\n\t\tlet scope = this;\n\t\tlet changeEvent = { type: \"change\" };\n\t\tlet startEvent = { type: \"start\" };\n\t\tlet endEvent = { type: \"end\" };\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\tlet state = STATE.NONE;\n\t\tlet EPS = 0.000001;\n\t\t// current position in spherical coordinates\n\t\tlet spherical = new THREE.Spherical();\n\t\tlet sphericalDelta = new THREE.Spherical();\n\t\tlet scale = 1;\n\t\tlet panOffset = new THREE.Vector3();\n\t\tlet zoomChanged = false;\n\t\tlet rotateStart = new THREE.Vector2();\n\t\tlet rotateEnd = new THREE.Vector2();\n\t\tlet rotateDelta = new THREE.Vector2();\n\t\tlet panStart = new THREE.Vector2();\n\t\tlet panEnd = new THREE.Vector2();\n\t\tlet panDelta = new THREE.Vector2();\n\t\tlet dollyStart = new THREE.Vector2();\n\t\tlet dollyEnd = new THREE.Vector2();\n\t\tlet dollyDelta = new THREE.Vector2();\n\t\tfunction getAutoRotationAngle() {\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\tfunction getZoomScale() {\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\t\tlet panLeft = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\tlet panUp = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar(distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tlet pan = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\t\t// perspective\n\t\t\t\t\tlet position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tlet targetDistance = offset.length();\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t}();\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale /= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale *= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseUp(event) {\n\t\t}\n\t\tfunction handleMouseWheel(event) {\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (event.deltaY > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleKeyDown(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfunction handleTouchStartRotate(event) {\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchStartDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\tfunction handleTouchStartPan(event) {\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyEnd.set(0, distance);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchEnd(event) {\n\t\t}\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\tfunction onMouseDown(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.button) {\n\t\t\t\tcase scope.mouseButtons.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownRotate(event);\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.ZOOM:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownDolly(event);\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownPan(event);\n\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onMouseMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tfunction onMouseUp(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleMouseUp(event);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\thandleMouseWheel(event);\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\tfunction onTouchStart(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartPan(event);\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onTouchMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\tfunction onTouchEnd(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleTouchEnd(event);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t}\n\t\t//\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\n\t\t// force an update at start\n\t\tthis.update();\n\t}\n}\n\nexport { OrbitControls };\n","function invokeAnimation(animation, player, time) {\n\tif (animation instanceof CompositeAnimation) {\n\t\tanimation.play(player, time);\n\t} else if (animation instanceof Function) {\n\t\tanimation(player, time);\n\t} else {\n\t\tthrow `Not an animation: ${animation}`;\n\t}\n}\n\nclass AnimationHandle {\n\tconstructor(animation) {\n\t\tthis.animation = animation;\n\t\tthis.paused = this._paused = false;\n\t\tthis.speed = this._speed = 1.0;\n\t\tthis._lastChange = null;\n\t\tthis._lastChangeX = null;\n\t\tthis._animationNaturalSpeed = animation.naturalSpeed;\n\t}\n\tplay(player, time) {\n\t\tif (this._lastChange === null) {\n\t\t\tthis._lastChange = time;\n\t\t\tthis._lastChangeX = 0;\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tif (this._paused === false) {\n\t\t\t\tthis._lastChangeX += dt * this._speed;\n\t\t\t}\n\t\t\tthis._paused = this.paused;\n\t\t\tthis._speed = this.speed;\n\t\t\tthis._lastChange = time;\n\t\t}\n\t\tif (this.paused === false) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tlet x = this._lastChangeX + (this.speed * this._animationNaturalSpeed) * dt;\n\t\t\tinvokeAnimation(this.animation, player, x);\n\t\t}\n\t}\n\treset(){\n\t\tthis._lastChange = null;\n\t}\n}\n\nclass CompositeAnimation {\n\tconstructor() {\n\t\tthis.handles = new Set();\n\t}\n\tadd(animation) {\n\t\tlet handle = new AnimationHandle(animation);\n\t\thandle.remove = () => this.handles.delete(handle);\n\t\tthis.handles.add(handle);\n\t\treturn handle;\n\t}\n\tplay(player, time) {\n\t\tthis.handles.forEach(handle => handle.play(player, time));\n\t}\n}\n\nlet WalkingAnimation = (player, time) => {\n\tlet skin = player.skin;\n\n\t// Leg swing\n\tskin.leftLeg.rotation.x = Math.sin(time) * 0.3;\n\tskin.rightLeg.rotation.x = Math.sin(time + Math.PI) * 0.3;\n\n\t// Arm swing\n\tskin.leftArm.rotation.x = Math.sin(time + Math.PI) * 0.5;\n\tskin.rightArm.rotation.x = Math.sin(time) * 0.5;\n\tlet basicArmRotationZ = Math.PI * 0.02;\n\tskin.leftArm.rotation.z = Math.cos(time) * 0.03 + basicArmRotationZ;\n\tskin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.03 - basicArmRotationZ;\n\n\t// Head shaking with different frequency & amplitude\n\tskin.head.rotation.y = Math.sin(time / 2) * 0.2;\n\tskin.head.rotation.x = Math.sin(time / 3) * 0.15;\n\n\t// Always add an angle for cape around the x axis\n\tlet basicCapeRotationX = Math.PI * 0.06;\n\tplayer.cape.rotation.x = Math.sin(time / 1.5) * 0.06 + basicCapeRotationX;\n};\n\nWalkingAnimation.naturalSpeed = 5;\n\nlet RunningAnimation = (player, time) => {\n\tlet skin = player.skin;\n\n\t// Leg swing with larger amplitude\n\tskin.leftLeg.rotation.x = Math.cos(time + Math.PI) * 1.3;\n\tskin.rightLeg.rotation.x = Math.cos(time) * 1.3;\n\n\t// Arm swing\n\tskin.leftArm.rotation.x = Math.cos(time) * 1.5;\n\tskin.rightArm.rotation.x = Math.cos(time + Math.PI) * 1.5;\n\tlet basicArmRotationZ = Math.PI * 0.1;\n\tskin.leftArm.rotation.z = Math.cos(time) * 0.1 + basicArmRotationZ;\n\tskin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.1 - basicArmRotationZ;\n\n\t// Jumping\n\tplayer.position.y = Math.cos(time * 2);\n\t// Dodging when running\n\tplayer.position.x = Math.cos(time) * 0.15;\n\t// Slightly tilting when running\n\tplayer.rotation.z = Math.cos(time + Math.PI) * 0.01;\n\n\t// Apply higher swing frequency, lower amplitude,\n\t// and greater basic rotation around x axis,\n\t// to cape when running.\n\tlet basicCapeRotationX = Math.PI * 0.3;\n\tplayer.cape.rotation.x = Math.sin(time * 2) * 0.1 + basicCapeRotationX;\n\n\t// What about head shaking?\n\t// You shouldn't glance right and left when running dude :P\n};\n\nRunningAnimation.naturalSpeed = 13;\n\nlet RotatingAnimation = (player, time) => {\n\tplayer.rotation.y = time;\n};\n\nRotatingAnimation.naturalSpeed = 1;\n\nexport {\n\tCompositeAnimation,\n\tinvokeAnimation,\n\tWalkingAnimation,\n\tRunningAnimation,\n\tRotatingAnimation\n};\n","import * as THREE from \"three\";\nimport { PlayerObject } from \"./model\";\nimport { OrbitControls } from \"./orbit_controls\";\nimport { invokeAnimation } from \"./animation\";\n\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\n\tlet imgData = context.getImageData(sX, sY, w, h);\n\tif (flipHorizontal) {\n\t\tfor (let y = 0; y < h; y++) {\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\n\t\t\t\tlet index = (x + y * w) * 4;\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\n\t\t\t\tlet pA1 = imgData.data[index];\n\t\t\t\tlet pA2 = imgData.data[index + 1];\n\t\t\t\tlet pA3 = imgData.data[index + 2];\n\t\t\t\tlet pA4 = imgData.data[index + 3];\n\n\t\t\t\tlet pB1 = imgData.data[index2];\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\n\n\t\t\t\timgData.data[index] = pB1;\n\t\t\t\timgData.data[index + 1] = pB2;\n\t\t\t\timgData.data[index + 2] = pB3;\n\t\t\t\timgData.data[index + 3] = pB4;\n\n\t\t\t\timgData.data[index2] = pA1;\n\t\t\t\timgData.data[index2 + 1] = pA2;\n\t\t\t\timgData.data[index2 + 2] = pA3;\n\t\t\t\timgData.data[index2 + 3] = pA4;\n\t\t\t}\n\t\t}\n\t}\n\tcontext.putImageData(imgData, dX, dY);\n}\n\nfunction convertSkinTo1_8(context, width) {\n\tlet scale = width / 64.0;\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\n\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\n}\n\nclass SkinViewer {\n\tconstructor(options) {\n\t\tthis.domElement = options.domElement;\n\t\tthis.animation = options.animation || null;\n\t\tthis.animationPaused = false;\n\t\tthis.animationTime = 0;\n\t\tthis.disposed = false;\n\n\t\t// texture\n\t\tthis.skinImg = new Image();\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.capeImg = new Image();\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\n\n\t\t// scene\n\t\tthis.scene = new THREE.Scene();\n\n\t\t// Use smaller fov to avoid distortion\n\t\tthis.camera = new THREE.PerspectiveCamera(40);\n\t\tthis.camera.position.y = -12;\n\t\tthis.camera.position.z = 60;\n\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\n\t\tthis.renderer.setSize(300, 300); // default size\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\n\t\tthis.domElement.appendChild(this.renderer.domElement);\n\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\n\t\tthis.scene.add(this.playerObject);\n\n\t\t// texture loading\n\t\tthis.skinImg.crossOrigin = \"\";\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\n\t\tthis.skinImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad skin size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.width = width;\n\t\t\t\tthis.skinCanvas.height = width;\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\n\t\t\t} else {\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t}\n\n\t\t\tthis.skinTexture.needsUpdate = true;\n\t\t\tthis.layer1Material.needsUpdate = true;\n\t\t\tthis.layer2Material.needsUpdate = true;\n\n\t\t\tthis.playerObject.skin.visible = true;\n\t\t};\n\n\t\tthis.capeImg.crossOrigin = \"\";\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\n\t\tthis.capeImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\n\t\t\t\tif (this.capeImg.width * 17 == this.capeImg.height * 22) {\n\t\t\t\t\t// width/height = 22/17\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad cape size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.capeImg.width * 64 / 22;\n\t\t\t\tthis.capeCanvas.width = width;\n\t\t\t\tthis.capeCanvas.height = width / 2;\n\t\t\t} else {\n\t\t\t\tthis.capeCanvas.width = this.capeImg.width;\n\t\t\t\tthis.capeCanvas.height = this.capeImg.height;\n\t\t\t}\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeImg.width, this.capeImg.height);\n\n\t\t\tthis.capeTexture.needsUpdate = true;\n\t\t\tthis.capeMaterial.needsUpdate = true;\n\n\t\t\tthis.playerObject.cape.visible = true;\n\t\t};\n\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\n\t\tif (options.width) this.width = options.width;\n\t\tif (options.height) this.height = options.height;\n\n\t\tlet draw = () => {\n\t\t\tif (this.disposed) return;\n\t\t\twindow.requestAnimationFrame(draw);\n\t\t\tif (!this.animationPaused) {\n\t\t\t\tthis.animationTime++;\n\t\t\t\tif (this.animation) {\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t};\n\t\tdraw();\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.camera.aspect = width / height;\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.renderer.setSize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis.disposed = true;\n\t\tthis.domElement.removeChild(this.renderer.domElement);\n\t\tthis.renderer.dispose();\n\t\tthis.skinTexture.dispose();\n\t\tthis.capeTexture.dispose();\n\t}\n\n\tget skinUrl() {\n\t\treturn this.skinImg.src;\n\t}\n\n\tset skinUrl(url) {\n\t\tthis.skinImg.src = url;\n\t}\n\n\tget capeUrl() {\n\t\treturn this.capeImg.src;\n\t}\n\n\tset capeUrl(url) {\n\t\tthis.capeImg.src = url;\n\t}\n\n\tget width() {\n\t\treturn this.renderer.getSize().width;\n\t}\n\n\tset width(newWidth) {\n\t\tthis.setSize(newWidth, this.height);\n\t}\n\n\tget height() {\n\t\treturn this.renderer.getSize().height;\n\t}\n\n\tset height(newHeight) {\n\t\tthis.setSize(this.width, newHeight);\n\t}\n}\n\nclass MouseControl {\n\tconstructor(skinViewer) {\n\t\tthis.skinViewer = skinViewer;\n\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\n\t\tthis.orbitControls.enablePan = false;\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\n\t\tthis.orbitControls.minDistance = 10;\n\t\tthis.orbitControls.maxDistance = 256;\n\t\tthis.orbitControls.update();\n\t}\n\n\tget rotation() {\n\t\treturn this.orbitControls.enableRotate;\n\t}\n\n\tset rotation(value) {\n\t\tthis.orbitControls.enableRotate = value;\n\t}\n\n\tget zoom() {\n\t\treturn this.orbitControls.enableZoom;\n\t}\n\n\tset zoom(value) {\n\t\tthis.orbitControls.enableZoom = value;\n\t}\n\n\tget pan() {\n\t\treturn this.orbitControls.enablePan;\n\t}\n\n\tset pan(value) {\n\t\tthis.orbitControls.enablePan = value;\n\t}\n\n\tdispose() {\n\t\tthis.orbitControls.dispose();\n\t}\n}\n\nexport { SkinViewer, MouseControl };\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","slim","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","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","_animationNaturalSpeed","naturalSpeed","dt","handles","Set","handle","remove","delete","forEach","WalkingAnimation","sin","basicArmRotationZ","cos","basicCapeRotationX","RunningAnimation","RotatingAnimation","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","angleRot","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","MouseControl","skinViewer","orbitControls","value"],"mappings":"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"} \ No newline at end of file diff --git a/js/skinview3d.module.js b/js/skinview3d.module.js deleted file mode 100644 index e3465a0..0000000 --- a/js/skinview3d.module.js +++ /dev/null @@ -1,1317 +0,0 @@ -/** - * skinview3d (https://github.com/to2mbn/skinview3d) - * - * MIT License - * - * Original work Copyright (c) 2014-2018 Kent Rasmussen - * Modified work Copyright (c) 2017-2018 Haowei Wen, Sean Boult, Pig Fang and contributors - * - * 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. - */ - -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(slim, layer1Material, layer2Material) { - classCallCheck(this, SkinObject); - - var _this = possibleConstructorReturn(this, (SkinObject.__proto__ || Object.getPrototypeOf(SkinObject)).call(this)); - - _this.slim = slim; - - // Head - _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((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); - if (slim) { - 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((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - if (slim) { - 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 = slim ? -5.5 : -6; - _this.add(_this.rightArm); - - // Left Arm - _this.leftArm = new Group(); - var leftArmPivot = new Group(); - - var leftArmBox = new BoxGeometry((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0); - if (slim) { - 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((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0); - if (slim) { - 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 = slim ? 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.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; - this._animationNaturalSpeed = animation.naturalSpeed; - } - - 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 * this._animationNaturalSpeed * _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 WalkingAnimation = function WalkingAnimation(player, time) { - var skin = player.skin; - - // Leg swing - skin.leftLeg.rotation.x = Math.sin(time) * 0.3; - skin.rightLeg.rotation.x = Math.sin(time + Math.PI) * 0.3; - - // Arm swing - skin.leftArm.rotation.x = Math.sin(time + Math.PI) * 0.5; - skin.rightArm.rotation.x = Math.sin(time) * 0.5; - var basicArmRotationZ = Math.PI * 0.02; - skin.leftArm.rotation.z = Math.cos(time) * 0.03 + basicArmRotationZ; - skin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.03 - basicArmRotationZ; - - // Head shaking with different frequency & amplitude - skin.head.rotation.y = Math.sin(time / 2) * 0.2; - skin.head.rotation.x = Math.sin(time / 3) * 0.15; - - // Always add an angle for cape around the x axis - var basicCapeRotationX = Math.PI * 0.06; - player.cape.rotation.x = Math.sin(time / 1.5) * 0.06 + basicCapeRotationX; -}; - -WalkingAnimation.naturalSpeed = 5; - -var RunningAnimation = function RunningAnimation(player, time) { - var skin = player.skin; - - // Leg swing with larger amplitude - skin.leftLeg.rotation.x = Math.cos(time + Math.PI) * 1.3; - skin.rightLeg.rotation.x = Math.cos(time) * 1.3; - - // Arm swing - skin.leftArm.rotation.x = Math.cos(time) * 1.5; - skin.rightArm.rotation.x = Math.cos(time + Math.PI) * 1.5; - var basicArmRotationZ = Math.PI * 0.1; - skin.leftArm.rotation.z = Math.cos(time) * 0.1 + basicArmRotationZ; - skin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.1 - basicArmRotationZ; - - // Jumping - player.position.y = Math.cos(time * 2); - // Dodging when running - player.position.x = Math.cos(time) * 0.15; - // Slightly tilting when running - player.rotation.z = Math.cos(time + Math.PI) * 0.01; - - // Apply higher swing frequency, lower amplitude, - // and greater basic rotation around x axis, - // to cape when running. - var basicCapeRotationX = Math.PI * 0.3; - player.cape.rotation.x = Math.sin(time * 2) * 0.1 + basicCapeRotationX; - - // What about head shaking? - // You shouldn't glance right and left when running dude :P -}; - -RunningAnimation.naturalSpeed = 13; - -var RotatingAnimation = function RotatingAnimation(player, time) { - player.rotation.y = time; -}; - -RotatingAnimation.naturalSpeed = 1; - -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(); - - // Use smaller fov to avoid distortion - this.camera = new PerspectiveCamera(40); - this.camera.position.y = -12; - this.camera.position.z = 60; - - 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 () { - var isOldFormat = false; - if (_this.capeImg.width !== 2 * _this.capeImg.height) { - if (_this.capeImg.width * 17 == _this.capeImg.height * 22) { - // width/height = 22/17 - isOldFormat = true; - } else { - console.error("Bad cape size"); - return; - } - } - - var capeContext = _this.capeCanvas.getContext("2d"); - if (isOldFormat) { - var width = _this.capeImg.width * 64 / 22; - _this.capeCanvas.width = width; - _this.capeCanvas.height = width / 2; - } else { - _this.capeCanvas.width = _this.capeImg.width; - _this.capeCanvas.height = _this.capeImg.height; - } - capeContext.clearRect(0, 0, _this.capeCanvas.width, _this.capeCanvas.height); - capeContext.drawImage(_this.capeImg, 0, 0, _this.capeImg.width, _this.capeImg.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 MouseControl = function () { - function MouseControl(skinViewer) { - classCallCheck(this, MouseControl); - - 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(); - } - - createClass(MouseControl, [{ - key: "dispose", - value: function dispose() { - this.orbitControls.dispose(); - } - }, { - key: "rotation", - get: function get$$1() { - return this.orbitControls.enableRotate; - }, - set: function set$$1(value) { - this.orbitControls.enableRotate = value; - } - }, { - key: "zoom", - get: function get$$1() { - return this.orbitControls.enableZoom; - }, - set: function set$$1(value) { - this.orbitControls.enableZoom = value; - } - }, { - key: "pan", - get: function get$$1() { - return this.orbitControls.enablePan; - }, - set: function set$$1(value) { - this.orbitControls.enablePan = value; - } - }]); - return MouseControl; -}(); - -export { SkinObject, CapeObject, PlayerObject, SkinViewer, MouseControl, invokeAnimation, CompositeAnimation, WalkingAnimation, RunningAnimation, RotatingAnimation }; -//# sourceMappingURL=skinview3d.module.js.map diff --git a/js/skinview3d.module.js.map b/js/skinview3d.module.js.map deleted file mode 100644 index 03a045c..0000000 --- a/js/skinview3d.module.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"skinview3d.module.js","sources":["../src/model.js","../src/orbit_controls.js","../src/animation.js","../src/viewer.js"],"sourcesContent":["import * as THREE from \"three\";\n\nfunction toFaceVertices(x1, y1, x2, y2, w, h) {\n\treturn [\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y2 / h),\n\t\tnew THREE.Vector2(x2 / w, 1.0 - y1 / h),\n\t\tnew THREE.Vector2(x1 / w, 1.0 - y1 / h)\n\t];\n}\n\nfunction toSkinVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 64.0);\n}\n\nfunction toCapeVertices(x1, y1, x2, y2) {\n\treturn toFaceVertices(x1, y1, x2, y2, 64.0, 32.0);\n}\n\nfunction addVertices(box, top, bottom, left, front, right, back) {\n\tbox.faceVertexUvs[0] = [];\n\tbox.faceVertexUvs[0][0] = [right[3], right[0], right[2]];\n\tbox.faceVertexUvs[0][1] = [right[0], right[1], right[2]];\n\tbox.faceVertexUvs[0][2] = [left[3], left[0], left[2]];\n\tbox.faceVertexUvs[0][3] = [left[0], left[1], left[2]];\n\tbox.faceVertexUvs[0][4] = [top[3], top[0], top[2]];\n\tbox.faceVertexUvs[0][5] = [top[0], top[1], top[2]];\n\tbox.faceVertexUvs[0][6] = [bottom[0], bottom[3], bottom[1]];\n\tbox.faceVertexUvs[0][7] = [bottom[3], bottom[2], bottom[1]];\n\tbox.faceVertexUvs[0][8] = [front[3], front[0], front[2]];\n\tbox.faceVertexUvs[0][9] = [front[0], front[1], front[2]];\n\tbox.faceVertexUvs[0][10] = [back[3], back[0], back[2]];\n\tbox.faceVertexUvs[0][11] = [back[0], back[1], back[2]];\n}\n\nconst esp = 0.002;\n\nclass SkinObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material) {\n\t\tsuper();\n\n\t\tthis.slim = slim;\n\n\t\t// Head\n\t\tthis.head = new THREE.Group();\n\n\t\tlet headBox = new THREE.BoxGeometry(8, 8, 8, 0, 0, 0);\n\t\taddVertices(headBox,\n\t\t\ttoSkinVertices(8, 0, 16, 8),\n\t\t\ttoSkinVertices(16, 0, 24, 8),\n\t\t\ttoSkinVertices(0, 8, 8, 16),\n\t\t\ttoSkinVertices(8, 8, 16, 16),\n\t\t\ttoSkinVertices(16, 8, 24, 16),\n\t\t\ttoSkinVertices(24, 8, 32, 16)\n\t\t);\n\t\tlet headMesh = new THREE.Mesh(headBox, layer1Material);\n\t\tthis.head.add(headMesh);\n\n\t\tlet head2Box = new THREE.BoxGeometry(9, 9, 9, 0, 0, 0);\n\t\taddVertices(head2Box,\n\t\t\ttoSkinVertices(40, 0, 48, 8),\n\t\t\ttoSkinVertices(48, 0, 56, 8),\n\t\t\ttoSkinVertices(32, 8, 40, 16),\n\t\t\ttoSkinVertices(40, 8, 48, 16),\n\t\t\ttoSkinVertices(48, 8, 56, 16),\n\t\t\ttoSkinVertices(56, 8, 64, 16)\n\t\t);\n\t\tlet head2Mesh = new THREE.Mesh(head2Box, layer2Material);\n\t\thead2Mesh.renderOrder = -1;\n\t\tthis.head.add(head2Mesh);\n\n\t\tthis.add(this.head);\n\n\n\t\t// Body\n\t\tthis.body = new THREE.Group();\n\n\t\tlet bodyBox = new THREE.BoxGeometry(8, 12, 4, 0, 0, 0);\n\t\taddVertices(bodyBox,\n\t\t\ttoSkinVertices(20, 16, 28, 20),\n\t\t\ttoSkinVertices(28, 16, 36, 20),\n\t\t\ttoSkinVertices(16, 20, 20, 32),\n\t\t\ttoSkinVertices(20, 20, 28, 32),\n\t\t\ttoSkinVertices(28, 20, 32, 32),\n\t\t\ttoSkinVertices(32, 20, 40, 32)\n\t\t);\n\t\tlet bodyMesh = new THREE.Mesh(bodyBox, layer1Material);\n\t\tthis.body.add(bodyMesh);\n\n\t\tlet body2Box = new THREE.BoxGeometry(9, 13.5, 4.5, 0, 0, 0);\n\t\taddVertices(body2Box,\n\t\t\ttoSkinVertices(20, 32, 28, 36),\n\t\t\ttoSkinVertices(28, 32, 36, 36),\n\t\t\ttoSkinVertices(16, 36, 20, 48),\n\t\t\ttoSkinVertices(20, 36, 28, 48),\n\t\t\ttoSkinVertices(28, 36, 32, 48),\n\t\t\ttoSkinVertices(32, 36, 40, 48)\n\t\t);\n\t\tlet body2Mesh = new THREE.Mesh(body2Box, layer2Material);\n\t\tthis.body.add(body2Mesh);\n\n\t\tthis.body.position.y = -10;\n\t\tthis.add(this.body);\n\n\n\t\t// Right Arm\n\t\tthis.rightArm = new THREE.Group();\n\t\tlet rightArmPivot = new THREE.Group();\n\n\t\tlet rightArmBox = new THREE.BoxGeometry((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 47, 20),\n\t\t\t\ttoSkinVertices(47, 16, 50, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 47, 32),\n\t\t\t\ttoSkinVertices(47, 20, 51, 32),\n\t\t\t\ttoSkinVertices(51, 20, 54, 32)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArmBox,\n\t\t\t\ttoSkinVertices(44, 16, 48, 20),\n\t\t\t\ttoSkinVertices(48, 16, 52, 20),\n\t\t\t\ttoSkinVertices(40, 20, 44, 32),\n\t\t\t\ttoSkinVertices(44, 20, 48, 32),\n\t\t\t\ttoSkinVertices(48, 20, 52, 32),\n\t\t\t\ttoSkinVertices(52, 20, 56, 32)\n\t\t\t);\n\t\t}\n\t\tlet rightArmMesh = new THREE.Mesh(rightArmBox, layer1Material);\n\t\trightArmPivot.add(rightArmMesh);\n\n\t\tlet rightArm2Box = new THREE.BoxGeometry((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 47, 36),\n\t\t\t\ttoSkinVertices(47, 32, 50, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 47, 48),\n\t\t\t\ttoSkinVertices(47, 36, 51, 48),\n\t\t\t\ttoSkinVertices(51, 36, 54, 48)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(rightArm2Box,\n\t\t\t\ttoSkinVertices(44, 32, 48, 36),\n\t\t\t\ttoSkinVertices(48, 32, 52, 36),\n\t\t\t\ttoSkinVertices(40, 36, 44, 48),\n\t\t\t\ttoSkinVertices(44, 36, 48, 48),\n\t\t\t\ttoSkinVertices(48, 36, 52, 48),\n\t\t\t\ttoSkinVertices(52, 36, 56, 48)\n\t\t\t);\n\t\t}\n\t\tlet rightArm2Mesh = new THREE.Mesh(rightArm2Box, layer2Material);\n\t\trightArm2Mesh.renderOrder = 1;\n\t\trightArmPivot.add(rightArm2Mesh);\n\n\t\trightArmPivot.position.y = -6;\n\t\tthis.rightArm.add(rightArmPivot);\n\t\tthis.rightArm.position.y = -4;\n\t\tthis.rightArm.position.x = slim ? -5.5 : -6;\n\t\tthis.add(this.rightArm);\n\n\n\t\t// Left Arm\n\t\tthis.leftArm = new THREE.Group();\n\t\tlet leftArmPivot = new THREE.Group();\n\n\t\tlet leftArmBox = new THREE.BoxGeometry((slim ? 3 : 4) - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 39, 52),\n\t\t\t\ttoSkinVertices(39, 48, 42, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 39, 64),\n\t\t\t\ttoSkinVertices(39, 52, 43, 64),\n\t\t\t\ttoSkinVertices(43, 52, 46, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArmBox,\n\t\t\t\ttoSkinVertices(36, 48, 40, 52),\n\t\t\t\ttoSkinVertices(40, 48, 44, 52),\n\t\t\t\ttoSkinVertices(32, 52, 36, 64),\n\t\t\t\ttoSkinVertices(36, 52, 40, 64),\n\t\t\t\ttoSkinVertices(40, 52, 44, 64),\n\t\t\t\ttoSkinVertices(44, 52, 48, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArmMesh = new THREE.Mesh(leftArmBox, layer1Material);\n\t\tleftArmPivot.add(leftArmMesh);\n\n\t\tlet leftArm2Box = new THREE.BoxGeometry((slim ? 3.375 : 4.5) - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\tif (slim) {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 55, 52),\n\t\t\t\ttoSkinVertices(55, 48, 58, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 55, 64),\n\t\t\t\ttoSkinVertices(55, 52, 59, 64),\n\t\t\t\ttoSkinVertices(59, 52, 62, 64)\n\t\t\t);\n\t\t} else {\n\t\t\taddVertices(leftArm2Box,\n\t\t\t\ttoSkinVertices(52, 48, 56, 52),\n\t\t\t\ttoSkinVertices(56, 48, 60, 52),\n\t\t\t\ttoSkinVertices(48, 52, 52, 64),\n\t\t\t\ttoSkinVertices(52, 52, 56, 64),\n\t\t\t\ttoSkinVertices(56, 52, 60, 64),\n\t\t\t\ttoSkinVertices(60, 52, 64, 64)\n\t\t\t);\n\t\t}\n\t\tlet leftArm2Mesh = new THREE.Mesh(leftArm2Box, layer2Material);\n\t\tleftArm2Mesh.renderOrder = 1;\n\t\tleftArmPivot.add(leftArm2Mesh);\n\n\t\tleftArmPivot.position.y = -6;\n\t\tthis.leftArm.add(leftArmPivot);\n\t\tthis.leftArm.position.y = -4;\n\t\tthis.leftArm.position.x = slim ? 5.5 : 6;\n\t\tthis.add(this.leftArm);\n\n\n\t\t// Right Leg\n\t\tthis.rightLeg = new THREE.Group();\n\t\tlet rightLegPivot = new THREE.Group();\n\n\t\tlet rightLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(rightLegBox,\n\t\t\ttoSkinVertices(4, 16, 8, 20),\n\t\t\ttoSkinVertices(8, 16, 12, 20),\n\t\t\ttoSkinVertices(0, 20, 4, 32),\n\t\t\ttoSkinVertices(4, 20, 8, 32),\n\t\t\ttoSkinVertices(8, 20, 12, 32),\n\t\t\ttoSkinVertices(12, 20, 16, 32)\n\t\t);\n\t\tlet rightLegMesh = new THREE.Mesh(rightLegBox, layer1Material);\n\t\trightLegPivot.add(rightLegMesh);\n\n\t\tlet rightLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(rightLeg2Box,\n\t\t\ttoSkinVertices(4, 32, 8, 36),\n\t\t\ttoSkinVertices(8, 32, 12, 36),\n\t\t\ttoSkinVertices(0, 36, 4, 48),\n\t\t\ttoSkinVertices(4, 36, 8, 48),\n\t\t\ttoSkinVertices(8, 36, 12, 48),\n\t\t\ttoSkinVertices(12, 36, 16, 48)\n\t\t);\n\t\tlet rightLeg2Mesh = new THREE.Mesh(rightLeg2Box, layer2Material);\n\t\trightLeg2Mesh.renderOrder = 1;\n\t\trightLegPivot.add(rightLeg2Mesh);\n\n\t\trightLegPivot.position.y = -6;\n\t\tthis.rightLeg.add(rightLegPivot);\n\t\tthis.rightLeg.position.y = -16;\n\t\tthis.rightLeg.position.x = -2;\n\t\tthis.add(this.rightLeg);\n\n\t\t// Left Leg\n\t\tthis.leftLeg = new THREE.Group();\n\t\tlet leftLegPivot = new THREE.Group();\n\n\t\tlet leftLegBox = new THREE.BoxGeometry(4 - esp, 12 - esp, 4 - esp, 0, 0, 0);\n\t\taddVertices(leftLegBox,\n\t\t\ttoSkinVertices(20, 48, 24, 52),\n\t\t\ttoSkinVertices(24, 48, 28, 52),\n\t\t\ttoSkinVertices(16, 52, 20, 64),\n\t\t\ttoSkinVertices(20, 52, 24, 64),\n\t\t\ttoSkinVertices(24, 52, 28, 64),\n\t\t\ttoSkinVertices(28, 52, 32, 64)\n\t\t);\n\t\tlet leftLegMesh = new THREE.Mesh(leftLegBox, layer1Material);\n\t\tleftLegPivot.add(leftLegMesh);\n\n\t\tlet leftLeg2Box = new THREE.BoxGeometry(4.5 - esp, 13.5 - esp, 4.5 - esp, 0, 0, 0);\n\t\taddVertices(leftLeg2Box,\n\t\t\ttoSkinVertices(4, 48, 8, 52),\n\t\t\ttoSkinVertices(8, 48, 12, 52),\n\t\t\ttoSkinVertices(0, 52, 4, 64),\n\t\t\ttoSkinVertices(4, 52, 8, 64),\n\t\t\ttoSkinVertices(8, 52, 12, 64),\n\t\t\ttoSkinVertices(12, 52, 16, 64)\n\t\t);\n\t\tlet leftLeg2Mesh = new THREE.Mesh(leftLeg2Box, layer2Material);\n\t\tleftLeg2Mesh.renderOrder = 1;\n\t\tleftLegPivot.add(leftLeg2Mesh);\n\n\t\tleftLegPivot.position.y = -6;\n\t\tthis.leftLeg.add(leftLegPivot);\n\t\tthis.leftLeg.position.y = -16;\n\t\tthis.leftLeg.position.x = 2;\n\t\tthis.add(this.leftLeg);\n\t}\n}\n\nclass CapeObject extends THREE.Group {\n\tconstructor(capeMaterial) {\n\t\tsuper();\n\n\t\t// back = outside\n\t\t// front = inside\n\t\tlet capeBox = new THREE.BoxGeometry(10, 16, 1, 0, 0, 0);\n\t\taddVertices(capeBox,\n\t\t\ttoCapeVertices(1, 0, 11, 1),\n\t\t\ttoCapeVertices(11, 0, 21, 1),\n\t\t\ttoCapeVertices(11, 1, 12, 17),\n\t\t\ttoCapeVertices(12, 1, 22, 17),\n\t\t\ttoCapeVertices(0, 1, 1, 17),\n\t\t\ttoCapeVertices(1, 1, 11, 17)\n\t\t);\n\t\tthis.cape = new THREE.Mesh(capeBox, capeMaterial);\n\t\tthis.cape.position.y = -8;\n\t\tthis.cape.position.z = -0.5;\n\t\tthis.add(this.cape);\n\t}\n}\n\nclass PlayerObject extends THREE.Group {\n\tconstructor(slim, layer1Material, layer2Material, capeMaterial) {\n\t\tsuper();\n\n\t\tthis.skin = new SkinObject(slim, layer1Material, layer2Material);\n\t\tthis.skin.visible = false;\n\t\tthis.add(this.skin);\n\n\t\tthis.cape = new CapeObject(capeMaterial);\n\t\tthis.cape.position.z = -2;\n\t\tthis.cape.position.y = -4;\n\t\tthis.cape.rotation.x = 25 * Math.PI / 180;\n\t\tthis.cape.visible = false;\n\t\tthis.add(this.cape);\n\t}\n}\n\nexport { SkinObject, CapeObject, PlayerObject };\n","import * as THREE from \"three\";\n\nclass OrbitControls extends THREE.EventDispatcher {\n\t/**\n\t * @preserve\n\t * The code was originally from https://github.com/mrdoob/three.js/blob/d45a042cf962e9b1aa9441810ba118647b48aacb/examples/js/controls/OrbitControls.js\n\t */\n\t/**\n\t * @license\n\t * Copyright (C) 2010-2017 three.js authors\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t *\n\t *\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finger swipe\n\n\tconstructor(object, domElement) {\n\t\tsuper();\n\t\tthis.object = object;\n\t\tthis.domElement = (domElement !== undefined) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out (PerspectiveCamera only)\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out (OrthographicCamera only)\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\t\tthis.getPolarAngle = function () {\n\t\t\treturn spherical.phi;\n\t\t};\n\t\tthis.getAzimuthalAngle = function () {\n\t\t\treturn spherical.theta;\n\t\t};\n\t\tthis.saveState = function () {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t\tscope.zoom0 = scope.object.zoom;\n\t\t};\n\t\tthis.reset = function () {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\tscope.update();\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\t// so camera.up is the orbit axis\n\t\t\tlet quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\n\t\t\tlet quatInverse = quat.clone().inverse();\n\t\t\tlet lastPosition = new THREE.Vector3();\n\t\t\tlet lastQuaternion = new THREE.Quaternion();\n\t\t\treturn function update() {\n\t\t\t\tlet position = scope.object.position;\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\t\t\t\tspherical.makeSafe();\n\t\t\t\tspherical.radius *= scale;\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\t\t\toffset.setFromSpherical(spherical);\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\t\t\tif (zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}();\n\t\tthis.dispose = function () {\n\t\t\tscope.domElement.removeEventListener(\"contextmenu\", onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener(\"mousedown\", onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener(\"wheel\", onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener(\"touchstart\", onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener(\"touchend\", onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener(\"touchmove\", onTouchMove, false);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\twindow.removeEventListener(\"keydown\", onKeyDown, false);\n\t\t\t//scope.dispatchEvent({ type: \"dispose\" }); // should this be added here?\n\t\t};\n\t\t//\n\t\t// internals\n\t\t//\n\t\tlet scope = this;\n\t\tlet changeEvent = { type: \"change\" };\n\t\tlet startEvent = { type: \"start\" };\n\t\tlet endEvent = { type: \"end\" };\n\t\tlet STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\tlet state = STATE.NONE;\n\t\tlet EPS = 0.000001;\n\t\t// current position in spherical coordinates\n\t\tlet spherical = new THREE.Spherical();\n\t\tlet sphericalDelta = new THREE.Spherical();\n\t\tlet scale = 1;\n\t\tlet panOffset = new THREE.Vector3();\n\t\tlet zoomChanged = false;\n\t\tlet rotateStart = new THREE.Vector2();\n\t\tlet rotateEnd = new THREE.Vector2();\n\t\tlet rotateDelta = new THREE.Vector2();\n\t\tlet panStart = new THREE.Vector2();\n\t\tlet panEnd = new THREE.Vector2();\n\t\tlet panDelta = new THREE.Vector2();\n\t\tlet dollyStart = new THREE.Vector2();\n\t\tlet dollyEnd = new THREE.Vector2();\n\t\tlet dollyDelta = new THREE.Vector2();\n\t\tfunction getAutoRotationAngle() {\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\tfunction getZoomScale() {\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\t\tlet panLeft = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\tlet panUp = function () {\n\t\t\tlet v = new THREE.Vector3();\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar(distance);\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tlet pan = function () {\n\t\t\tlet offset = new THREE.Vector3();\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\t\t// perspective\n\t\t\t\t\tlet position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tlet targetDistance = offset.length();\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0);\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t}();\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale /= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tif (scope.object instanceof THREE.PerspectiveCamera) {\n\t\t\t\tscale *= dollyScale;\n\t\t\t}\n\t\t\telse if (scope.object instanceof THREE.OrthographicCamera) {\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleMouseUp(event) {\n\t\t}\n\t\tfunction handleMouseWheel(event) {\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (event.deltaY > 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleKeyDown(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfunction handleTouchStartRotate(event) {\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchStartDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\tfunction handleTouchStartPan(event) {\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\t\tlet element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\t\trotateStart.copy(rotateEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tlet dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tlet dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\t\tlet distance = Math.sqrt(dx * dx + dy * dy);\n\t\t\tdollyEnd.set(0, distance);\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\t\telse if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\t\tpanStart.copy(panEnd);\n\t\t\tscope.update();\n\t\t}\n\t\tfunction handleTouchEnd(event) {\n\t\t}\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\tfunction onMouseDown(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.button) {\n\t\t\t\tcase scope.mouseButtons.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownRotate(event);\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.ZOOM:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownDolly(event);\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseDownPan(event);\n\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tdocument.addEventListener(\"mousemove\", onMouseMove, false);\n\t\t\t\tdocument.addEventListener(\"mouseup\", onMouseUp, false);\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onMouseMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleMouseMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tfunction onMouseUp(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleMouseUp(event);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove, false);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp, false);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE))\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\thandleMouseWheel(event);\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\tfunction onTouchStart(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\thandleTouchStartPan(event);\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\tfunction onTouchMove(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\tswitch (event.touches.length) {\n\t\t\t\tcase 1:// one-fingered touch: rotate\n\t\t\t\t\tif (scope.enableRotate === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:// two-fingered touch: dolly\n\t\t\t\t\tif (scope.enableZoom === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:// three-fingered touch: pan\n\t\t\t\t\tif (scope.enablePan === false)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN)\n\t\t\t\t\t\treturn; // is this needed?...\n\t\t\t\t\thandleTouchMovePan(event);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\tfunction onTouchEnd(event) {\n\t\t\tif (scope.enabled === false)\n\t\t\t\treturn;\n\t\t\thandleTouchEnd(event);\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false)\n\t\t\t\treturn;\n\t\t\tevent.preventDefault();\n\t\t}\n\t\t//\n\t\tscope.domElement.addEventListener(\"contextmenu\", onContextMenu, false);\n\t\tscope.domElement.addEventListener(\"mousedown\", onMouseDown, false);\n\t\tscope.domElement.addEventListener(\"wheel\", onMouseWheel, false);\n\t\tscope.domElement.addEventListener(\"touchstart\", onTouchStart, false);\n\t\tscope.domElement.addEventListener(\"touchend\", onTouchEnd, false);\n\t\tscope.domElement.addEventListener(\"touchmove\", onTouchMove, false);\n\t\twindow.addEventListener(\"keydown\", onKeyDown, false);\n\t\t// force an update at start\n\t\tthis.update();\n\t}\n}\n\nexport { OrbitControls };\n","function invokeAnimation(animation, player, time) {\n\tif (animation instanceof CompositeAnimation) {\n\t\tanimation.play(player, time);\n\t} else if (animation instanceof Function) {\n\t\tanimation(player, time);\n\t} else {\n\t\tthrow `Not an animation: ${animation}`;\n\t}\n}\n\nclass AnimationHandle {\n\tconstructor(animation) {\n\t\tthis.animation = animation;\n\t\tthis.paused = this._paused = false;\n\t\tthis.speed = this._speed = 1.0;\n\t\tthis._lastChange = null;\n\t\tthis._lastChangeX = null;\n\t\tthis._animationNaturalSpeed = animation.naturalSpeed;\n\t}\n\tplay(player, time) {\n\t\tif (this._lastChange === null) {\n\t\t\tthis._lastChange = time;\n\t\t\tthis._lastChangeX = 0;\n\t\t} else if (this.paused !== this._paused || this.speed !== this._speed) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tif (this._paused === false) {\n\t\t\t\tthis._lastChangeX += dt * this._speed;\n\t\t\t}\n\t\t\tthis._paused = this.paused;\n\t\t\tthis._speed = this.speed;\n\t\t\tthis._lastChange = time;\n\t\t}\n\t\tif (this.paused === false) {\n\t\t\tlet dt = time - this._lastChange;\n\t\t\tlet x = this._lastChangeX + (this.speed * this._animationNaturalSpeed) * dt;\n\t\t\tinvokeAnimation(this.animation, player, x);\n\t\t}\n\t}\n\treset(){\n\t\tthis._lastChange = null;\n\t}\n}\n\nclass CompositeAnimation {\n\tconstructor() {\n\t\tthis.handles = new Set();\n\t}\n\tadd(animation) {\n\t\tlet handle = new AnimationHandle(animation);\n\t\thandle.remove = () => this.handles.delete(handle);\n\t\tthis.handles.add(handle);\n\t\treturn handle;\n\t}\n\tplay(player, time) {\n\t\tthis.handles.forEach(handle => handle.play(player, time));\n\t}\n}\n\nlet WalkingAnimation = (player, time) => {\n\tlet skin = player.skin;\n\n\t// Leg swing\n\tskin.leftLeg.rotation.x = Math.sin(time) * 0.3;\n\tskin.rightLeg.rotation.x = Math.sin(time + Math.PI) * 0.3;\n\n\t// Arm swing\n\tskin.leftArm.rotation.x = Math.sin(time + Math.PI) * 0.5;\n\tskin.rightArm.rotation.x = Math.sin(time) * 0.5;\n\tlet basicArmRotationZ = Math.PI * 0.02;\n\tskin.leftArm.rotation.z = Math.cos(time) * 0.03 + basicArmRotationZ;\n\tskin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.03 - basicArmRotationZ;\n\n\t// Head shaking with different frequency & amplitude\n\tskin.head.rotation.y = Math.sin(time / 2) * 0.2;\n\tskin.head.rotation.x = Math.sin(time / 3) * 0.15;\n\n\t// Always add an angle for cape around the x axis\n\tlet basicCapeRotationX = Math.PI * 0.06;\n\tplayer.cape.rotation.x = Math.sin(time / 1.5) * 0.06 + basicCapeRotationX;\n};\n\nWalkingAnimation.naturalSpeed = 5;\n\nlet RunningAnimation = (player, time) => {\n\tlet skin = player.skin;\n\n\t// Leg swing with larger amplitude\n\tskin.leftLeg.rotation.x = Math.cos(time + Math.PI) * 1.3;\n\tskin.rightLeg.rotation.x = Math.cos(time) * 1.3;\n\n\t// Arm swing\n\tskin.leftArm.rotation.x = Math.cos(time) * 1.5;\n\tskin.rightArm.rotation.x = Math.cos(time + Math.PI) * 1.5;\n\tlet basicArmRotationZ = Math.PI * 0.1;\n\tskin.leftArm.rotation.z = Math.cos(time) * 0.1 + basicArmRotationZ;\n\tskin.rightArm.rotation.z = Math.cos(time + Math.PI) * 0.1 - basicArmRotationZ;\n\n\t// Jumping\n\tplayer.position.y = Math.cos(time * 2);\n\t// Dodging when running\n\tplayer.position.x = Math.cos(time) * 0.15;\n\t// Slightly tilting when running\n\tplayer.rotation.z = Math.cos(time + Math.PI) * 0.01;\n\n\t// Apply higher swing frequency, lower amplitude,\n\t// and greater basic rotation around x axis,\n\t// to cape when running.\n\tlet basicCapeRotationX = Math.PI * 0.3;\n\tplayer.cape.rotation.x = Math.sin(time * 2) * 0.1 + basicCapeRotationX;\n\n\t// What about head shaking?\n\t// You shouldn't glance right and left when running dude :P\n};\n\nRunningAnimation.naturalSpeed = 13;\n\nlet RotatingAnimation = (player, time) => {\n\tplayer.rotation.y = time;\n};\n\nRotatingAnimation.naturalSpeed = 1;\n\nexport {\n\tCompositeAnimation,\n\tinvokeAnimation,\n\tWalkingAnimation,\n\tRunningAnimation,\n\tRotatingAnimation\n};\n","import * as THREE from \"three\";\nimport { PlayerObject } from \"./model\";\nimport { OrbitControls } from \"./orbit_controls\";\nimport { invokeAnimation } from \"./animation\";\n\nfunction copyImage(context, sX, sY, w, h, dX, dY, flipHorizontal) {\n\tlet imgData = context.getImageData(sX, sY, w, h);\n\tif (flipHorizontal) {\n\t\tfor (let y = 0; y < h; y++) {\n\t\t\tfor (let x = 0; x < (w / 2); x++) {\n\t\t\t\tlet index = (x + y * w) * 4;\n\t\t\t\tlet index2 = ((w - x - 1) + y * w) * 4;\n\t\t\t\tlet pA1 = imgData.data[index];\n\t\t\t\tlet pA2 = imgData.data[index + 1];\n\t\t\t\tlet pA3 = imgData.data[index + 2];\n\t\t\t\tlet pA4 = imgData.data[index + 3];\n\n\t\t\t\tlet pB1 = imgData.data[index2];\n\t\t\t\tlet pB2 = imgData.data[index2 + 1];\n\t\t\t\tlet pB3 = imgData.data[index2 + 2];\n\t\t\t\tlet pB4 = imgData.data[index2 + 3];\n\n\t\t\t\timgData.data[index] = pB1;\n\t\t\t\timgData.data[index + 1] = pB2;\n\t\t\t\timgData.data[index + 2] = pB3;\n\t\t\t\timgData.data[index + 3] = pB4;\n\n\t\t\t\timgData.data[index2] = pA1;\n\t\t\t\timgData.data[index2 + 1] = pA2;\n\t\t\t\timgData.data[index2 + 2] = pA3;\n\t\t\t\timgData.data[index2 + 3] = pA4;\n\t\t\t}\n\t\t}\n\t}\n\tcontext.putImageData(imgData, dX, dY);\n}\n\nfunction convertSkinTo1_8(context, width) {\n\tlet scale = width / 64.0;\n\tlet copySkin = (context, sX, sY, w, h, dX, dY, flipHorizontal) => copyImage(context, sX * scale, sY * scale, w * scale, h * scale, dX * scale, dY * scale, flipHorizontal);\n\n\tcopySkin(context, 4, 16, 4, 4, 20, 48, true); // Top Leg\n\tcopySkin(context, 8, 16, 4, 4, 24, 48, true); // Bottom Leg\n\tcopySkin(context, 0, 20, 4, 12, 24, 52, true); // Outer Leg\n\tcopySkin(context, 4, 20, 4, 12, 20, 52, true); // Front Leg\n\tcopySkin(context, 8, 20, 4, 12, 16, 52, true); // Inner Leg\n\tcopySkin(context, 12, 20, 4, 12, 28, 52, true); // Back Leg\n\tcopySkin(context, 44, 16, 4, 4, 36, 48, true); // Top Arm\n\tcopySkin(context, 48, 16, 4, 4, 40, 48, true); // Bottom Arm\n\tcopySkin(context, 40, 20, 4, 12, 40, 52, true); // Outer Arm\n\tcopySkin(context, 44, 20, 4, 12, 36, 52, true); // Front Arm\n\tcopySkin(context, 48, 20, 4, 12, 32, 52, true); // Inner Arm\n\tcopySkin(context, 52, 20, 4, 12, 44, 52, true); // Back Arm\n}\n\nclass SkinViewer {\n\tconstructor(options) {\n\t\tthis.domElement = options.domElement;\n\t\tthis.animation = options.animation || null;\n\t\tthis.animationPaused = false;\n\t\tthis.animationTime = 0;\n\t\tthis.disposed = false;\n\n\t\t// texture\n\t\tthis.skinImg = new Image();\n\t\tthis.skinCanvas = document.createElement(\"canvas\");\n\t\tthis.skinTexture = new THREE.Texture(this.skinCanvas);\n\t\tthis.skinTexture.magFilter = THREE.NearestFilter;\n\t\tthis.skinTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.capeImg = new Image();\n\t\tthis.capeCanvas = document.createElement(\"canvas\");\n\t\tthis.capeTexture = new THREE.Texture(this.capeCanvas);\n\t\tthis.capeTexture.magFilter = THREE.NearestFilter;\n\t\tthis.capeTexture.minFilter = THREE.NearestMipMapNearestFilter;\n\n\t\tthis.layer1Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, side: THREE.FrontSide });\n\t\tthis.layer2Material = new THREE.MeshBasicMaterial({ map: this.skinTexture, transparent: true, opacity: 1, side: THREE.DoubleSide });\n\t\tthis.capeMaterial = new THREE.MeshBasicMaterial({ map: this.capeTexture });\n\n\t\t// scene\n\t\tthis.scene = new THREE.Scene();\n\n\t\t// Use smaller fov to avoid distortion\n\t\tthis.camera = new THREE.PerspectiveCamera(40);\n\t\tthis.camera.position.y = -12;\n\t\tthis.camera.position.z = 60;\n\n\t\tthis.renderer = new THREE.WebGLRenderer({ angleRot: true, alpha: true, antialias: false });\n\t\tthis.renderer.setSize(300, 300); // default size\n\t\tthis.renderer.context.getShaderInfoLog = () => \"\"; // shut firefox up\n\t\tthis.domElement.appendChild(this.renderer.domElement);\n\n\t\tthis.playerObject = new PlayerObject(options.slim === true, this.layer1Material, this.layer2Material, this.capeMaterial);\n\t\tthis.scene.add(this.playerObject);\n\n\t\t// texture loading\n\t\tthis.skinImg.crossOrigin = \"\";\n\t\tthis.skinImg.onerror = () => console.error(\"Failed loading \" + this.skinImg.src);\n\t\tthis.skinImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.skinImg.width !== this.skinImg.height) {\n\t\t\t\tif (this.skinImg.width === 2 * this.skinImg.height) {\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad skin size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skinContext = this.skinCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.width = width;\n\t\t\t\tthis.skinCanvas.height = width;\n\t\t\t\tskinContext.clearRect(0, 0, width, width);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, width, width / 2.0);\n\t\t\t\tconvertSkinTo1_8(skinContext, width);\n\t\t\t} else {\n\t\t\t\tthis.skinCanvas.width = this.skinImg.width;\n\t\t\t\tthis.skinCanvas.height = this.skinImg.height;\n\t\t\t\tskinContext.clearRect(0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t\tskinContext.drawImage(this.skinImg, 0, 0, this.skinCanvas.width, this.skinCanvas.height);\n\t\t\t}\n\n\t\t\tthis.skinTexture.needsUpdate = true;\n\t\t\tthis.layer1Material.needsUpdate = true;\n\t\t\tthis.layer2Material.needsUpdate = true;\n\n\t\t\tthis.playerObject.skin.visible = true;\n\t\t};\n\n\t\tthis.capeImg.crossOrigin = \"\";\n\t\tthis.capeImg.onerror = () => console.error(\"Failed loading \" + this.capeImg.src);\n\t\tthis.capeImg.onload = () => {\n\t\t\tlet isOldFormat = false;\n\t\t\tif (this.capeImg.width !== 2 * this.capeImg.height) {\n\t\t\t\tif (this.capeImg.width * 17 == this.capeImg.height * 22) {\n\t\t\t\t\t// width/height = 22/17\n\t\t\t\t\tisOldFormat = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Bad cape size\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet capeContext = this.capeCanvas.getContext(\"2d\");\n\t\t\tif (isOldFormat) {\n\t\t\t\tlet width = this.capeImg.width * 64 / 22;\n\t\t\t\tthis.capeCanvas.width = width;\n\t\t\t\tthis.capeCanvas.height = width / 2;\n\t\t\t} else {\n\t\t\t\tthis.capeCanvas.width = this.capeImg.width;\n\t\t\t\tthis.capeCanvas.height = this.capeImg.height;\n\t\t\t}\n\t\t\tcapeContext.clearRect(0, 0, this.capeCanvas.width, this.capeCanvas.height);\n\t\t\tcapeContext.drawImage(this.capeImg, 0, 0, this.capeImg.width, this.capeImg.height);\n\n\t\t\tthis.capeTexture.needsUpdate = true;\n\t\t\tthis.capeMaterial.needsUpdate = true;\n\n\t\t\tthis.playerObject.cape.visible = true;\n\t\t};\n\n\t\tif (options.skinUrl) this.skinUrl = options.skinUrl;\n\t\tif (options.capeUrl) this.capeUrl = options.capeUrl;\n\t\tif (options.width) this.width = options.width;\n\t\tif (options.height) this.height = options.height;\n\n\t\tlet draw = () => {\n\t\t\tif (this.disposed) return;\n\t\t\twindow.requestAnimationFrame(draw);\n\t\t\tif (!this.animationPaused) {\n\t\t\t\tthis.animationTime++;\n\t\t\t\tif (this.animation) {\n\t\t\t\t\tinvokeAnimation(this.animation, this.playerObject, this.animationTime / 100.0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t};\n\t\tdraw();\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.camera.aspect = width / height;\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.renderer.setSize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis.disposed = true;\n\t\tthis.domElement.removeChild(this.renderer.domElement);\n\t\tthis.renderer.dispose();\n\t\tthis.skinTexture.dispose();\n\t\tthis.capeTexture.dispose();\n\t}\n\n\tget skinUrl() {\n\t\treturn this.skinImg.src;\n\t}\n\n\tset skinUrl(url) {\n\t\tthis.skinImg.src = url;\n\t}\n\n\tget capeUrl() {\n\t\treturn this.capeImg.src;\n\t}\n\n\tset capeUrl(url) {\n\t\tthis.capeImg.src = url;\n\t}\n\n\tget width() {\n\t\treturn this.renderer.getSize().width;\n\t}\n\n\tset width(newWidth) {\n\t\tthis.setSize(newWidth, this.height);\n\t}\n\n\tget height() {\n\t\treturn this.renderer.getSize().height;\n\t}\n\n\tset height(newHeight) {\n\t\tthis.setSize(this.width, newHeight);\n\t}\n}\n\nclass MouseControl {\n\tconstructor(skinViewer) {\n\t\tthis.skinViewer = skinViewer;\n\n\t\tthis.orbitControls = new OrbitControls(skinViewer.camera, skinViewer.renderer.domElement);\n\t\tthis.orbitControls.enablePan = false;\n\t\tthis.orbitControls.target = new THREE.Vector3(0, -12, 0);\n\t\tthis.orbitControls.minDistance = 10;\n\t\tthis.orbitControls.maxDistance = 256;\n\t\tthis.orbitControls.update();\n\t}\n\n\tget rotation() {\n\t\treturn this.orbitControls.enableRotate;\n\t}\n\n\tset rotation(value) {\n\t\tthis.orbitControls.enableRotate = value;\n\t}\n\n\tget zoom() {\n\t\treturn this.orbitControls.enableZoom;\n\t}\n\n\tset zoom(value) {\n\t\tthis.orbitControls.enableZoom = value;\n\t}\n\n\tget pan() {\n\t\treturn this.orbitControls.enablePan;\n\t}\n\n\tset pan(value) {\n\t\tthis.orbitControls.enablePan = value;\n\t}\n\n\tdispose() {\n\t\tthis.orbitControls.dispose();\n\t}\n}\n\nexport { SkinViewer, MouseControl };\n"],"names":["toFaceVertices","x1","y1","x2","y2","w","h","THREE","toSkinVertices","toCapeVertices","addVertices","box","top","bottom","left","front","right","back","faceVertexUvs","esp","SkinObject","slim","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","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","_animationNaturalSpeed","naturalSpeed","dt","handles","Set","handle","remove","delete","forEach","WalkingAnimation","sin","basicArmRotationZ","cos","basicCapeRotationX","RunningAnimation","RotatingAnimation","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","angleRot","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","MouseControl","skinViewer","orbitControls","value"],"mappings":"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"} \ No newline at end of file