UNPKG

meta-client

Version:
2,244 lines (1,611 loc) 1.64 MB
// modules are defined as an array // [ module function, map of requires ] // // map of requires is short require name -> numeric require // // anything defined in a previous bundle is accessed via the // orig method which is the require for previous bundles // eslint-disable-next-line no-global-assign parcelRequire = (function (modules, cache, entry, globalName) { // Save the require from previous bundle to this closure if any var previousRequire = typeof parcelRequire === 'function' && parcelRequire; var nodeRequire = typeof require === 'function' && require; function newRequire(name, jumped) { if (!cache[name]) { if (!modules[name]) { // if we cannot find the module within our internal map or // cache jump to the current global require ie. the last bundle // that was added to the page. var currentRequire = typeof parcelRequire === 'function' && parcelRequire; if (!jumped && currentRequire) { return currentRequire(name, true); } // If there are other bundles on this page the require from the // previous one is saved to 'previousRequire'. Repeat this as // many times as there are bundles until the module is found or // we exhaust the require chain. if (previousRequire) { return previousRequire(name, true); } // Try the node require function if it exists. if (nodeRequire && typeof name === 'string') { return nodeRequire(name); } var err = new Error('Cannot find module \'' + name + '\''); err.code = 'MODULE_NOT_FOUND'; throw err; } localRequire.resolve = resolve; var module = cache[name] = new newRequire.Module(name); modules[name][0].call(module.exports, localRequire, module, module.exports, this); } return cache[name].exports; function localRequire(x){ return newRequire(localRequire.resolve(x)); } function resolve(x){ return modules[name][1][x] || x; } } function Module(moduleName) { this.id = moduleName; this.bundle = newRequire; this.exports = {}; } newRequire.isParcelRequire = true; newRequire.Module = Module; newRequire.modules = modules; newRequire.cache = cache; newRequire.parent = previousRequire; newRequire.register = function (id, exports) { modules[id] = [function (require, module) { module.exports = exports; }, {}]; }; for (var i = 0; i < entry.length; i++) { newRequire(entry[i]); } if (entry.length) { // Expose entry point to Node, AMD or browser globals // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js var mainExports = newRequire(entry[entry.length - 1]); // CommonJS if (typeof exports === "object" && typeof module !== "undefined") { module.exports = mainExports; // RequireJS } else if (typeof define === "function" && define.amd) { define(function () { return mainExports; }); // <script> } else if (globalName) { this[globalName] = mainExports; } } // Override the current require with this new one return newRequire; })({"node_modules\\meta-client\\package.json":[function(require,module,exports) { module.exports = { "_from": "meta-client@0.0.0-c31", "_id": "meta-client@0.0.0-c31", "_inBundle": false, "_integrity": "sha512-eXnZTp8RBqhfkDrXKUyEsaSQf1k16IdiOgY7YWJgFb97uVXoB+AoNslKBsUV/UwL5ZvuDfRU+Nbgm4tbzpOU9Q==", "_location": "/meta-client", "_phantomChildren": {}, "_requested": { "type": "version", "registry": true, "raw": "meta-client@0.0.0-c31", "name": "meta-client", "escapedName": "meta-client", "rawSpec": "0.0.0-c31", "saveSpec": null, "fetchSpec": "0.0.0-c31" }, "_requiredBy": [ "#USER", "/" ], "_resolved": "https://registry.npmjs.org/meta-client/-/meta-client-0.0.0-c31.tgz", "_shasum": "abf60c999181372cc1566010dac74aceab8c6c0f", "_spec": "meta-client@0.0.0-c31", "_where": "C:\\Users\\florianmaxim\\work\\meta\\examples\\1", "author": { "name": "Florian Maxim" }, "bugs": { "url": "https://github.com/florianmaxim/meta/issues" }, "bundleDependencies": false, "dependencies": { "oimo": "^1.0.9", "three": "^0.94.0" }, "deprecated": false, "description": "Meta.js (Client)", "devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-root-import": "^6.1.0", "babel-preset-env": "^1.6.0", "documentation": "^6.1.0", "npx": "^10.0.1", "parcel-bundler": "^1.9.7" }, "homepage": "https://metajs.org", "license": "ISC", "main": "lib/index.js", "name": "meta-client", "repository": { "type": "git", "url": "git+https://github.com/florianmaxim/meta.git" }, "scripts": { "build": "npx babel src --out-dir lib --no-comments --minified", "build:docs": "documentation build src/** --shallow -f html -o docs", "dev": "parcel index.html", "prepublish": "npm run build", "test": "npm run build" }, "version": "0.0.0-c31" } ; },{}],"node_modules\\meta-client\\config.js":[function(require,module,exports) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _package = require('./package.json'); exports.default = { version: _package.version, log: false, space: { color: 0xe0e0e0 }, device: { headMountedDisplay: { controllerModels: false }, desktop: { container: { position: { x: 0, y: 0, z: 0 } }, camera: { position: { x: 0, y: 0, z: 3 } }, globe: { opacity: 0, color: 0xff0000, wireframe: true, transparency: true }, acceleration: 125 }, mobile: { container: { position: { x: 0, y: 0, z: 0 } }, camera: { position: { x: 0, y: 0, z: 3 } }, globe: { opacity: 0, color: 0xff0000, wireframe: true, transparency: true } } } }; },{"./package.json":"node_modules\\meta-client\\package.json"}],"node_modules\\three\\build\\three.module.js":[function(require,module,exports) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); // Polyfills if (Number.EPSILON === undefined) { Number.EPSILON = Math.pow(2, -52); } if (Number.isInteger === undefined) { // Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger Number.isInteger = function (value) { return typeof value === 'number' && isFinite(value) && Math.floor(value) === value; }; } // if (Math.sign === undefined) { // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign Math.sign = function (x) { return x < 0 ? -1 : x > 0 ? 1 : +x; }; } if ('name' in Function.prototype === false) { // Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name Object.defineProperty(Function.prototype, 'name', { get: function () { return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]; } }); } if (Object.assign === undefined) { // Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign (function () { Object.assign = function (target) { if (target === undefined || target === null) { throw new TypeError('Cannot convert undefined or null to object'); } var output = Object(target); for (var index = 1; index < arguments.length; index++) { var source = arguments[index]; if (source !== undefined && source !== null) { for (var nextKey in source) { if (Object.prototype.hasOwnProperty.call(source, nextKey)) { output[nextKey] = source[nextKey]; } } } } return output; }; })(); } /** * https://github.com/mrdoob/eventdispatcher.js/ */ function EventDispatcher() {} Object.assign(EventDispatcher.prototype, { addEventListener: function (type, listener) { if (this._listeners === undefined) this._listeners = {}; var listeners = this._listeners; if (listeners[type] === undefined) { listeners[type] = []; } if (listeners[type].indexOf(listener) === -1) { listeners[type].push(listener); } }, hasEventListener: function (type, listener) { if (this._listeners === undefined) return false; var listeners = this._listeners; return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1; }, removeEventListener: function (type, listener) { if (this._listeners === undefined) return; var listeners = this._listeners; var listenerArray = listeners[type]; if (listenerArray !== undefined) { var index = listenerArray.indexOf(listener); if (index !== -1) { listenerArray.splice(index, 1); } } }, dispatchEvent: function (event) { if (this._listeners === undefined) return; var listeners = this._listeners; var listenerArray = listeners[event.type]; if (listenerArray !== undefined) { event.target = this; var array = listenerArray.slice(0); for (var i = 0, l = array.length; i < l; i++) { array[i].call(this, event); } } } }); var REVISION = '94'; var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; var CullFaceNone = 0; var CullFaceBack = 1; var CullFaceFront = 2; var CullFaceFrontBack = 3; var FrontFaceDirectionCW = 0; var FrontFaceDirectionCCW = 1; var BasicShadowMap = 0; var PCFShadowMap = 1; var PCFSoftShadowMap = 2; var FrontSide = 0; var BackSide = 1; var DoubleSide = 2; var FlatShading = 1; var SmoothShading = 2; var NoColors = 0; var FaceColors = 1; var VertexColors = 2; var NoBlending = 0; var NormalBlending = 1; var AdditiveBlending = 2; var SubtractiveBlending = 3; var MultiplyBlending = 4; var CustomBlending = 5; var AddEquation = 100; var SubtractEquation = 101; var ReverseSubtractEquation = 102; var MinEquation = 103; var MaxEquation = 104; var ZeroFactor = 200; var OneFactor = 201; var SrcColorFactor = 202; var OneMinusSrcColorFactor = 203; var SrcAlphaFactor = 204; var OneMinusSrcAlphaFactor = 205; var DstAlphaFactor = 206; var OneMinusDstAlphaFactor = 207; var DstColorFactor = 208; var OneMinusDstColorFactor = 209; var SrcAlphaSaturateFactor = 210; var NeverDepth = 0; var AlwaysDepth = 1; var LessDepth = 2; var LessEqualDepth = 3; var EqualDepth = 4; var GreaterEqualDepth = 5; var GreaterDepth = 6; var NotEqualDepth = 7; var MultiplyOperation = 0; var MixOperation = 1; var AddOperation = 2; var NoToneMapping = 0; var LinearToneMapping = 1; var ReinhardToneMapping = 2; var Uncharted2ToneMapping = 3; var CineonToneMapping = 4; var UVMapping = 300; var CubeReflectionMapping = 301; var CubeRefractionMapping = 302; var EquirectangularReflectionMapping = 303; var EquirectangularRefractionMapping = 304; var SphericalReflectionMapping = 305; var CubeUVReflectionMapping = 306; var CubeUVRefractionMapping = 307; var RepeatWrapping = 1000; var ClampToEdgeWrapping = 1001; var MirroredRepeatWrapping = 1002; var NearestFilter = 1003; var NearestMipMapNearestFilter = 1004; var NearestMipMapLinearFilter = 1005; var LinearFilter = 1006; var LinearMipMapNearestFilter = 1007; var LinearMipMapLinearFilter = 1008; var UnsignedByteType = 1009; var ByteType = 1010; var ShortType = 1011; var UnsignedShortType = 1012; var IntType = 1013; var UnsignedIntType = 1014; var FloatType = 1015; var HalfFloatType = 1016; var UnsignedShort4444Type = 1017; var UnsignedShort5551Type = 1018; var UnsignedShort565Type = 1019; var UnsignedInt248Type = 1020; var AlphaFormat = 1021; var RGBFormat = 1022; var RGBAFormat = 1023; var LuminanceFormat = 1024; var LuminanceAlphaFormat = 1025; var RGBEFormat = RGBAFormat; var DepthFormat = 1026; var DepthStencilFormat = 1027; var RGB_S3TC_DXT1_Format = 33776; var RGBA_S3TC_DXT1_Format = 33777; var RGBA_S3TC_DXT3_Format = 33778; var RGBA_S3TC_DXT5_Format = 33779; var RGB_PVRTC_4BPPV1_Format = 35840; var RGB_PVRTC_2BPPV1_Format = 35841; var RGBA_PVRTC_4BPPV1_Format = 35842; var RGBA_PVRTC_2BPPV1_Format = 35843; var RGB_ETC1_Format = 36196; var RGBA_ASTC_4x4_Format = 37808; var RGBA_ASTC_5x4_Format = 37809; var RGBA_ASTC_5x5_Format = 37810; var RGBA_ASTC_6x5_Format = 37811; var RGBA_ASTC_6x6_Format = 37812; var RGBA_ASTC_8x5_Format = 37813; var RGBA_ASTC_8x6_Format = 37814; var RGBA_ASTC_8x8_Format = 37815; var RGBA_ASTC_10x5_Format = 37816; var RGBA_ASTC_10x6_Format = 37817; var RGBA_ASTC_10x8_Format = 37818; var RGBA_ASTC_10x10_Format = 37819; var RGBA_ASTC_12x10_Format = 37820; var RGBA_ASTC_12x12_Format = 37821; var LoopOnce = 2200; var LoopRepeat = 2201; var LoopPingPong = 2202; var InterpolateDiscrete = 2300; var InterpolateLinear = 2301; var InterpolateSmooth = 2302; var ZeroCurvatureEnding = 2400; var ZeroSlopeEnding = 2401; var WrapAroundEnding = 2402; var TrianglesDrawMode = 0; var TriangleStripDrawMode = 1; var TriangleFanDrawMode = 2; var LinearEncoding = 3000; var sRGBEncoding = 3001; var GammaEncoding = 3007; var RGBEEncoding = 3002; var LogLuvEncoding = 3003; var RGBM7Encoding = 3004; var RGBM16Encoding = 3005; var RGBDEncoding = 3006; var BasicDepthPacking = 3200; var RGBADepthPacking = 3201; var TangentSpaceNormalMap = 0; var ObjectSpaceNormalMap = 1; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ var _Math = { DEG2RAD: Math.PI / 180, RAD2DEG: 180 / Math.PI, generateUUID: function () { // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 var lut = []; for (var i = 0; i < 256; i++) { lut[i] = (i < 16 ? '0' : '') + i.toString(16); } return function generateUUID() { var d0 = Math.random() * 0xffffffff | 0; var d1 = Math.random() * 0xffffffff | 0; var d2 = Math.random() * 0xffffffff | 0; var d3 = Math.random() * 0xffffffff | 0; var uuid = lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; // .toUpperCase() here flattens concatenated strings to save heap memory space. return uuid.toUpperCase(); }; }(), clamp: function (value, min, max) { return Math.max(min, Math.min(max, value)); }, // compute euclidian modulo of m % n // https://en.wikipedia.org/wiki/Modulo_operation euclideanModulo: function (n, m) { return (n % m + m) % m; }, // Linear mapping from range <a1, a2> to range <b1, b2> mapLinear: function (x, a1, a2, b1, b2) { return b1 + (x - a1) * (b2 - b1) / (a2 - a1); }, // https://en.wikipedia.org/wiki/Linear_interpolation lerp: function (x, y, t) { return (1 - t) * x + t * y; }, // http://en.wikipedia.org/wiki/Smoothstep smoothstep: function (x, min, max) { if (x <= min) return 0; if (x >= max) return 1; x = (x - min) / (max - min); return x * x * (3 - 2 * x); }, smootherstep: function (x, min, max) { if (x <= min) return 0; if (x >= max) return 1; x = (x - min) / (max - min); return x * x * x * (x * (x * 6 - 15) + 10); }, // Random integer from <low, high> interval randInt: function (low, high) { return low + Math.floor(Math.random() * (high - low + 1)); }, // Random float from <low, high> interval randFloat: function (low, high) { return low + Math.random() * (high - low); }, // Random float from <-range/2, range/2> interval randFloatSpread: function (range) { return range * (0.5 - Math.random()); }, degToRad: function (degrees) { return degrees * _Math.DEG2RAD; }, radToDeg: function (radians) { return radians * _Math.RAD2DEG; }, isPowerOfTwo: function (value) { return (value & value - 1) === 0 && value !== 0; }, ceilPowerOfTwo: function (value) { return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); }, floorPowerOfTwo: function (value) { return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); } }; /** * @author mrdoob / http://mrdoob.com/ * @author philogb / http://blog.thejit.org/ * @author egraether / http://egraether.com/ * @author zz85 / http://www.lab4games.net/zz85/blog */ function Vector2(x, y) { this.x = x || 0; this.y = y || 0; } Object.defineProperties(Vector2.prototype, { "width": { get: function () { return this.x; }, set: function (value) { this.x = value; } }, "height": { get: function () { return this.y; }, set: function (value) { this.y = value; } } }); Object.assign(Vector2.prototype, { isVector2: true, set: function (x, y) { this.x = x; this.y = y; return this; }, setScalar: function (scalar) { this.x = scalar; this.y = scalar; return this; }, setX: function (x) { this.x = x; return this; }, setY: function (y) { this.y = y; return this; }, setComponent: function (index, value) { switch (index) { case 0: this.x = value;break; case 1: this.y = value;break; default: throw new Error('index is out of range: ' + index); } return this; }, getComponent: function (index) { switch (index) { case 0: return this.x; case 1: return this.y; default: throw new Error('index is out of range: ' + index); } }, clone: function () { return new this.constructor(this.x, this.y); }, copy: function (v) { this.x = v.x; this.y = v.y; return this; }, add: function (v, w) { if (w !== undefined) { console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.'); return this.addVectors(v, w); } this.x += v.x; this.y += v.y; return this; }, addScalar: function (s) { this.x += s; this.y += s; return this; }, addVectors: function (a, b) { this.x = a.x + b.x; this.y = a.y + b.y; return this; }, addScaledVector: function (v, s) { this.x += v.x * s; this.y += v.y * s; return this; }, sub: function (v, w) { if (w !== undefined) { console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.'); return this.subVectors(v, w); } this.x -= v.x; this.y -= v.y; return this; }, subScalar: function (s) { this.x -= s; this.y -= s; return this; }, subVectors: function (a, b) { this.x = a.x - b.x; this.y = a.y - b.y; return this; }, multiply: function (v) { this.x *= v.x; this.y *= v.y; return this; }, multiplyScalar: function (scalar) { this.x *= scalar; this.y *= scalar; return this; }, divide: function (v) { this.x /= v.x; this.y /= v.y; return this; }, divideScalar: function (scalar) { return this.multiplyScalar(1 / scalar); }, applyMatrix3: function (m) { var x = this.x, y = this.y; var e = m.elements; this.x = e[0] * x + e[3] * y + e[6]; this.y = e[1] * x + e[4] * y + e[7]; return this; }, min: function (v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); return this; }, max: function (v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); return this; }, clamp: function (min, max) { // assumes min < max, componentwise this.x = Math.max(min.x, Math.min(max.x, this.x)); this.y = Math.max(min.y, Math.min(max.y, this.y)); return this; }, clampScalar: function () { var min = new Vector2(); var max = new Vector2(); return function clampScalar(minVal, maxVal) { min.set(minVal, minVal); max.set(maxVal, maxVal); return this.clamp(min, max); }; }(), clampLength: function (min, max) { var length = this.length(); return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length))); }, floor: function () { this.x = Math.floor(this.x); this.y = Math.floor(this.y); return this; }, ceil: function () { this.x = Math.ceil(this.x); this.y = Math.ceil(this.y); return this; }, round: function () { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; }, roundToZero: function () { this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x); this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y); return this; }, negate: function () { this.x = -this.x; this.y = -this.y; return this; }, dot: function (v) { return this.x * v.x + this.y * v.y; }, lengthSq: function () { return this.x * this.x + this.y * this.y; }, length: function () { return Math.sqrt(this.x * this.x + this.y * this.y); }, manhattanLength: function () { return Math.abs(this.x) + Math.abs(this.y); }, normalize: function () { return this.divideScalar(this.length() || 1); }, angle: function () { // computes the angle in radians with respect to the positive x-axis var angle = Math.atan2(this.y, this.x); if (angle < 0) angle += 2 * Math.PI; return angle; }, distanceTo: function (v) { return Math.sqrt(this.distanceToSquared(v)); }, distanceToSquared: function (v) { var dx = this.x - v.x, dy = this.y - v.y; return dx * dx + dy * dy; }, manhattanDistanceTo: function (v) { return Math.abs(this.x - v.x) + Math.abs(this.y - v.y); }, setLength: function (length) { return this.normalize().multiplyScalar(length); }, lerp: function (v, alpha) { this.x += (v.x - this.x) * alpha; this.y += (v.y - this.y) * alpha; return this; }, lerpVectors: function (v1, v2, alpha) { return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1); }, equals: function (v) { return v.x === this.x && v.y === this.y; }, fromArray: function (array, offset) { if (offset === undefined) offset = 0; this.x = array[offset]; this.y = array[offset + 1]; return this; }, toArray: function (array, offset) { if (array === undefined) array = []; if (offset === undefined) offset = 0; array[offset] = this.x; array[offset + 1] = this.y; return array; }, fromBufferAttribute: function (attribute, index, offset) { if (offset !== undefined) { console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().'); } this.x = attribute.getX(index); this.y = attribute.getY(index); return this; }, rotateAround: function (center, angle) { var c = Math.cos(angle), s = Math.sin(angle); var x = this.x - center.x; var y = this.y - center.y; this.x = x * c - y * s + center.x; this.y = x * s + y * c + center.y; return this; } }); /** * @author mrdoob / http://mrdoob.com/ * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author jordi_ros / http://plattsoft.com * @author D1plo1d / http://github.com/D1plo1d * @author alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author timknip / http://www.floorplanner.com/ * @author bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley */ function Matrix4() { this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; if (arguments.length > 0) { console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.'); } } Object.assign(Matrix4.prototype, { isMatrix4: true, set: function (n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { var te = this.elements; te[0] = n11;te[4] = n12;te[8] = n13;te[12] = n14; te[1] = n21;te[5] = n22;te[9] = n23;te[13] = n24; te[2] = n31;te[6] = n32;te[10] = n33;te[14] = n34; te[3] = n41;te[7] = n42;te[11] = n43;te[15] = n44; return this; }, identity: function () { this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); return this; }, clone: function () { return new Matrix4().fromArray(this.elements); }, copy: function (m) { var te = this.elements; var me = m.elements; te[0] = me[0];te[1] = me[1];te[2] = me[2];te[3] = me[3]; te[4] = me[4];te[5] = me[5];te[6] = me[6];te[7] = me[7]; te[8] = me[8];te[9] = me[9];te[10] = me[10];te[11] = me[11]; te[12] = me[12];te[13] = me[13];te[14] = me[14];te[15] = me[15]; return this; }, copyPosition: function (m) { var te = this.elements, me = m.elements; te[12] = me[12]; te[13] = me[13]; te[14] = me[14]; return this; }, extractBasis: function (xAxis, yAxis, zAxis) { xAxis.setFromMatrixColumn(this, 0); yAxis.setFromMatrixColumn(this, 1); zAxis.setFromMatrixColumn(this, 2); return this; }, makeBasis: function (xAxis, yAxis, zAxis) { this.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1); return this; }, extractRotation: function () { var v1 = new Vector3(); return function extractRotation(m) { // this method does not support reflection matrices var te = this.elements; var me = m.elements; var scaleX = 1 / v1.setFromMatrixColumn(m, 0).length(); var scaleY = 1 / v1.setFromMatrixColumn(m, 1).length(); var scaleZ = 1 / v1.setFromMatrixColumn(m, 2).length(); te[0] = me[0] * scaleX; te[1] = me[1] * scaleX; te[2] = me[2] * scaleX; te[3] = 0; te[4] = me[4] * scaleY; te[5] = me[5] * scaleY; te[6] = me[6] * scaleY; te[7] = 0; te[8] = me[8] * scaleZ; te[9] = me[9] * scaleZ; te[10] = me[10] * scaleZ; te[11] = 0; te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; }; }(), makeRotationFromEuler: function (euler) { if (!(euler && euler.isEuler)) { console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.'); } var te = this.elements; var x = euler.x, y = euler.y, z = euler.z; var a = Math.cos(x), b = Math.sin(x); var c = Math.cos(y), d = Math.sin(y); var e = Math.cos(z), f = Math.sin(z); if (euler.order === 'XYZ') { var ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = -c * f; te[8] = d; te[1] = af + be * d; te[5] = ae - bf * d; te[9] = -b * c; te[2] = bf - ae * d; te[6] = be + af * d; te[10] = a * c; } else if (euler.order === 'YXZ') { var ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce + df * b; te[4] = de * b - cf; te[8] = a * d; te[1] = a * f; te[5] = a * e; te[9] = -b; te[2] = cf * b - de; te[6] = df + ce * b; te[10] = a * c; } else if (euler.order === 'ZXY') { var ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce - df * b; te[4] = -a * f; te[8] = de + cf * b; te[1] = cf + de * b; te[5] = a * e; te[9] = df - ce * b; te[2] = -a * d; te[6] = b; te[10] = a * c; } else if (euler.order === 'ZYX') { var ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = be * d - af; te[8] = ae * d + bf; te[1] = c * f; te[5] = bf * d + ae; te[9] = af * d - be; te[2] = -d; te[6] = b * c; te[10] = a * c; } else if (euler.order === 'YZX') { var ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = bd - ac * f; te[8] = bc * f + ad; te[1] = f; te[5] = a * e; te[9] = -b * e; te[2] = -d * e; te[6] = ad * f + bc; te[10] = ac - bd * f; } else if (euler.order === 'XZY') { var ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = -f; te[8] = d * e; te[1] = ac * f + bd; te[5] = a * e; te[9] = ad * f - bc; te[2] = bc * f - ad; te[6] = b * e; te[10] = bd * f + ac; } // bottom row te[3] = 0; te[7] = 0; te[11] = 0; // last column te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; }, makeRotationFromQuaternion: function () { var zero = new Vector3(0, 0, 0); var one = new Vector3(1, 1, 1); return function makeRotationFromQuaternion(q) { return this.compose(zero, q, one); }; }(), lookAt: function () { var x = new Vector3(); var y = new Vector3(); var z = new Vector3(); return function lookAt(eye, target, up) { var te = this.elements; z.subVectors(eye, target); if (z.lengthSq() === 0) { // eye and target are in the same position z.z = 1; } z.normalize(); x.crossVectors(up, z); if (x.lengthSq() === 0) { // up and z are parallel if (Math.abs(up.z) === 1) { z.x += 0.0001; } else { z.z += 0.0001; } z.normalize(); x.crossVectors(up, z); } x.normalize(); y.crossVectors(z, x); te[0] = x.x;te[4] = y.x;te[8] = z.x; te[1] = x.y;te[5] = y.y;te[9] = z.y; te[2] = x.z;te[6] = y.z;te[10] = z.z; return this; }; }(), multiply: function (m, n) { if (n !== undefined) { console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.'); return this.multiplyMatrices(m, n); } return this.multiplyMatrices(this, m); }, premultiply: function (m) { return this.multiplyMatrices(m, this); }, multiplyMatrices: function (a, b) { var ae = a.elements; var be = b.elements; var te = this.elements; var a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; var a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; var a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; var a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; var b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; var b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; var b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; var b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; return this; }, multiplyScalar: function (s) { var te = this.elements; te[0] *= s;te[4] *= s;te[8] *= s;te[12] *= s; te[1] *= s;te[5] *= s;te[9] *= s;te[13] *= s; te[2] *= s;te[6] *= s;te[10] *= s;te[14] *= s; te[3] *= s;te[7] *= s;te[11] *= s;te[15] *= s; return this; }, applyToBufferAttribute: function () { var v1 = new Vector3(); return function applyToBufferAttribute(attribute) { for (var i = 0, l = attribute.count; i < l; i++) { v1.x = attribute.getX(i); v1.y = attribute.getY(i); v1.z = attribute.getZ(i); v1.applyMatrix4(this); attribute.setXYZ(i, v1.x, v1.y, v1.z); } return attribute; }; }(), determinant: function () { var te = this.elements; var n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12]; var n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13]; var n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14]; var n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15]; //TODO: make this more efficient //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) return n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31); }, transpose: function () { var te = this.elements; var tmp; tmp = te[1];te[1] = te[4];te[4] = tmp; tmp = te[2];te[2] = te[8];te[8] = tmp; tmp = te[6];te[6] = te[9];te[9] = tmp; tmp = te[3];te[3] = te[12];te[12] = tmp; tmp = te[7];te[7] = te[13];te[13] = tmp; tmp = te[11];te[11] = te[14];te[14] = tmp; return this; }, setPosition: function (v) { var te = this.elements; te[12] = v.x; te[13] = v.y; te[14] = v.z; return this; }, getInverse: function (m, throwOnDegenerate) { // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm var te = this.elements, me = m.elements, n11 = me[0], n21 = me[1], n31 = me[2], n41 = me[3], n12 = me[4], n22 = me[5], n32 = me[6], n42 = me[7], n13 = me[8], n23 = me[9], n33 = me[10], n43 = me[11], n14 = me[12], n24 = me[13], n34 = me[14], n44 = me[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; if (det === 0) { var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; if (throwOnDegenerate === true) { throw new Error(msg); } else { console.warn(msg); } return this.identity(); } var detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; te[4] = t12 * detInv; te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; te[8] = t13 * detInv; te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; te[12] = t14 * detInv; te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; return this; }, scale: function (v) { var te = this.elements; var x = v.x, y = v.y, z = v.z; te[0] *= x;te[4] *= y;te[8] *= z; te[1] *= x;te[5] *= y;te[9] *= z; te[2] *= x;te[6] *= y;te[10] *= z; te[3] *= x;te[7] *= y;te[11] *= z; return this; }, getMaxScaleOnAxis: function () { var te = this.elements; var scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2]; var scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6]; var scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10]; return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); }, makeTranslation: function (x, y, z) { this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1); return this; }, makeRotationX: function (theta) { var c = Math.cos(theta), s = Math.sin(theta); this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1); return this; }, makeRotationY: function (theta) { var c = Math.cos(theta), s = Math.sin(theta); this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1); return this; }, makeRotationZ: function (theta) { var c = Math.cos(theta), s = Math.sin(theta); this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); return this; }, makeRotationAxis: function (axis, angle) { // Based on http://www.gamedev.net/reference/articles/article1199.asp var c = Math.cos(angle); var s = Math.sin(angle); var t = 1 - c; var x = axis.x, y = axis.y, z = axis.z; var tx = t * x, ty = t * y; this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1); return this; }, makeScale: function (x, y, z) { this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1); return this; }, makeShear: function (x, y, z) { this.set(1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1); return this; }, compose: function (position, quaternion, scale) { var te = this.elements; var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; var x2 = x + x, y2 = y + y, z2 = z + z; var xx = x * x2, xy = x * y2, xz = x * z2; var yy = y * y2, yz = y * z2, zz = z * z2; var wx = w * x2, wy = w * y2, wz = w * z2; var sx = scale.x, sy = scale.y, sz = scale.z; te[0] = (1 - (yy + zz)) * sx; te[1] = (xy + wz) * sx; te[2] = (xz - wy) * sx; te[3] = 0; te[4] = (xy - wz) * sy; te[5] = (1 - (xx + zz)) * sy; te[6] = (yz + wx) * sy; te[7] = 0; te[8] = (xz + wy) * sz; te[9] = (yz - wx) * sz; te[10] = (1 - (xx + yy)) * sz; te[11] = 0; te[12] = position.x; te[13] = position.y; te[14] = position.z; te[15] = 1; return this; }, decompose: function () { var vector = new Vector3(); var matrix = new Matrix4(); return function decompose(position, quaternion, scale) { var te = this.elements; var sx = vector.set(te[0], te[1], te[2]).length(); var sy = vector.set(te[4], te[5], te[6]).length(); var sz = vector.set(te[8], te[9], te[10]).length(); // if determine is negative, we need to invert one scale var det = this.determinant(); if (det < 0) sx = -sx; position.x = te[12]; position.y = te[13]; position.z = te[14]; // scale the rotation part matrix.copy(this); var invSX = 1 / sx; var invSY = 1 / sy; var invSZ = 1 / sz; matrix.elements[0] *= invSX; matrix.elements[1] *= invSX; matrix.elements[2] *= invSX; matrix.elements[4] *= invSY; matrix.elements[5] *= invSY; matrix.elements[6] *= invSY; matrix.elements[8] *= invSZ; matrix.elements[9] *= invSZ; matrix.elements[10] *= invSZ; quaternion.setFromRotationMatrix(matrix); scale.x = sx; scale.y = sy; scale.z = sz; return this; }; }(), makePerspective: function (left, right, top, bottom, near, far) { if (far === undefined) { console.warn('THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.'); } var te = this.elements; var x = 2 * near / (right - left); var y = 2 * near / (top - bottom); var a = (right + left) / (right - left); var b = (top + bottom) / (top - bottom); var c = -(far + near) / (far - near); var d = -2 * far * near / (far - near); te[0] = x;te[4] = 0;te[8] = a;te[12] = 0; te[1] = 0;te[5] = y;te[9] = b;te[13] = 0; te[2] = 0;te[6] = 0;te[10] = c;te[14] = d; te[3] = 0;te[7] = 0;te[11] = -1;te[15] = 0; return this; }, makeOrthographic: function (left, right, top, bottom, near, far) { var te = this.elements; var w = 1.0 / (right - left); var h = 1.0 / (top - bottom); var p = 1.0 / (far - near); var x = (right + left) * w; var y = (top + bottom) * h; var z = (far + near) * p; te[0] = 2 * w;te[4] = 0;te[8] = 0;te[12] = -x; te[1] = 0;te[5] = 2 * h;te[9] = 0;te[13] = -y; te[2] = 0;te[6] = 0;te[10] = -2 * p;te[14] = -z; te[3] = 0;te[7] = 0;te[11] = 0;te[15] = 1; return this; }, equals: function (matrix) { var te = this.elements; var me = matrix.elements; for (var i = 0; i < 16; i++) { if (te[i] !== me[i]) return false; } return true; }, fromArray: function (array, offset) { if (offset === undefined) offset = 0; for (var i = 0; i < 16; i++) { this.elements[i] = array[i + offset]; } return this; }, toArray: function (array, offset) { if (array === undefined) array = []; if (offset === undefined) offset = 0; var te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; array[offset + 9] = te[9]; array[offset + 10] = te[10]; array[offset + 11] = te[11]; array[offset + 12] = te[12]; array[offset + 13] = te[13]; array[offset + 14] = te[14]; array[offset + 15] = te[15]; return array; } }); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io */ function Quaternion(x, y, z, w) { this._x = x || 0; this._y = y || 0; this._z = z || 0; this._w = w !== undefined ? w : 1; } Object.assign(Quaternion, { slerp: function (qa, qb, qm, t) { return qm.copy(qa).slerp(qb, t); }, slerpFlat: function (dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) { // fuzz-free, array-based Quaternion SLERP operation var x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3], x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { var s = 1 - t, cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, dir = cos >= 0 ? 1 : -1, sqrSin = 1 - cos * cos; // Skip the Slerp for tiny steps to avoid numeric problems: if (sqrSin > Number.EPSILON) { var sin = Math.sqrt(sqrSin), len = Math.atan2(sin, cos * dir); s = Math.sin(s * len) / sin; t = Math.sin(t * len) / sin; } var tDir = t * dir; x0 = x0 * s + x1 * tDir; y0 = y0 * s + y1 * tDir; z0 = z0 * s + z1 * tDir; w0 = w0 * s + w1 * tDir; // Normalize in case we just did a lerp: if (s === 1 - t) { var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); x0 *= f; y0 *= f; z0 *= f; w0 *= f; } } dst[dstOffset] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; } }); Object.defineProperties(Quaternion.prototype, { x: { get: function () { return this._x; }, set: function (value) { this._x = value; this.onChangeCallback(); } }, y: { get: function () { return this._y; }, set: function (value) { this._y = value; this.onChangeCallback(); } }, z: { get: function () { return this._z; }, set: function (value) { this._z = value; this.onChangeCallback(); } }, w: { get: function () { return this._w; }, set: function (value) { this._w = value; this.onChangeCallback(); } } }); Object.assign(Quaternion.prototype, { set: function (x, y, z, w) { this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; }, clone: function () { return new this.constructor(this._x, this._y, this._z, this._w); }, copy: function (quaternion) { this._x = quaternion.x; this._y = quaternion.y; this._z = quaternion.z; this._w = quaternion.w; this.onChangeCallback(); return this; }, setFromEuler: function (euler, update) { if (!(euler && euler.isEuler)) { throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.'); } var x = euler._x, y = euler._y, z = euler._z, order = euler.order; // http://www.mathworks.com/matlabcentral/fileexchange/ // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ // content/SpinCalc.m var cos = Math.cos; var sin = Math.sin; var c1 = cos(x / 2); var c2 = cos(y / 2); var c3 = cos(z / 2); var s1 = sin(x / 2); var s2 = sin(y / 2); var s3 = sin(z / 2); if (order === 'XYZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'YXZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'ZXY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'ZYX') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'YZX') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'XZY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } if (update !== false) this.onChangeCallback(); return this; }, setFromAxisAngle: function (axis, angle) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm // assumes axis is normalized var halfAngle = angle / 2, s = Math.sin(halfAngle); this._x = axis.x * s; this._y = axis.y * s; this._z = axis.z * s; this._w = Math.cos(halfAngle); this.onChangeCallback(); return thi