diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..182a3746
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,50 @@
+name: leapjs - Build Library and Run Unit Tests
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: Build Library and Run Unit Tests
+ runs-on: ubuntu-latest
+ steps:
+
+ # Checkout
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ # Install Node
+ - name: Use Node.js
+ uses: actions/setup-node@v1
+ with:
+ node-version: '12.x'
+
+ # Install Dependencies
+ - name: Install NPM Dependencies
+ run: npm ci
+
+ # Build and Run Tests
+ - name: Build Library and Run Tests
+ run: ./node_modules/.bin/grunt test
+
+ # Commit All Build Artifacts
+ - name: Commit Build Artifacts
+ run: |
+ git config --local user.email "action@github.com"
+ git config --local user.name "GitHub Action"
+ set +e
+ git add *
+ git diff-index --quiet HEAD || git commit -m "Build Leap.js"
+
+ # Push Build Artifacts
+ - name: Push Changes to branch
+ id: push-build
+ uses: ad-m/github-push-action@master
+ continue-on-error: true
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ branch: ${{ github.ref }}
+
+ # Reenable Errors
+ - name: Clean Up
+ if: steps.push-build.outcome == 'success' && steps.push-build.conclusion == 'success'
+ run: set -e
diff --git a/Gruntfile.js b/Gruntfile.js
index 34f15aa6..38717bbd 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -4,7 +4,7 @@ module.exports = function(grunt){
\n * LeapJS v<%= pkg.version %> \
\n * http://github.com/leapmotion/leapjs/ \
\n * \
-\n * Copyright 2013 LeapMotion, Inc. and other contributors \
+\n * Copyright 2020 Ultraleap, Inc. and other contributors \
\n * Released under the Apache-2.0 license \
\n * http://github.com/leapmotion/leapjs/blob/master/LICENSE \
\n */";
@@ -95,9 +95,9 @@ module.exports = function(grunt){
},
exec: {
- 'test-browser': './node_modules/.bin/mocha-chrome -R dot test/helpers/browser.html',
+ 'test-browser': '"./node_modules/.bin/mocha-headless-chrome" -r dot -f test/helpers/browser.html',
// -i -g stands for inverse grep. Tests tagged browser-only will be excluded.
- 'test-node': './node_modules/.bin/mocha lib/index.js test/helpers/node.js test/*.js -R dot -i -g browser-only',
+ 'test-node': '"./node_modules/.bin/mocha" lib/index.js test/helpers/node.js test/*.js -R dot -i -g browser-only',
'test-integration': 'node integration_test/reconnection.js && node integration_test/protocol_versions.js'
}
});
diff --git a/Makefile b/Makefile
index 7833125a..99396bc2 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ test: build test-only
test-only: test-node test-browser test-integration
test-browser:
- ./node_modules/.bin/mocha-chrome -R dot test/helpers/browser.html
+ "./node_modules/.bin/mocha-headless-chrome" -r dot -f test/helpers/browser.html
test-node:
./node_modules/.bin/mocha lib/index.js test/helpers/node.js test/*.js -R dot
diff --git a/bower.json b/bower.json
index 11a3a0a0..05c92f15 100644
--- a/bower.json
+++ b/bower.json
@@ -1,9 +1,9 @@
{
"name": "leapjs",
- "version": "1.0.0",
+ "version": "1.1.0",
"homepage": "https://github.com/leapmotion/leapjs",
"description": "JavaScript client for the Leap Motion Controller",
- "main": "leap-1.0.0.js",
+ "main": "leap-1.1.0.js",
"keywords": [
"leap",
"leapmotion",
diff --git a/examples/css-visualizer.html b/examples/css-visualizer.html
index d635a156..c9ee4fbb 100644
--- a/examples/css-visualizer.html
+++ b/examples/css-visualizer.html
@@ -1,7 +1,7 @@
DOM Visualizer - Leap
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/iframe.html b/examples/iframe.html
index a576c40a..9308be4f 100644
--- a/examples/iframe.html
+++ b/examples/iframe.html
@@ -1,7 +1,7 @@
iFrame - Leap
-
+
diff --git a/examples/lib/leap-plugins-0.1.6.js b/examples/lib/leap-plugins-0.1.6.js
index d59c7364..ea636fb9 100644
--- a/examples/lib/leap-plugins-0.1.6.js
+++ b/examples/lib/leap-plugins-0.1.6.js
@@ -900,7 +900,7 @@ function Recording (options){
'id',
'timestamp',
// this should be replace/upgraded with a whitelist instead of a blacklist.
- // leaving out r,s,y, and gestures
+ // leaving out r,s,y
{hands: [[
'id',
'type',
@@ -1699,7 +1699,6 @@ Recording.prototype = {
finalFrame.hands = [];
finalFrame.fingers = [];
finalFrame.pointables = [];
- finalFrame.tools = [];
this.sendImmediateFrame(finalFrame);
},
diff --git a/examples/lib/three.js b/examples/lib/three.js
index 37bf01f1..2604749d 100644
--- a/examples/lib/three.js
+++ b/examples/lib/three.js
@@ -1,38491 +1,37287 @@
-/**
- * @author mrdoob / http://mrdoob.com/
- * @author Larry Battle / http://bateru.com/news
- * @author bhouston / http://exocortex.com
- */
-
-var THREE = { REVISION: '67' };
+// threejs.org/license
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.THREE = {}));
+}(this, (function (exports) { 'use strict';
+
+ // 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;
+ };
+ } //
-self.console = self.console || {
- info: function () {},
- log: function () {},
- debug: function () {},
- warn: function () {},
- error: function () {}
+ 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 get() {
+ return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1];
+ }
+ });
+ }
-// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
-// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
+ if (Object.assign === undefined) {
+ // Missing in IE
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
+ Object.assign = function (target) {
-// requestAnimationFrame polyfill by Erik Möller
-// fixes from Paul Irish and Tino Zijdel
-// using 'self' instead of 'window' for compatibility with both NodeJS and IE10.
-( function () {
+ if (target === undefined || target === null) {
+ throw new TypeError('Cannot convert undefined or null to object');
+ }
- var lastTime = 0;
- var vendors = [ 'ms', 'moz', 'webkit', 'o' ];
+ var output = Object(target);
- for ( var x = 0; x < vendors.length && !self.requestAnimationFrame; ++ x ) {
+ for (var index = 1; index < arguments.length; index++) {
+ var source = arguments[index];
- self.requestAnimationFrame = self[ vendors[ x ] + 'RequestAnimationFrame' ];
- self.cancelAnimationFrame = self[ vendors[ x ] + 'CancelAnimationFrame' ] || self[ vendors[ x ] + 'CancelRequestAnimationFrame' ];
+ if (source !== undefined && source !== null) {
+ for (var nextKey in source) {
+ if (Object.prototype.hasOwnProperty.call(source, nextKey)) {
+ output[nextKey] = source[nextKey];
+ }
+ }
+ }
+ }
+ return output;
+ };
}
- if ( self.requestAnimationFrame === undefined && self['setTimeout'] !== undefined ) {
+ var REVISION = '122';
+ var MOUSE = {
+ LEFT: 0,
+ MIDDLE: 1,
+ RIGHT: 2,
+ ROTATE: 0,
+ DOLLY: 1,
+ PAN: 2
+ };
+ var TOUCH = {
+ ROTATE: 0,
+ PAN: 1,
+ DOLLY_PAN: 2,
+ DOLLY_ROTATE: 3
+ };
+ var CullFaceNone = 0;
+ var CullFaceBack = 1;
+ var CullFaceFront = 2;
+ var CullFaceFrontBack = 3;
+ var BasicShadowMap = 0;
+ var PCFShadowMap = 1;
+ var PCFSoftShadowMap = 2;
+ var VSMShadowMap = 3;
+ var FrontSide = 0;
+ var BackSide = 1;
+ var DoubleSide = 2;
+ var FlatShading = 1;
+ var SmoothShading = 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 CineonToneMapping = 3;
+ var ACESFilmicToneMapping = 4;
+ var CustomToneMapping = 5;
+ var UVMapping = 300;
+ var CubeReflectionMapping = 301;
+ var CubeRefractionMapping = 302;
+ var EquirectangularReflectionMapping = 303;
+ var EquirectangularRefractionMapping = 304;
+ var CubeUVReflectionMapping = 306;
+ var CubeUVRefractionMapping = 307;
+ var RepeatWrapping = 1000;
+ var ClampToEdgeWrapping = 1001;
+ var MirroredRepeatWrapping = 1002;
+ var NearestFilter = 1003;
+ var NearestMipmapNearestFilter = 1004;
+ var NearestMipMapNearestFilter = 1004;
+ var NearestMipmapLinearFilter = 1005;
+ var NearestMipMapLinearFilter = 1005;
+ var LinearFilter = 1006;
+ var LinearMipmapNearestFilter = 1007;
+ var LinearMipMapNearestFilter = 1007;
+ var LinearMipmapLinearFilter = 1008;
+ 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 RedFormat = 1028;
+ var RedIntegerFormat = 1029;
+ var RGFormat = 1030;
+ var RGIntegerFormat = 1031;
+ var RGBIntegerFormat = 1032;
+ var RGBAIntegerFormat = 1033;
+ 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 RGB_ETC2_Format = 37492;
+ var RGBA_ETC2_EAC_Format = 37496;
+ 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 RGBA_BPTC_Format = 36492;
+ var SRGB8_ALPHA8_ASTC_4x4_Format = 37840;
+ var SRGB8_ALPHA8_ASTC_5x4_Format = 37841;
+ var SRGB8_ALPHA8_ASTC_5x5_Format = 37842;
+ var SRGB8_ALPHA8_ASTC_6x5_Format = 37843;
+ var SRGB8_ALPHA8_ASTC_6x6_Format = 37844;
+ var SRGB8_ALPHA8_ASTC_8x5_Format = 37845;
+ var SRGB8_ALPHA8_ASTC_8x6_Format = 37846;
+ var SRGB8_ALPHA8_ASTC_8x8_Format = 37847;
+ var SRGB8_ALPHA8_ASTC_10x5_Format = 37848;
+ var SRGB8_ALPHA8_ASTC_10x6_Format = 37849;
+ var SRGB8_ALPHA8_ASTC_10x8_Format = 37850;
+ var SRGB8_ALPHA8_ASTC_10x10_Format = 37851;
+ var SRGB8_ALPHA8_ASTC_12x10_Format = 37852;
+ var SRGB8_ALPHA8_ASTC_12x12_Format = 37853;
+ 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 NormalAnimationBlendMode = 2500;
+ var AdditiveAnimationBlendMode = 2501;
+ 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;
+ var ZeroStencilOp = 0;
+ var KeepStencilOp = 7680;
+ var ReplaceStencilOp = 7681;
+ var IncrementStencilOp = 7682;
+ var DecrementStencilOp = 7683;
+ var IncrementWrapStencilOp = 34055;
+ var DecrementWrapStencilOp = 34056;
+ var InvertStencilOp = 5386;
+ var NeverStencilFunc = 512;
+ var LessStencilFunc = 513;
+ var EqualStencilFunc = 514;
+ var LessEqualStencilFunc = 515;
+ var GreaterStencilFunc = 516;
+ var NotEqualStencilFunc = 517;
+ var GreaterEqualStencilFunc = 518;
+ var AlwaysStencilFunc = 519;
+ var StaticDrawUsage = 35044;
+ var DynamicDrawUsage = 35048;
+ var StreamDrawUsage = 35040;
+ var StaticReadUsage = 35045;
+ var DynamicReadUsage = 35049;
+ var StreamReadUsage = 35041;
+ var StaticCopyUsage = 35046;
+ var DynamicCopyUsage = 35050;
+ var StreamCopyUsage = 35042;
+ var GLSL1 = "100";
+ var GLSL3 = "300 es";
+
+ /**
+ * https://github.com/mrdoob/eventdispatcher.js/
+ */
+ function EventDispatcher() {}
- self.requestAnimationFrame = function ( callback ) {
+ Object.assign(EventDispatcher.prototype, {
+ addEventListener: function addEventListener(type, listener) {
+ if (this._listeners === undefined) this._listeners = {};
+ var listeners = this._listeners;
- var currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );
- var id = self.setTimeout( function() { callback( currTime + timeToCall ); }, timeToCall );
- lastTime = currTime + timeToCall;
- return id;
+ if (listeners[type] === undefined) {
+ listeners[type] = [];
+ }
- };
+ if (listeners[type].indexOf(listener) === -1) {
+ listeners[type].push(listener);
+ }
+ },
+ hasEventListener: function hasEventListener(type, listener) {
+ if (this._listeners === undefined) return false;
+ var listeners = this._listeners;
+ return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1;
+ },
+ removeEventListener: function removeEventListener(type, listener) {
+ if (this._listeners === undefined) return;
+ var listeners = this._listeners;
+ var listenerArray = listeners[type];
- }
+ if (listenerArray !== undefined) {
+ var index = listenerArray.indexOf(listener);
- if( self.cancelAnimationFrame === undefined && self['clearTimeout'] !== undefined ) {
+ if (index !== -1) {
+ listenerArray.splice(index, 1);
+ }
+ }
+ },
+ dispatchEvent: function dispatchEvent(event) {
+ if (this._listeners === undefined) return;
+ var listeners = this._listeners;
+ var listenerArray = listeners[event.type];
- self.cancelAnimationFrame = function ( id ) { self.clearTimeout( id ) };
+ if (listenerArray !== undefined) {
+ event.target = this; // Make a copy, in case listeners are removed while iterating.
- }
+ var array = listenerArray.slice(0);
-}() );
+ for (var i = 0, l = array.length; i < l; i++) {
+ array[i].call(this, event);
+ }
+ }
+ }
+ });
-// GL STATE CONSTANTS
+ var _lut = [];
-THREE.CullFaceNone = 0;
-THREE.CullFaceBack = 1;
-THREE.CullFaceFront = 2;
-THREE.CullFaceFrontBack = 3;
+ for (var i = 0; i < 256; i++) {
+ _lut[i] = (i < 16 ? '0' : '') + i.toString(16);
+ }
-THREE.FrontFaceDirectionCW = 0;
-THREE.FrontFaceDirectionCCW = 1;
+ var _seed = 1234567;
+ var MathUtils = {
+ DEG2RAD: Math.PI / 180,
+ RAD2DEG: 180 / Math.PI,
+ generateUUID: function generateUUID() {
+ // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
+ 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.
-// SHADOWING TYPES
+ return uuid.toUpperCase();
+ },
+ clamp: function clamp(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 euclideanModulo(n, m) {
+ return (n % m + m) % m;
+ },
+ // Linear mapping from range to range
+ mapLinear: function mapLinear(x, a1, a2, b1, b2) {
+ return b1 + (x - a1) * (b2 - b1) / (a2 - a1);
+ },
+ // https://en.wikipedia.org/wiki/Linear_interpolation
+ lerp: function lerp(x, y, t) {
+ return (1 - t) * x + t * y;
+ },
+ // http://en.wikipedia.org/wiki/Smoothstep
+ smoothstep: function smoothstep(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 smootherstep(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 interval
+ randInt: function randInt(low, high) {
+ return low + Math.floor(Math.random() * (high - low + 1));
+ },
+ // Random float from interval
+ randFloat: function randFloat(low, high) {
+ return low + Math.random() * (high - low);
+ },
+ // Random float from <-range/2, range/2> interval
+ randFloatSpread: function randFloatSpread(range) {
+ return range * (0.5 - Math.random());
+ },
+ // Deterministic pseudo-random float in the interval [ 0, 1 ]
+ seededRandom: function seededRandom(s) {
+ if (s !== undefined) _seed = s % 2147483647; // Park-Miller algorithm
-THREE.BasicShadowMap = 0;
-THREE.PCFShadowMap = 1;
-THREE.PCFSoftShadowMap = 2;
+ _seed = _seed * 16807 % 2147483647;
+ return (_seed - 1) / 2147483646;
+ },
+ degToRad: function degToRad(degrees) {
+ return degrees * MathUtils.DEG2RAD;
+ },
+ radToDeg: function radToDeg(radians) {
+ return radians * MathUtils.RAD2DEG;
+ },
+ isPowerOfTwo: function isPowerOfTwo(value) {
+ return (value & value - 1) === 0 && value !== 0;
+ },
+ ceilPowerOfTwo: function ceilPowerOfTwo(value) {
+ return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
+ },
+ floorPowerOfTwo: function floorPowerOfTwo(value) {
+ return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));
+ },
+ setQuaternionFromProperEuler: function setQuaternionFromProperEuler(q, a, b, c, order) {
+ // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles
+ // rotations are applied to the axes in the order specified by 'order'
+ // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'
+ // angles are in radians
+ var cos = Math.cos;
+ var sin = Math.sin;
+ var c2 = cos(b / 2);
+ var s2 = sin(b / 2);
+ var c13 = cos((a + c) / 2);
+ var s13 = sin((a + c) / 2);
+ var c1_3 = cos((a - c) / 2);
+ var s1_3 = sin((a - c) / 2);
+ var c3_1 = cos((c - a) / 2);
+ var s3_1 = sin((c - a) / 2);
+
+ switch (order) {
+ case 'XYX':
+ q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13);
+ break;
-// MATERIAL CONSTANTS
+ case 'YZY':
+ q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13);
+ break;
-// side
+ case 'ZXZ':
+ q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13);
+ break;
-THREE.FrontSide = 0;
-THREE.BackSide = 1;
-THREE.DoubleSide = 2;
+ case 'XZX':
+ q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13);
+ break;
-// shading
+ case 'YXY':
+ q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13);
+ break;
-THREE.NoShading = 0;
-THREE.FlatShading = 1;
-THREE.SmoothShading = 2;
+ case 'ZYZ':
+ q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13);
+ break;
-// colors
+ default:
+ console.warn('THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order);
+ }
+ }
+ };
-THREE.NoColors = 0;
-THREE.FaceColors = 1;
-THREE.VertexColors = 2;
+ 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);
+ }
+ }
-// blending modes
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
-THREE.NoBlending = 0;
-THREE.NormalBlending = 1;
-THREE.AdditiveBlending = 2;
-THREE.SubtractiveBlending = 3;
-THREE.MultiplyBlending = 4;
-THREE.CustomBlending = 5;
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ subClass.__proto__ = superClass;
+ }
-// custom blending equations
-// (numbers start from 100 not to clash with other
-// mappings to OpenGL constants defined in Texture.js)
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
-THREE.AddEquation = 100;
-THREE.SubtractEquation = 101;
-THREE.ReverseSubtractEquation = 102;
+ return self;
+ }
-// custom blending destination factors
+ var Vector2 = /*#__PURE__*/function () {
+ function Vector2(x, y) {
+ if (x === void 0) {
+ x = 0;
+ }
-THREE.ZeroFactor = 200;
-THREE.OneFactor = 201;
-THREE.SrcColorFactor = 202;
-THREE.OneMinusSrcColorFactor = 203;
-THREE.SrcAlphaFactor = 204;
-THREE.OneMinusSrcAlphaFactor = 205;
-THREE.DstAlphaFactor = 206;
-THREE.OneMinusDstAlphaFactor = 207;
+ if (y === void 0) {
+ y = 0;
+ }
-// custom blending source factors
+ Object.defineProperty(this, 'isVector2', {
+ value: true
+ });
+ this.x = x;
+ this.y = y;
+ }
-//THREE.ZeroFactor = 200;
-//THREE.OneFactor = 201;
-//THREE.SrcAlphaFactor = 204;
-//THREE.OneMinusSrcAlphaFactor = 205;
-//THREE.DstAlphaFactor = 206;
-//THREE.OneMinusDstAlphaFactor = 207;
-THREE.DstColorFactor = 208;
-THREE.OneMinusDstColorFactor = 209;
-THREE.SrcAlphaSaturateFactor = 210;
+ var _proto = Vector2.prototype;
+ _proto.set = function set(x, y) {
+ this.x = x;
+ this.y = y;
+ return this;
+ };
-// TEXTURE CONSTANTS
+ _proto.setScalar = function setScalar(scalar) {
+ this.x = scalar;
+ this.y = scalar;
+ return this;
+ };
-THREE.MultiplyOperation = 0;
-THREE.MixOperation = 1;
-THREE.AddOperation = 2;
+ _proto.setX = function setX(x) {
+ this.x = x;
+ return this;
+ };
-// Mapping modes
+ _proto.setY = function setY(y) {
+ this.y = y;
+ return this;
+ };
-THREE.UVMapping = function () {};
+ _proto.setComponent = function setComponent(index, value) {
+ switch (index) {
+ case 0:
+ this.x = value;
+ break;
-THREE.CubeReflectionMapping = function () {};
-THREE.CubeRefractionMapping = function () {};
+ case 1:
+ this.y = value;
+ break;
-THREE.SphericalReflectionMapping = function () {};
-THREE.SphericalRefractionMapping = function () {};
+ default:
+ throw new Error('index is out of range: ' + index);
+ }
-// Wrapping modes
+ return this;
+ };
-THREE.RepeatWrapping = 1000;
-THREE.ClampToEdgeWrapping = 1001;
-THREE.MirroredRepeatWrapping = 1002;
+ _proto.getComponent = function getComponent(index) {
+ switch (index) {
+ case 0:
+ return this.x;
-// Filters
+ case 1:
+ return this.y;
-THREE.NearestFilter = 1003;
-THREE.NearestMipMapNearestFilter = 1004;
-THREE.NearestMipMapLinearFilter = 1005;
-THREE.LinearFilter = 1006;
-THREE.LinearMipMapNearestFilter = 1007;
-THREE.LinearMipMapLinearFilter = 1008;
+ default:
+ throw new Error('index is out of range: ' + index);
+ }
+ };
-// Data types
+ _proto.clone = function clone() {
+ return new this.constructor(this.x, this.y);
+ };
-THREE.UnsignedByteType = 1009;
-THREE.ByteType = 1010;
-THREE.ShortType = 1011;
-THREE.UnsignedShortType = 1012;
-THREE.IntType = 1013;
-THREE.UnsignedIntType = 1014;
-THREE.FloatType = 1015;
+ _proto.copy = function copy(v) {
+ this.x = v.x;
+ this.y = v.y;
+ return this;
+ };
-// Pixel types
+ _proto.add = function add(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);
+ }
-//THREE.UnsignedByteType = 1009;
-THREE.UnsignedShort4444Type = 1016;
-THREE.UnsignedShort5551Type = 1017;
-THREE.UnsignedShort565Type = 1018;
+ this.x += v.x;
+ this.y += v.y;
+ return this;
+ };
-// Pixel formats
+ _proto.addScalar = function addScalar(s) {
+ this.x += s;
+ this.y += s;
+ return this;
+ };
-THREE.AlphaFormat = 1019;
-THREE.RGBFormat = 1020;
-THREE.RGBAFormat = 1021;
-THREE.LuminanceFormat = 1022;
-THREE.LuminanceAlphaFormat = 1023;
+ _proto.addVectors = function addVectors(a, b) {
+ this.x = a.x + b.x;
+ this.y = a.y + b.y;
+ return this;
+ };
-// Compressed texture formats
+ _proto.addScaledVector = function addScaledVector(v, s) {
+ this.x += v.x * s;
+ this.y += v.y * s;
+ return this;
+ };
-THREE.RGB_S3TC_DXT1_Format = 2001;
-THREE.RGBA_S3TC_DXT1_Format = 2002;
-THREE.RGBA_S3TC_DXT3_Format = 2003;
-THREE.RGBA_S3TC_DXT5_Format = 2004;
+ _proto.sub = function sub(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);
+ }
-/*
-// Potential future PVRTC compressed texture formats
-THREE.RGB_PVRTC_4BPPV1_Format = 2100;
-THREE.RGB_PVRTC_2BPPV1_Format = 2101;
-THREE.RGBA_PVRTC_4BPPV1_Format = 2102;
-THREE.RGBA_PVRTC_2BPPV1_Format = 2103;
-*/
+ this.x -= v.x;
+ this.y -= v.y;
+ return this;
+ };
-/**
- * @author mrdoob / http://mrdoob.com/
- */
+ _proto.subScalar = function subScalar(s) {
+ this.x -= s;
+ this.y -= s;
+ return this;
+ };
-THREE.Color = function ( color ) {
+ _proto.subVectors = function subVectors(a, b) {
+ this.x = a.x - b.x;
+ this.y = a.y - b.y;
+ return this;
+ };
- if ( arguments.length === 3 ) {
+ _proto.multiply = function multiply(v) {
+ this.x *= v.x;
+ this.y *= v.y;
+ return this;
+ };
- return this.setRGB( arguments[ 0 ], arguments[ 1 ], arguments[ 2 ] );
+ _proto.multiplyScalar = function multiplyScalar(scalar) {
+ this.x *= scalar;
+ this.y *= scalar;
+ return this;
+ };
- }
+ _proto.divide = function divide(v) {
+ this.x /= v.x;
+ this.y /= v.y;
+ return this;
+ };
- return this.set( color )
+ _proto.divideScalar = function divideScalar(scalar) {
+ return this.multiplyScalar(1 / scalar);
+ };
-};
+ _proto.applyMatrix3 = function applyMatrix3(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;
+ };
-THREE.Color.prototype = {
+ _proto.min = function min(v) {
+ this.x = Math.min(this.x, v.x);
+ this.y = Math.min(this.y, v.y);
+ return this;
+ };
- constructor: THREE.Color,
+ _proto.max = function max(v) {
+ this.x = Math.max(this.x, v.x);
+ this.y = Math.max(this.y, v.y);
+ return this;
+ };
- r: 1, g: 1, b: 1,
+ _proto.clamp = function clamp(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;
+ };
- set: function ( value ) {
+ _proto.clampScalar = function clampScalar(minVal, maxVal) {
+ this.x = Math.max(minVal, Math.min(maxVal, this.x));
+ this.y = Math.max(minVal, Math.min(maxVal, this.y));
+ return this;
+ };
- if ( value instanceof THREE.Color ) {
+ _proto.clampLength = function clampLength(min, max) {
+ var length = this.length();
+ return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
+ };
- this.copy( value );
+ _proto.floor = function floor() {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ return this;
+ };
- } else if ( typeof value === 'number' ) {
+ _proto.ceil = function ceil() {
+ this.x = Math.ceil(this.x);
+ this.y = Math.ceil(this.y);
+ return this;
+ };
- this.setHex( value );
+ _proto.round = function round() {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ return this;
+ };
- } else if ( typeof value === 'string' ) {
+ _proto.roundToZero = function roundToZero() {
+ 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;
+ };
- this.setStyle( value );
+ _proto.negate = function negate() {
+ this.x = -this.x;
+ this.y = -this.y;
+ return this;
+ };
- }
+ _proto.dot = function dot(v) {
+ return this.x * v.x + this.y * v.y;
+ };
- return this;
+ _proto.cross = function cross(v) {
+ return this.x * v.y - this.y * v.x;
+ };
- },
+ _proto.lengthSq = function lengthSq() {
+ return this.x * this.x + this.y * this.y;
+ };
- setHex: function ( hex ) {
+ _proto.length = function length() {
+ return Math.sqrt(this.x * this.x + this.y * this.y);
+ };
- hex = Math.floor( hex );
+ _proto.manhattanLength = function manhattanLength() {
+ return Math.abs(this.x) + Math.abs(this.y);
+ };
- this.r = ( hex >> 16 & 255 ) / 255;
- this.g = ( hex >> 8 & 255 ) / 255;
- this.b = ( hex & 255 ) / 255;
+ _proto.normalize = function normalize() {
+ return this.divideScalar(this.length() || 1);
+ };
- return this;
+ _proto.angle = function angle() {
+ // computes the angle in radians with respect to the positive x-axis
+ var angle = Math.atan2(-this.y, -this.x) + Math.PI;
+ return angle;
+ };
- },
+ _proto.distanceTo = function distanceTo(v) {
+ return Math.sqrt(this.distanceToSquared(v));
+ };
- setRGB: function ( r, g, b ) {
+ _proto.distanceToSquared = function distanceToSquared(v) {
+ var dx = this.x - v.x,
+ dy = this.y - v.y;
+ return dx * dx + dy * dy;
+ };
- this.r = r;
- this.g = g;
- this.b = b;
+ _proto.manhattanDistanceTo = function manhattanDistanceTo(v) {
+ return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);
+ };
- return this;
+ _proto.setLength = function setLength(length) {
+ return this.normalize().multiplyScalar(length);
+ };
- },
+ _proto.lerp = function lerp(v, alpha) {
+ this.x += (v.x - this.x) * alpha;
+ this.y += (v.y - this.y) * alpha;
+ return this;
+ };
- setHSL: function ( h, s, l ) {
+ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) {
+ this.x = v1.x + (v2.x - v1.x) * alpha;
+ this.y = v1.y + (v2.y - v1.y) * alpha;
+ return this;
+ };
- // h,s,l ranges are in 0.0 - 1.0
+ _proto.equals = function equals(v) {
+ return v.x === this.x && v.y === this.y;
+ };
- if ( s === 0 ) {
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- this.r = this.g = this.b = l;
+ this.x = array[offset];
+ this.y = array[offset + 1];
+ return this;
+ };
- } else {
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- var hue2rgb = function ( p, q, t ) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- if ( t < 0 ) t += 1;
- if ( t > 1 ) t -= 1;
- if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;
- if ( t < 1 / 2 ) return q;
- if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );
- return p;
+ array[offset] = this.x;
+ array[offset + 1] = this.y;
+ return array;
+ };
- };
+ _proto.fromBufferAttribute = function fromBufferAttribute(attribute, index, offset) {
+ if (offset !== undefined) {
+ console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');
+ }
- var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
- var q = ( 2 * l ) - p;
+ this.x = attribute.getX(index);
+ this.y = attribute.getY(index);
+ return this;
+ };
- this.r = hue2rgb( q, p, h + 1 / 3 );
- this.g = hue2rgb( q, p, h );
- this.b = hue2rgb( q, p, h - 1 / 3 );
+ _proto.rotateAround = function rotateAround(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;
+ };
- }
+ _proto.random = function random() {
+ this.x = Math.random();
+ this.y = Math.random();
+ return this;
+ };
- return this;
+ _createClass(Vector2, [{
+ key: "width",
+ get: function get() {
+ return this.x;
+ },
+ set: function set(value) {
+ this.x = value;
+ }
+ }, {
+ key: "height",
+ get: function get() {
+ return this.y;
+ },
+ set: function set(value) {
+ this.y = value;
+ }
+ }]);
+
+ return Vector2;
+ }();
- },
+ var Matrix3 = /*#__PURE__*/function () {
+ function Matrix3() {
+ Object.defineProperty(this, 'isMatrix3', {
+ value: true
+ });
+ this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];
- setStyle: function ( style ) {
+ if (arguments.length > 0) {
+ console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');
+ }
+ }
- // rgb(255,0,0)
+ var _proto = Matrix3.prototype;
- if ( /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.test( style ) ) {
+ _proto.set = function set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
+ var te = this.elements;
+ te[0] = n11;
+ te[1] = n21;
+ te[2] = n31;
+ te[3] = n12;
+ te[4] = n22;
+ te[5] = n32;
+ te[6] = n13;
+ te[7] = n23;
+ te[8] = n33;
+ return this;
+ };
- var color = /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.exec( style );
+ _proto.identity = function identity() {
+ this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);
+ return this;
+ };
- this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;
- this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;
- this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;
+ _proto.clone = function clone() {
+ return new this.constructor().fromArray(this.elements);
+ };
+ _proto.copy = function copy(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];
return this;
+ };
- }
-
- // rgb(100%,0%,0%)
+ _proto.extractBasis = function extractBasis(xAxis, yAxis, zAxis) {
+ xAxis.setFromMatrix3Column(this, 0);
+ yAxis.setFromMatrix3Column(this, 1);
+ zAxis.setFromMatrix3Column(this, 2);
+ return this;
+ };
- if ( /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.test( style ) ) {
+ _proto.setFromMatrix4 = function setFromMatrix4(m) {
+ var me = m.elements;
+ this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);
+ return this;
+ };
- var color = /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.exec( style );
+ _proto.multiply = function multiply(m) {
+ return this.multiplyMatrices(this, m);
+ };
- this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;
- this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;
- this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;
+ _proto.premultiply = function premultiply(m) {
+ return this.multiplyMatrices(m, this);
+ };
+ _proto.multiplyMatrices = function multiplyMatrices(a, b) {
+ var ae = a.elements;
+ var be = b.elements;
+ var te = this.elements;
+ var a11 = ae[0],
+ a12 = ae[3],
+ a13 = ae[6];
+ var a21 = ae[1],
+ a22 = ae[4],
+ a23 = ae[7];
+ var a31 = ae[2],
+ a32 = ae[5],
+ a33 = ae[8];
+ var b11 = be[0],
+ b12 = be[3],
+ b13 = be[6];
+ var b21 = be[1],
+ b22 = be[4],
+ b23 = be[7];
+ var b31 = be[2],
+ b32 = be[5],
+ b33 = be[8];
+ te[0] = a11 * b11 + a12 * b21 + a13 * b31;
+ te[3] = a11 * b12 + a12 * b22 + a13 * b32;
+ te[6] = a11 * b13 + a12 * b23 + a13 * b33;
+ te[1] = a21 * b11 + a22 * b21 + a23 * b31;
+ te[4] = a21 * b12 + a22 * b22 + a23 * b32;
+ te[7] = a21 * b13 + a22 * b23 + a23 * b33;
+ te[2] = a31 * b11 + a32 * b21 + a33 * b31;
+ te[5] = a31 * b12 + a32 * b22 + a33 * b32;
+ te[8] = a31 * b13 + a32 * b23 + a33 * b33;
return this;
+ };
- }
-
- // #ff0000
-
- if ( /^\#([0-9a-f]{6})$/i.test( style ) ) {
+ _proto.multiplyScalar = function multiplyScalar(s) {
+ var te = this.elements;
+ te[0] *= s;
+ te[3] *= s;
+ te[6] *= s;
+ te[1] *= s;
+ te[4] *= s;
+ te[7] *= s;
+ te[2] *= s;
+ te[5] *= s;
+ te[8] *= s;
+ return this;
+ };
- var color = /^\#([0-9a-f]{6})$/i.exec( style );
+ _proto.determinant = function determinant() {
+ var te = this.elements;
+ var a = te[0],
+ b = te[1],
+ c = te[2],
+ d = te[3],
+ e = te[4],
+ f = te[5],
+ g = te[6],
+ h = te[7],
+ i = te[8];
+ return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
+ };
- this.setHex( parseInt( color[ 1 ], 16 ) );
+ _proto.getInverse = function getInverse(matrix, throwOnDegenerate) {
+ if (throwOnDegenerate !== undefined) {
+ console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");
+ }
+
+ var me = matrix.elements,
+ te = this.elements,
+ n11 = me[0],
+ n21 = me[1],
+ n31 = me[2],
+ n12 = me[3],
+ n22 = me[4],
+ n32 = me[5],
+ n13 = me[6],
+ n23 = me[7],
+ n33 = me[8],
+ t11 = n33 * n22 - n32 * n23,
+ t12 = n32 * n13 - n33 * n12,
+ t13 = n23 * n12 - n22 * n13,
+ det = n11 * t11 + n21 * t12 + n31 * t13;
+ if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ var detInv = 1 / det;
+ te[0] = t11 * detInv;
+ te[1] = (n31 * n23 - n33 * n21) * detInv;
+ te[2] = (n32 * n21 - n31 * n22) * detInv;
+ te[3] = t12 * detInv;
+ te[4] = (n33 * n11 - n31 * n13) * detInv;
+ te[5] = (n31 * n12 - n32 * n11) * detInv;
+ te[6] = t13 * detInv;
+ te[7] = (n21 * n13 - n23 * n11) * detInv;
+ te[8] = (n22 * n11 - n21 * n12) * detInv;
+ return this;
+ };
+ _proto.transpose = function transpose() {
+ var tmp;
+ var m = this.elements;
+ tmp = m[1];
+ m[1] = m[3];
+ m[3] = tmp;
+ tmp = m[2];
+ m[2] = m[6];
+ m[6] = tmp;
+ tmp = m[5];
+ m[5] = m[7];
+ m[7] = tmp;
return this;
+ };
- }
+ _proto.getNormalMatrix = function getNormalMatrix(matrix4) {
+ return this.setFromMatrix4(matrix4).getInverse(this).transpose();
+ };
- // #f00
+ _proto.transposeIntoArray = function transposeIntoArray(r) {
+ var m = this.elements;
+ r[0] = m[0];
+ r[1] = m[3];
+ r[2] = m[6];
+ r[3] = m[1];
+ r[4] = m[4];
+ r[5] = m[7];
+ r[6] = m[2];
+ r[7] = m[5];
+ r[8] = m[8];
+ return this;
+ };
- if ( /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test( style ) ) {
+ _proto.setUvTransform = function setUvTransform(tx, ty, sx, sy, rotation, cx, cy) {
+ var c = Math.cos(rotation);
+ var s = Math.sin(rotation);
+ this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1);
+ };
- var color = /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec( style );
+ _proto.scale = function scale(sx, sy) {
+ var te = this.elements;
+ te[0] *= sx;
+ te[3] *= sx;
+ te[6] *= sx;
+ te[1] *= sy;
+ te[4] *= sy;
+ te[7] *= sy;
+ return this;
+ };
- this.setHex( parseInt( color[ 1 ] + color[ 1 ] + color[ 2 ] + color[ 2 ] + color[ 3 ] + color[ 3 ], 16 ) );
+ _proto.rotate = function rotate(theta) {
+ var c = Math.cos(theta);
+ var s = Math.sin(theta);
+ var te = this.elements;
+ var a11 = te[0],
+ a12 = te[3],
+ a13 = te[6];
+ var a21 = te[1],
+ a22 = te[4],
+ a23 = te[7];
+ te[0] = c * a11 + s * a21;
+ te[3] = c * a12 + s * a22;
+ te[6] = c * a13 + s * a23;
+ te[1] = -s * a11 + c * a21;
+ te[4] = -s * a12 + c * a22;
+ te[7] = -s * a13 + c * a23;
+ return this;
+ };
+ _proto.translate = function translate(tx, ty) {
+ var te = this.elements;
+ te[0] += tx * te[2];
+ te[3] += tx * te[5];
+ te[6] += tx * te[8];
+ te[1] += ty * te[2];
+ te[4] += ty * te[5];
+ te[7] += ty * te[8];
return this;
+ };
- }
+ _proto.equals = function equals(matrix) {
+ var te = this.elements;
+ var me = matrix.elements;
- // red
+ for (var i = 0; i < 9; i++) {
+ if (te[i] !== me[i]) return false;
+ }
+
+ return true;
+ };
- if ( /^(\w+)$/i.test( style ) ) {
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- this.setHex( THREE.ColorKeywords[ style ] );
+ for (var i = 0; i < 9; i++) {
+ this.elements[i] = array[i + offset];
+ }
return this;
+ };
- }
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
+ if (offset === void 0) {
+ 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];
+ return array;
+ };
- copy: function ( color ) {
+ return Matrix3;
+ }();
- this.r = color.r;
- this.g = color.g;
- this.b = color.b;
+ var _canvas;
- return this;
+ var ImageUtils = {
+ getDataURL: function getDataURL(image) {
+ if (/^data:/i.test(image.src)) {
+ return image.src;
+ }
- },
+ if (typeof HTMLCanvasElement == 'undefined') {
+ return image.src;
+ }
- copyGammaToLinear: function ( color ) {
+ var canvas;
- this.r = color.r * color.r;
- this.g = color.g * color.g;
- this.b = color.b * color.b;
+ if (image instanceof HTMLCanvasElement) {
+ canvas = image;
+ } else {
+ if (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
+ _canvas.width = image.width;
+ _canvas.height = image.height;
- return this;
+ var context = _canvas.getContext('2d');
- },
+ if (image instanceof ImageData) {
+ context.putImageData(image, 0, 0);
+ } else {
+ context.drawImage(image, 0, 0, image.width, image.height);
+ }
- copyLinearToGamma: function ( color ) {
+ canvas = _canvas;
+ }
- this.r = Math.sqrt( color.r );
- this.g = Math.sqrt( color.g );
- this.b = Math.sqrt( color.b );
+ if (canvas.width > 2048 || canvas.height > 2048) {
+ return canvas.toDataURL('image/jpeg', 0.6);
+ } else {
+ return canvas.toDataURL('image/png');
+ }
+ }
+ };
- return this;
+ var textureId = 0;
+
+ function Texture(image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
+ Object.defineProperty(this, 'id', {
+ value: textureId++
+ });
+ this.uuid = MathUtils.generateUUID();
+ this.name = '';
+ this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;
+ this.mipmaps = [];
+ this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;
+ this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;
+ this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;
+ this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
+ this.minFilter = minFilter !== undefined ? minFilter : LinearMipmapLinearFilter;
+ this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
+ this.format = format !== undefined ? format : RGBAFormat;
+ this.internalFormat = null;
+ this.type = type !== undefined ? type : UnsignedByteType;
+ this.offset = new Vector2(0, 0);
+ this.repeat = new Vector2(1, 1);
+ this.center = new Vector2(0, 0);
+ this.rotation = 0;
+ this.matrixAutoUpdate = true;
+ this.matrix = new Matrix3();
+ this.generateMipmaps = true;
+ this.premultiplyAlpha = false;
+ this.flipY = true;
+ this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
+ // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.
+ //
+ // Also changing the encoding after already used by a Material will not automatically make the Material
+ // update. You need to explicitly call Material.needsUpdate to trigger it to recompile.
- },
+ this.encoding = encoding !== undefined ? encoding : LinearEncoding;
+ this.version = 0;
+ this.onUpdate = null;
+ }
- convertGammaToLinear: function () {
+ Texture.DEFAULT_IMAGE = undefined;
+ Texture.DEFAULT_MAPPING = UVMapping;
+ Texture.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
+ constructor: Texture,
+ isTexture: true,
+ updateMatrix: function updateMatrix() {
+ this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y);
+ },
+ clone: function clone() {
+ return new this.constructor().copy(this);
+ },
+ copy: function copy(source) {
+ this.name = source.name;
+ this.image = source.image;
+ this.mipmaps = source.mipmaps.slice(0);
+ this.mapping = source.mapping;
+ this.wrapS = source.wrapS;
+ this.wrapT = source.wrapT;
+ this.magFilter = source.magFilter;
+ this.minFilter = source.minFilter;
+ this.anisotropy = source.anisotropy;
+ this.format = source.format;
+ this.internalFormat = source.internalFormat;
+ this.type = source.type;
+ this.offset.copy(source.offset);
+ this.repeat.copy(source.repeat);
+ this.center.copy(source.center);
+ this.rotation = source.rotation;
+ this.matrixAutoUpdate = source.matrixAutoUpdate;
+ this.matrix.copy(source.matrix);
+ this.generateMipmaps = source.generateMipmaps;
+ this.premultiplyAlpha = source.premultiplyAlpha;
+ this.flipY = source.flipY;
+ this.unpackAlignment = source.unpackAlignment;
+ this.encoding = source.encoding;
+ return this;
+ },
+ toJSON: function toJSON(meta) {
+ var isRootObject = meta === undefined || typeof meta === 'string';
+
+ if (!isRootObject && meta.textures[this.uuid] !== undefined) {
+ return meta.textures[this.uuid];
+ }
+
+ var output = {
+ metadata: {
+ version: 4.5,
+ type: 'Texture',
+ generator: 'Texture.toJSON'
+ },
+ uuid: this.uuid,
+ name: this.name,
+ mapping: this.mapping,
+ repeat: [this.repeat.x, this.repeat.y],
+ offset: [this.offset.x, this.offset.y],
+ center: [this.center.x, this.center.y],
+ rotation: this.rotation,
+ wrap: [this.wrapS, this.wrapT],
+ format: this.format,
+ type: this.type,
+ encoding: this.encoding,
+ minFilter: this.minFilter,
+ magFilter: this.magFilter,
+ anisotropy: this.anisotropy,
+ flipY: this.flipY,
+ premultiplyAlpha: this.premultiplyAlpha,
+ unpackAlignment: this.unpackAlignment
+ };
- var r = this.r, g = this.g, b = this.b;
+ if (this.image !== undefined) {
+ // TODO: Move to THREE.Image
+ var image = this.image;
- this.r = r * r;
- this.g = g * g;
- this.b = b * b;
+ if (image.uuid === undefined) {
+ image.uuid = MathUtils.generateUUID(); // UGH
+ }
- return this;
+ if (!isRootObject && meta.images[image.uuid] === undefined) {
+ var url;
- },
+ if (Array.isArray(image)) {
+ // process array of images e.g. CubeTexture
+ url = [];
- convertLinearToGamma: function () {
-
- this.r = Math.sqrt( this.r );
- this.g = Math.sqrt( this.g );
- this.b = Math.sqrt( this.b );
+ for (var i = 0, l = image.length; i < l; i++) {
+ url.push(ImageUtils.getDataURL(image[i]));
+ }
+ } else {
+ // process single image
+ url = ImageUtils.getDataURL(image);
+ }
- return this;
+ meta.images[image.uuid] = {
+ uuid: image.uuid,
+ url: url
+ };
+ }
- },
+ output.image = image.uuid;
+ }
- getHex: function () {
+ if (!isRootObject) {
+ meta.textures[this.uuid] = output;
+ }
- return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
+ return output;
+ },
+ dispose: function dispose() {
+ this.dispatchEvent({
+ type: 'dispose'
+ });
+ },
+ transformUv: function transformUv(uv) {
+ if (this.mapping !== UVMapping) return uv;
+ uv.applyMatrix3(this.matrix);
+
+ if (uv.x < 0 || uv.x > 1) {
+ switch (this.wrapS) {
+ case RepeatWrapping:
+ uv.x = uv.x - Math.floor(uv.x);
+ break;
- },
+ case ClampToEdgeWrapping:
+ uv.x = uv.x < 0 ? 0 : 1;
+ break;
- getHexString: function () {
+ case MirroredRepeatWrapping:
+ if (Math.abs(Math.floor(uv.x) % 2) === 1) {
+ uv.x = Math.ceil(uv.x) - uv.x;
+ } else {
+ uv.x = uv.x - Math.floor(uv.x);
+ }
- return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );
+ break;
+ }
+ }
- },
+ if (uv.y < 0 || uv.y > 1) {
+ switch (this.wrapT) {
+ case RepeatWrapping:
+ uv.y = uv.y - Math.floor(uv.y);
+ break;
- getHSL: function ( optionalTarget ) {
+ case ClampToEdgeWrapping:
+ uv.y = uv.y < 0 ? 0 : 1;
+ break;
- // h,s,l ranges are in 0.0 - 1.0
+ case MirroredRepeatWrapping:
+ if (Math.abs(Math.floor(uv.y) % 2) === 1) {
+ uv.y = Math.ceil(uv.y) - uv.y;
+ } else {
+ uv.y = uv.y - Math.floor(uv.y);
+ }
- var hsl = optionalTarget || { h: 0, s: 0, l: 0 };
+ break;
+ }
+ }
- var r = this.r, g = this.g, b = this.b;
+ if (this.flipY) {
+ uv.y = 1 - uv.y;
+ }
- var max = Math.max( r, g, b );
- var min = Math.min( r, g, b );
+ return uv;
+ }
+ });
+ Object.defineProperty(Texture.prototype, "needsUpdate", {
+ set: function set(value) {
+ if (value === true) this.version++;
+ }
+ });
- var hue, saturation;
- var lightness = ( min + max ) / 2.0;
+ var Vector4 = /*#__PURE__*/function () {
+ function Vector4(x, y, z, w) {
+ if (x === void 0) {
+ x = 0;
+ }
- if ( min === max ) {
+ if (y === void 0) {
+ y = 0;
+ }
- hue = 0;
- saturation = 0;
+ if (z === void 0) {
+ z = 0;
+ }
- } else {
+ if (w === void 0) {
+ w = 1;
+ }
- var delta = max - min;
+ Object.defineProperty(this, 'isVector4', {
+ value: true
+ });
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.w = w;
+ }
- saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );
+ var _proto = Vector4.prototype;
- switch ( max ) {
+ _proto.set = function set(x, y, z, w) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.w = w;
+ return this;
+ };
- case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;
- case g: hue = ( b - r ) / delta + 2; break;
- case b: hue = ( r - g ) / delta + 4; break;
+ _proto.setScalar = function setScalar(scalar) {
+ this.x = scalar;
+ this.y = scalar;
+ this.z = scalar;
+ this.w = scalar;
+ return this;
+ };
- }
+ _proto.setX = function setX(x) {
+ this.x = x;
+ return this;
+ };
- hue /= 6;
+ _proto.setY = function setY(y) {
+ this.y = y;
+ return this;
+ };
- }
+ _proto.setZ = function setZ(z) {
+ this.z = z;
+ return this;
+ };
- hsl.h = hue;
- hsl.s = saturation;
- hsl.l = lightness;
+ _proto.setW = function setW(w) {
+ this.w = w;
+ return this;
+ };
- return hsl;
+ _proto.setComponent = function setComponent(index, value) {
+ switch (index) {
+ case 0:
+ this.x = value;
+ break;
- },
+ case 1:
+ this.y = value;
+ break;
- getStyle: function () {
+ case 2:
+ this.z = value;
+ break;
- return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
+ case 3:
+ this.w = value;
+ break;
- },
+ default:
+ throw new Error('index is out of range: ' + index);
+ }
- offsetHSL: function ( h, s, l ) {
+ return this;
+ };
- var hsl = this.getHSL();
+ _proto.getComponent = function getComponent(index) {
+ switch (index) {
+ case 0:
+ return this.x;
- hsl.h += h; hsl.s += s; hsl.l += l;
+ case 1:
+ return this.y;
- this.setHSL( hsl.h, hsl.s, hsl.l );
+ case 2:
+ return this.z;
- return this;
+ case 3:
+ return this.w;
- },
+ default:
+ throw new Error('index is out of range: ' + index);
+ }
+ };
- add: function ( color ) {
+ _proto.clone = function clone() {
+ return new this.constructor(this.x, this.y, this.z, this.w);
+ };
- this.r += color.r;
- this.g += color.g;
- this.b += color.b;
+ _proto.copy = function copy(v) {
+ this.x = v.x;
+ this.y = v.y;
+ this.z = v.z;
+ this.w = v.w !== undefined ? v.w : 1;
+ return this;
+ };
- return this;
+ _proto.add = function add(v, w) {
+ if (w !== undefined) {
+ console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
+ return this.addVectors(v, w);
+ }
- },
+ this.x += v.x;
+ this.y += v.y;
+ this.z += v.z;
+ this.w += v.w;
+ return this;
+ };
- addColors: function ( color1, color2 ) {
+ _proto.addScalar = function addScalar(s) {
+ this.x += s;
+ this.y += s;
+ this.z += s;
+ this.w += s;
+ return this;
+ };
- this.r = color1.r + color2.r;
- this.g = color1.g + color2.g;
- this.b = color1.b + color2.b;
+ _proto.addVectors = function addVectors(a, b) {
+ this.x = a.x + b.x;
+ this.y = a.y + b.y;
+ this.z = a.z + b.z;
+ this.w = a.w + b.w;
+ return this;
+ };
- return this;
+ _proto.addScaledVector = function addScaledVector(v, s) {
+ this.x += v.x * s;
+ this.y += v.y * s;
+ this.z += v.z * s;
+ this.w += v.w * s;
+ return this;
+ };
- },
+ _proto.sub = function sub(v, w) {
+ if (w !== undefined) {
+ console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
+ return this.subVectors(v, w);
+ }
- addScalar: function ( s ) {
+ this.x -= v.x;
+ this.y -= v.y;
+ this.z -= v.z;
+ this.w -= v.w;
+ return this;
+ };
- this.r += s;
- this.g += s;
- this.b += s;
+ _proto.subScalar = function subScalar(s) {
+ this.x -= s;
+ this.y -= s;
+ this.z -= s;
+ this.w -= s;
+ return this;
+ };
- return this;
+ _proto.subVectors = function subVectors(a, b) {
+ this.x = a.x - b.x;
+ this.y = a.y - b.y;
+ this.z = a.z - b.z;
+ this.w = a.w - b.w;
+ return this;
+ };
- },
+ _proto.multiplyScalar = function multiplyScalar(scalar) {
+ this.x *= scalar;
+ this.y *= scalar;
+ this.z *= scalar;
+ this.w *= scalar;
+ return this;
+ };
- multiply: function ( color ) {
+ _proto.applyMatrix4 = function applyMatrix4(m) {
+ var x = this.x,
+ y = this.y,
+ z = this.z,
+ w = this.w;
+ var e = m.elements;
+ this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;
+ this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;
+ this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;
+ this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;
+ return this;
+ };
- this.r *= color.r;
- this.g *= color.g;
- this.b *= color.b;
+ _proto.divideScalar = function divideScalar(scalar) {
+ return this.multiplyScalar(1 / scalar);
+ };
- return this;
+ _proto.setAxisAngleFromQuaternion = function setAxisAngleFromQuaternion(q) {
+ // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
+ // q is assumed to be normalized
+ this.w = 2 * Math.acos(q.w);
+ var s = Math.sqrt(1 - q.w * q.w);
- },
+ if (s < 0.0001) {
+ this.x = 1;
+ this.y = 0;
+ this.z = 0;
+ } else {
+ this.x = q.x / s;
+ this.y = q.y / s;
+ this.z = q.z / s;
+ }
- multiplyScalar: function ( s ) {
+ return this;
+ };
- this.r *= s;
- this.g *= s;
- this.b *= s;
+ _proto.setAxisAngleFromRotationMatrix = function setAxisAngleFromRotationMatrix(m) {
+ // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
+ // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+ var angle, x, y, z; // variables for result
- return this;
+ var epsilon = 0.01,
+ // margin to allow for rounding errors
+ epsilon2 = 0.1,
+ // margin to distinguish between 0 and 180 degrees
+ te = m.elements,
+ m11 = te[0],
+ m12 = te[4],
+ m13 = te[8],
+ m21 = te[1],
+ m22 = te[5],
+ m23 = te[9],
+ m31 = te[2],
+ m32 = te[6],
+ m33 = te[10];
+
+ if (Math.abs(m12 - m21) < epsilon && Math.abs(m13 - m31) < epsilon && Math.abs(m23 - m32) < epsilon) {
+ // singularity found
+ // first check for identity matrix which must have +1 for all terms
+ // in leading diagonal and zero in other terms
+ if (Math.abs(m12 + m21) < epsilon2 && Math.abs(m13 + m31) < epsilon2 && Math.abs(m23 + m32) < epsilon2 && Math.abs(m11 + m22 + m33 - 3) < epsilon2) {
+ // this singularity is identity matrix so angle = 0
+ this.set(1, 0, 0, 0);
+ return this; // zero angle, arbitrary axis
+ } // otherwise this singularity is angle = 180
+
+
+ angle = Math.PI;
+ var xx = (m11 + 1) / 2;
+ var yy = (m22 + 1) / 2;
+ var zz = (m33 + 1) / 2;
+ var xy = (m12 + m21) / 4;
+ var xz = (m13 + m31) / 4;
+ var yz = (m23 + m32) / 4;
+
+ if (xx > yy && xx > zz) {
+ // m11 is the largest diagonal term
+ if (xx < epsilon) {
+ x = 0;
+ y = 0.707106781;
+ z = 0.707106781;
+ } else {
+ x = Math.sqrt(xx);
+ y = xy / x;
+ z = xz / x;
+ }
+ } else if (yy > zz) {
+ // m22 is the largest diagonal term
+ if (yy < epsilon) {
+ x = 0.707106781;
+ y = 0;
+ z = 0.707106781;
+ } else {
+ y = Math.sqrt(yy);
+ x = xy / y;
+ z = yz / y;
+ }
+ } else {
+ // m33 is the largest diagonal term so base result on this
+ if (zz < epsilon) {
+ x = 0.707106781;
+ y = 0.707106781;
+ z = 0;
+ } else {
+ z = Math.sqrt(zz);
+ x = xz / z;
+ y = yz / z;
+ }
+ }
- },
+ this.set(x, y, z, angle);
+ return this; // return 180 deg rotation
+ } // as we have reached here there are no singularities so we can handle normally
- lerp: function ( color, alpha ) {
- this.r += ( color.r - this.r ) * alpha;
- this.g += ( color.g - this.g ) * alpha;
- this.b += ( color.b - this.b ) * alpha;
+ var s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12)); // used to normalize
- return this;
+ if (Math.abs(s) < 0.001) s = 1; // prevent divide by zero, should not happen if matrix is orthogonal and should be
+ // caught by singularity test above, but I've left it in just in case
- },
+ this.x = (m32 - m23) / s;
+ this.y = (m13 - m31) / s;
+ this.z = (m21 - m12) / s;
+ this.w = Math.acos((m11 + m22 + m33 - 1) / 2);
+ return this;
+ };
- equals: function ( c ) {
+ _proto.min = function min(v) {
+ this.x = Math.min(this.x, v.x);
+ this.y = Math.min(this.y, v.y);
+ this.z = Math.min(this.z, v.z);
+ this.w = Math.min(this.w, v.w);
+ return this;
+ };
- return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );
+ _proto.max = function max(v) {
+ this.x = Math.max(this.x, v.x);
+ this.y = Math.max(this.y, v.y);
+ this.z = Math.max(this.z, v.z);
+ this.w = Math.max(this.w, v.w);
+ return this;
+ };
- },
+ _proto.clamp = function clamp(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));
+ this.z = Math.max(min.z, Math.min(max.z, this.z));
+ this.w = Math.max(min.w, Math.min(max.w, this.w));
+ return this;
+ };
- fromArray: function ( array ) {
+ _proto.clampScalar = function clampScalar(minVal, maxVal) {
+ this.x = Math.max(minVal, Math.min(maxVal, this.x));
+ this.y = Math.max(minVal, Math.min(maxVal, this.y));
+ this.z = Math.max(minVal, Math.min(maxVal, this.z));
+ this.w = Math.max(minVal, Math.min(maxVal, this.w));
+ return this;
+ };
- this.r = array[ 0 ];
- this.g = array[ 1 ];
- this.b = array[ 2 ];
+ _proto.clampLength = function clampLength(min, max) {
+ var length = this.length();
+ return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
+ };
- return this;
+ _proto.floor = function floor() {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ this.z = Math.floor(this.z);
+ this.w = Math.floor(this.w);
+ return this;
+ };
- },
+ _proto.ceil = function ceil() {
+ this.x = Math.ceil(this.x);
+ this.y = Math.ceil(this.y);
+ this.z = Math.ceil(this.z);
+ this.w = Math.ceil(this.w);
+ return this;
+ };
- toArray: function () {
+ _proto.round = function round() {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ this.z = Math.round(this.z);
+ this.w = Math.round(this.w);
+ return this;
+ };
- return [ this.r, this.g, this.b ];
+ _proto.roundToZero = function roundToZero() {
+ 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);
+ this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z);
+ this.w = this.w < 0 ? Math.ceil(this.w) : Math.floor(this.w);
+ return this;
+ };
- },
+ _proto.negate = function negate() {
+ this.x = -this.x;
+ this.y = -this.y;
+ this.z = -this.z;
+ this.w = -this.w;
+ return this;
+ };
- clone: function () {
+ _proto.dot = function dot(v) {
+ return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
+ };
- return new THREE.Color().setRGB( this.r, this.g, this.b );
+ _proto.lengthSq = function lengthSq() {
+ return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
+ };
- }
+ _proto.length = function length() {
+ return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
+ };
-};
+ _proto.manhattanLength = function manhattanLength() {
+ return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);
+ };
-THREE.ColorKeywords = { "aliceblue": 0xF0F8FF, "antiquewhite": 0xFAEBD7, "aqua": 0x00FFFF, "aquamarine": 0x7FFFD4, "azure": 0xF0FFFF,
-"beige": 0xF5F5DC, "bisque": 0xFFE4C4, "black": 0x000000, "blanchedalmond": 0xFFEBCD, "blue": 0x0000FF, "blueviolet": 0x8A2BE2,
-"brown": 0xA52A2A, "burlywood": 0xDEB887, "cadetblue": 0x5F9EA0, "chartreuse": 0x7FFF00, "chocolate": 0xD2691E, "coral": 0xFF7F50,
-"cornflowerblue": 0x6495ED, "cornsilk": 0xFFF8DC, "crimson": 0xDC143C, "cyan": 0x00FFFF, "darkblue": 0x00008B, "darkcyan": 0x008B8B,
-"darkgoldenrod": 0xB8860B, "darkgray": 0xA9A9A9, "darkgreen": 0x006400, "darkgrey": 0xA9A9A9, "darkkhaki": 0xBDB76B, "darkmagenta": 0x8B008B,
-"darkolivegreen": 0x556B2F, "darkorange": 0xFF8C00, "darkorchid": 0x9932CC, "darkred": 0x8B0000, "darksalmon": 0xE9967A, "darkseagreen": 0x8FBC8F,
-"darkslateblue": 0x483D8B, "darkslategray": 0x2F4F4F, "darkslategrey": 0x2F4F4F, "darkturquoise": 0x00CED1, "darkviolet": 0x9400D3,
-"deeppink": 0xFF1493, "deepskyblue": 0x00BFFF, "dimgray": 0x696969, "dimgrey": 0x696969, "dodgerblue": 0x1E90FF, "firebrick": 0xB22222,
-"floralwhite": 0xFFFAF0, "forestgreen": 0x228B22, "fuchsia": 0xFF00FF, "gainsboro": 0xDCDCDC, "ghostwhite": 0xF8F8FF, "gold": 0xFFD700,
-"goldenrod": 0xDAA520, "gray": 0x808080, "green": 0x008000, "greenyellow": 0xADFF2F, "grey": 0x808080, "honeydew": 0xF0FFF0, "hotpink": 0xFF69B4,
-"indianred": 0xCD5C5C, "indigo": 0x4B0082, "ivory": 0xFFFFF0, "khaki": 0xF0E68C, "lavender": 0xE6E6FA, "lavenderblush": 0xFFF0F5, "lawngreen": 0x7CFC00,
-"lemonchiffon": 0xFFFACD, "lightblue": 0xADD8E6, "lightcoral": 0xF08080, "lightcyan": 0xE0FFFF, "lightgoldenrodyellow": 0xFAFAD2, "lightgray": 0xD3D3D3,
-"lightgreen": 0x90EE90, "lightgrey": 0xD3D3D3, "lightpink": 0xFFB6C1, "lightsalmon": 0xFFA07A, "lightseagreen": 0x20B2AA, "lightskyblue": 0x87CEFA,
-"lightslategray": 0x778899, "lightslategrey": 0x778899, "lightsteelblue": 0xB0C4DE, "lightyellow": 0xFFFFE0, "lime": 0x00FF00, "limegreen": 0x32CD32,
-"linen": 0xFAF0E6, "magenta": 0xFF00FF, "maroon": 0x800000, "mediumaquamarine": 0x66CDAA, "mediumblue": 0x0000CD, "mediumorchid": 0xBA55D3,
-"mediumpurple": 0x9370DB, "mediumseagreen": 0x3CB371, "mediumslateblue": 0x7B68EE, "mediumspringgreen": 0x00FA9A, "mediumturquoise": 0x48D1CC,
-"mediumvioletred": 0xC71585, "midnightblue": 0x191970, "mintcream": 0xF5FFFA, "mistyrose": 0xFFE4E1, "moccasin": 0xFFE4B5, "navajowhite": 0xFFDEAD,
-"navy": 0x000080, "oldlace": 0xFDF5E6, "olive": 0x808000, "olivedrab": 0x6B8E23, "orange": 0xFFA500, "orangered": 0xFF4500, "orchid": 0xDA70D6,
-"palegoldenrod": 0xEEE8AA, "palegreen": 0x98FB98, "paleturquoise": 0xAFEEEE, "palevioletred": 0xDB7093, "papayawhip": 0xFFEFD5, "peachpuff": 0xFFDAB9,
-"peru": 0xCD853F, "pink": 0xFFC0CB, "plum": 0xDDA0DD, "powderblue": 0xB0E0E6, "purple": 0x800080, "red": 0xFF0000, "rosybrown": 0xBC8F8F,
-"royalblue": 0x4169E1, "saddlebrown": 0x8B4513, "salmon": 0xFA8072, "sandybrown": 0xF4A460, "seagreen": 0x2E8B57, "seashell": 0xFFF5EE,
-"sienna": 0xA0522D, "silver": 0xC0C0C0, "skyblue": 0x87CEEB, "slateblue": 0x6A5ACD, "slategray": 0x708090, "slategrey": 0x708090, "snow": 0xFFFAFA,
-"springgreen": 0x00FF7F, "steelblue": 0x4682B4, "tan": 0xD2B48C, "teal": 0x008080, "thistle": 0xD8BFD8, "tomato": 0xFF6347, "turquoise": 0x40E0D0,
-"violet": 0xEE82EE, "wheat": 0xF5DEB3, "white": 0xFFFFFF, "whitesmoke": 0xF5F5F5, "yellow": 0xFFFF00, "yellowgreen": 0x9ACD32 };
+ _proto.normalize = function normalize() {
+ return this.divideScalar(this.length() || 1);
+ };
-/**
- * @author mikael emtinger / http://gomo.se/
- * @author alteredq / http://alteredqualia.com/
- * @author WestLangley / http://github.com/WestLangley
- * @author bhouston / http://exocortex.com
- */
+ _proto.setLength = function setLength(length) {
+ return this.normalize().multiplyScalar(length);
+ };
-THREE.Quaternion = function ( x, y, z, w ) {
+ _proto.lerp = function lerp(v, alpha) {
+ this.x += (v.x - this.x) * alpha;
+ this.y += (v.y - this.y) * alpha;
+ this.z += (v.z - this.z) * alpha;
+ this.w += (v.w - this.w) * alpha;
+ return this;
+ };
- this._x = x || 0;
- this._y = y || 0;
- this._z = z || 0;
- this._w = ( w !== undefined ) ? w : 1;
+ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) {
+ this.x = v1.x + (v2.x - v1.x) * alpha;
+ this.y = v1.y + (v2.y - v1.y) * alpha;
+ this.z = v1.z + (v2.z - v1.z) * alpha;
+ this.w = v1.w + (v2.w - v1.w) * alpha;
+ return this;
+ };
-};
+ _proto.equals = function equals(v) {
+ return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;
+ };
-THREE.Quaternion.prototype = {
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- constructor: THREE.Quaternion,
+ this.x = array[offset];
+ this.y = array[offset + 1];
+ this.z = array[offset + 2];
+ this.w = array[offset + 3];
+ return this;
+ };
- _x: 0,_y: 0, _z: 0, _w: 0,
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- get x () {
+ if (offset === void 0) {
+ offset = 0;
+ }
- return this._x;
+ array[offset] = this.x;
+ array[offset + 1] = this.y;
+ array[offset + 2] = this.z;
+ array[offset + 3] = this.w;
+ return array;
+ };
- },
+ _proto.fromBufferAttribute = function fromBufferAttribute(attribute, index, offset) {
+ if (offset !== undefined) {
+ console.warn('THREE.Vector4: offset has been removed from .fromBufferAttribute().');
+ }
- set x ( value ) {
+ this.x = attribute.getX(index);
+ this.y = attribute.getY(index);
+ this.z = attribute.getZ(index);
+ this.w = attribute.getW(index);
+ return this;
+ };
- this._x = value;
- this.onChangeCallback();
+ _proto.random = function random() {
+ this.x = Math.random();
+ this.y = Math.random();
+ this.z = Math.random();
+ this.w = Math.random();
+ return this;
+ };
- },
+ _createClass(Vector4, [{
+ key: "width",
+ get: function get() {
+ return this.z;
+ },
+ set: function set(value) {
+ this.z = value;
+ }
+ }, {
+ key: "height",
+ get: function get() {
+ return this.w;
+ },
+ set: function set(value) {
+ this.w = value;
+ }
+ }]);
+
+ return Vector4;
+ }();
- get y () {
+ /*
+ In options, we can specify:
+ * Texture parameters for an auto-generated target texture
+ * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers
+ */
- return this._y;
+ function WebGLRenderTarget(width, height, options) {
+ this.width = width;
+ this.height = height;
+ this.scissor = new Vector4(0, 0, width, height);
+ this.scissorTest = false;
+ this.viewport = new Vector4(0, 0, width, height);
+ options = options || {};
+ this.texture = new Texture(undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding);
+ this.texture.image = {};
+ this.texture.image.width = width;
+ this.texture.image.height = height;
+ this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;
+ this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;
+ this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
+ this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;
+ this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
+ }
+
+ WebGLRenderTarget.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
+ constructor: WebGLRenderTarget,
+ isWebGLRenderTarget: true,
+ setSize: function setSize(width, height) {
+ if (this.width !== width || this.height !== height) {
+ this.width = width;
+ this.height = height;
+ this.texture.image.width = width;
+ this.texture.image.height = height;
+ this.dispose();
+ }
+
+ this.viewport.set(0, 0, width, height);
+ this.scissor.set(0, 0, width, height);
+ },
+ clone: function clone() {
+ return new this.constructor().copy(this);
+ },
+ copy: function copy(source) {
+ this.width = source.width;
+ this.height = source.height;
+ this.viewport.copy(source.viewport);
+ this.texture = source.texture.clone();
+ this.depthBuffer = source.depthBuffer;
+ this.stencilBuffer = source.stencilBuffer;
+ this.depthTexture = source.depthTexture;
+ return this;
+ },
+ dispose: function dispose() {
+ this.dispatchEvent({
+ type: 'dispose'
+ });
+ }
+ });
- },
+ function WebGLMultisampleRenderTarget(width, height, options) {
+ WebGLRenderTarget.call(this, width, height, options);
+ this.samples = 4;
+ }
- set y ( value ) {
+ WebGLMultisampleRenderTarget.prototype = Object.assign(Object.create(WebGLRenderTarget.prototype), {
+ constructor: WebGLMultisampleRenderTarget,
+ isWebGLMultisampleRenderTarget: true,
+ copy: function copy(source) {
+ WebGLRenderTarget.prototype.copy.call(this, source);
+ this.samples = source.samples;
+ return this;
+ }
+ });
- this._y = value;
- this.onChangeCallback();
+ var Quaternion = /*#__PURE__*/function () {
+ function Quaternion(x, y, z, w) {
+ if (x === void 0) {
+ x = 0;
+ }
- },
+ if (y === void 0) {
+ y = 0;
+ }
- get z () {
+ if (z === void 0) {
+ z = 0;
+ }
- return this._z;
+ if (w === void 0) {
+ w = 1;
+ }
- },
+ Object.defineProperty(this, 'isQuaternion', {
+ value: true
+ });
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ this._w = w;
+ }
- set z ( value ) {
+ Quaternion.slerp = function slerp(qa, qb, qm, t) {
+ return qm.copy(qa).slerp(qb, t);
+ };
- this._z = value;
- this.onChangeCallback();
+ Quaternion.slerpFlat = function slerpFlat(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];
+ var 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;
+ var 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;
+ }
+ }
- get w () {
+ dst[dstOffset] = x0;
+ dst[dstOffset + 1] = y0;
+ dst[dstOffset + 2] = z0;
+ dst[dstOffset + 3] = w0;
+ };
- return this._w;
+ Quaternion.multiplyQuaternionsFlat = function multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) {
+ var x0 = src0[srcOffset0];
+ var y0 = src0[srcOffset0 + 1];
+ var z0 = src0[srcOffset0 + 2];
+ var w0 = src0[srcOffset0 + 3];
+ var x1 = src1[srcOffset1];
+ var y1 = src1[srcOffset1 + 1];
+ var z1 = src1[srcOffset1 + 2];
+ var w1 = src1[srcOffset1 + 3];
+ dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;
+ dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;
+ dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;
+ dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;
+ return dst;
+ };
- },
+ var _proto = Quaternion.prototype;
- set w ( value ) {
+ _proto.set = function set(x, y, z, w) {
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ this._w = w;
- this._w = value;
- this.onChangeCallback();
+ this._onChangeCallback();
- },
+ return this;
+ };
- set: function ( x, y, z, w ) {
+ _proto.clone = function clone() {
+ return new this.constructor(this._x, this._y, this._z, this._w);
+ };
- this._x = x;
- this._y = y;
- this._z = z;
- this._w = w;
+ _proto.copy = function copy(quaternion) {
+ this._x = quaternion.x;
+ this._y = quaternion.y;
+ this._z = quaternion.z;
+ this._w = quaternion.w;
- this.onChangeCallback();
+ this._onChangeCallback();
- return this;
+ return this;
+ };
- },
+ _proto.setFromEuler = function setFromEuler(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);
+
+ switch (order) {
+ case '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;
+ break;
- copy: function ( quaternion ) {
+ case '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;
+ break;
- this._x = quaternion._x;
- this._y = quaternion._y;
- this._z = quaternion._z;
- this._w = quaternion._w;
+ case '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;
+ break;
- this.onChangeCallback();
+ case '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;
+ break;
- return this;
+ case '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;
+ break;
- },
+ case '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;
+ break;
- setFromEuler: function ( euler, update ) {
+ default:
+ console.warn('THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order);
+ }
- if ( euler instanceof THREE.Euler === false ) {
+ if (update !== false) this._onChangeCallback();
+ return this;
+ };
- throw new Error( 'ERROR: Quaternion\'s .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.' );
- }
+ _proto.setFromAxisAngle = function setFromAxisAngle(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);
- // http://www.mathworks.com/matlabcentral/fileexchange/
- // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
- // content/SpinCalc.m
+ this._onChangeCallback();
- var c1 = Math.cos( euler._x / 2 );
- var c2 = Math.cos( euler._y / 2 );
- var c3 = Math.cos( euler._z / 2 );
- var s1 = Math.sin( euler._x / 2 );
- var s2 = Math.sin( euler._y / 2 );
- var s3 = Math.sin( euler._z / 2 );
+ return this;
+ };
- if ( euler.order === 'XYZ' ) {
+ _proto.setFromRotationMatrix = function setFromRotationMatrix(m) {
+ // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
+ // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+ var te = m.elements,
+ m11 = te[0],
+ m12 = te[4],
+ m13 = te[8],
+ m21 = te[1],
+ m22 = te[5],
+ m23 = te[9],
+ m31 = te[2],
+ m32 = te[6],
+ m33 = te[10],
+ trace = m11 + m22 + m33;
+
+ if (trace > 0) {
+ var s = 0.5 / Math.sqrt(trace + 1.0);
+ this._w = 0.25 / s;
+ this._x = (m32 - m23) * s;
+ this._y = (m13 - m31) * s;
+ this._z = (m21 - m12) * s;
+ } else if (m11 > m22 && m11 > m33) {
+ var _s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
+
+ this._w = (m32 - m23) / _s;
+ this._x = 0.25 * _s;
+ this._y = (m12 + m21) / _s;
+ this._z = (m13 + m31) / _s;
+ } else if (m22 > m33) {
+ var _s2 = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
+
+ this._w = (m13 - m31) / _s2;
+ this._x = (m12 + m21) / _s2;
+ this._y = 0.25 * _s2;
+ this._z = (m23 + m32) / _s2;
+ } else {
+ var _s3 = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
- 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;
+ this._w = (m21 - m12) / _s3;
+ this._x = (m13 + m31) / _s3;
+ this._y = (m23 + m32) / _s3;
+ this._z = 0.25 * _s3;
+ }
- } else if ( euler.order === 'YXZ' ) {
+ this._onChangeCallback();
- 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;
+ return this;
+ };
- } else if ( euler.order === 'ZXY' ) {
+ _proto.setFromUnitVectors = function setFromUnitVectors(vFrom, vTo) {
+ // assumes direction vectors vFrom and vTo are normalized
+ var EPS = 0.000001;
+ var r = vFrom.dot(vTo) + 1;
- 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 (r < EPS) {
+ r = 0;
- } else if ( euler.order === 'ZYX' ) {
+ if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {
+ this._x = -vFrom.y;
+ this._y = vFrom.x;
+ this._z = 0;
+ this._w = r;
+ } else {
+ this._x = 0;
+ this._y = -vFrom.z;
+ this._z = vFrom.y;
+ this._w = r;
+ }
+ } else {
+ // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3
+ this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;
+ this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;
+ this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;
+ this._w = r;
+ }
- 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;
+ return this.normalize();
+ };
- } else if ( euler.order === 'YZX' ) {
+ _proto.angleTo = function angleTo(q) {
+ return 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1)));
+ };
- 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;
+ _proto.rotateTowards = function rotateTowards(q, step) {
+ var angle = this.angleTo(q);
+ if (angle === 0) return this;
+ var t = Math.min(1, step / angle);
+ this.slerp(q, t);
+ return this;
+ };
- } else if ( euler.order === 'XZY' ) {
+ _proto.identity = function identity() {
+ return this.set(0, 0, 0, 1);
+ };
- 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;
+ _proto.inverse = function inverse() {
+ // quaternion is assumed to have unit length
+ return this.conjugate();
+ };
- }
+ _proto.conjugate = function conjugate() {
+ this._x *= -1;
+ this._y *= -1;
+ this._z *= -1;
- if ( update !== false ) this.onChangeCallback();
+ this._onChangeCallback();
- return this;
+ return this;
+ };
- },
+ _proto.dot = function dot(v) {
+ return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
+ };
- setFromAxisAngle: function ( axis, angle ) {
+ _proto.lengthSq = function lengthSq() {
+ return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
+ };
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
+ _proto.length = function length() {
+ return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
+ };
- // assumes axis is normalized
+ _proto.normalize = function normalize() {
+ var l = this.length();
- var halfAngle = angle / 2, s = Math.sin( halfAngle );
+ if (l === 0) {
+ this._x = 0;
+ this._y = 0;
+ this._z = 0;
+ this._w = 1;
+ } else {
+ l = 1 / l;
+ this._x = this._x * l;
+ this._y = this._y * l;
+ this._z = this._z * l;
+ this._w = this._w * l;
+ }
- this._x = axis.x * s;
- this._y = axis.y * s;
- this._z = axis.z * s;
- this._w = Math.cos( halfAngle );
+ this._onChangeCallback();
- this.onChangeCallback();
+ return this;
+ };
- return this;
+ _proto.multiply = function multiply(q, p) {
+ if (p !== undefined) {
+ console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');
+ return this.multiplyQuaternions(q, p);
+ }
- },
+ return this.multiplyQuaternions(this, q);
+ };
- setFromRotationMatrix: function ( m ) {
+ _proto.premultiply = function premultiply(q) {
+ return this.multiplyQuaternions(q, this);
+ };
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
+ _proto.multiplyQuaternions = function multiplyQuaternions(a, b) {
+ // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
+ var qax = a._x,
+ qay = a._y,
+ qaz = a._z,
+ qaw = a._w;
+ var qbx = b._x,
+ qby = b._y,
+ qbz = b._z,
+ qbw = b._w;
+ this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
+ this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
+ this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
+ this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
+
+ this._onChangeCallback();
- // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+ return this;
+ };
- var te = m.elements,
+ _proto.slerp = function slerp(qb, t) {
+ if (t === 0) return this;
+ if (t === 1) return this.copy(qb);
+ var x = this._x,
+ y = this._y,
+ z = this._z,
+ w = this._w; // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
+
+ var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
+
+ if (cosHalfTheta < 0) {
+ this._w = -qb._w;
+ this._x = -qb._x;
+ this._y = -qb._y;
+ this._z = -qb._z;
+ cosHalfTheta = -cosHalfTheta;
+ } else {
+ this.copy(qb);
+ }
- m11 = te[0], m12 = te[4], m13 = te[8],
- m21 = te[1], m22 = te[5], m23 = te[9],
- m31 = te[2], m32 = te[6], m33 = te[10],
+ if (cosHalfTheta >= 1.0) {
+ this._w = w;
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ return this;
+ }
- trace = m11 + m22 + m33,
- s;
+ var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
- if ( trace > 0 ) {
+ if (sqrSinHalfTheta <= Number.EPSILON) {
+ var s = 1 - t;
+ this._w = s * w + t * this._w;
+ this._x = s * x + t * this._x;
+ this._y = s * y + t * this._y;
+ this._z = s * z + t * this._z;
+ this.normalize();
- s = 0.5 / Math.sqrt( trace + 1.0 );
+ this._onChangeCallback();
- this._w = 0.25 / s;
- this._x = ( m32 - m23 ) * s;
- this._y = ( m13 - m31 ) * s;
- this._z = ( m21 - m12 ) * s;
+ return this;
+ }
- } else if ( m11 > m22 && m11 > m33 ) {
+ var sinHalfTheta = Math.sqrt(sqrSinHalfTheta);
+ var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);
+ var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta,
+ ratioB = Math.sin(t * halfTheta) / sinHalfTheta;
+ this._w = w * ratioA + this._w * ratioB;
+ this._x = x * ratioA + this._x * ratioB;
+ this._y = y * ratioA + this._y * ratioB;
+ this._z = z * ratioA + this._z * ratioB;
- s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
+ this._onChangeCallback();
- this._w = (m32 - m23 ) / s;
- this._x = 0.25 * s;
- this._y = (m12 + m21 ) / s;
- this._z = (m13 + m31 ) / s;
+ return this;
+ };
- } else if ( m22 > m33 ) {
+ _proto.equals = function equals(quaternion) {
+ return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w;
+ };
- s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- this._w = (m13 - m31 ) / s;
- this._x = (m12 + m21 ) / s;
- this._y = 0.25 * s;
- this._z = (m23 + m32 ) / s;
+ this._x = array[offset];
+ this._y = array[offset + 1];
+ this._z = array[offset + 2];
+ this._w = array[offset + 3];
- } else {
+ this._onChangeCallback();
- s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
+ return this;
+ };
- this._w = ( m21 - m12 ) / s;
- this._x = ( m13 + m31 ) / s;
- this._y = ( m23 + m32 ) / s;
- this._z = 0.25 * s;
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- }
+ if (offset === void 0) {
+ offset = 0;
+ }
- this.onChangeCallback();
+ array[offset] = this._x;
+ array[offset + 1] = this._y;
+ array[offset + 2] = this._z;
+ array[offset + 3] = this._w;
+ return array;
+ };
- return this;
+ _proto.fromBufferAttribute = function fromBufferAttribute(attribute, index) {
+ this._x = attribute.getX(index);
+ this._y = attribute.getY(index);
+ this._z = attribute.getZ(index);
+ this._w = attribute.getW(index);
+ return this;
+ };
- },
+ _proto._onChange = function _onChange(callback) {
+ this._onChangeCallback = callback;
+ return this;
+ };
- setFromUnitVectors: function () {
+ _proto._onChangeCallback = function _onChangeCallback() {};
- // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final
+ _createClass(Quaternion, [{
+ key: "x",
+ get: function get() {
+ return this._x;
+ },
+ set: function set(value) {
+ this._x = value;
- // assumes direction vectors vFrom and vTo are normalized
+ this._onChangeCallback();
+ }
+ }, {
+ key: "y",
+ get: function get() {
+ return this._y;
+ },
+ set: function set(value) {
+ this._y = value;
- var v1, r;
+ this._onChangeCallback();
+ }
+ }, {
+ key: "z",
+ get: function get() {
+ return this._z;
+ },
+ set: function set(value) {
+ this._z = value;
- var EPS = 0.000001;
+ this._onChangeCallback();
+ }
+ }, {
+ key: "w",
+ get: function get() {
+ return this._w;
+ },
+ set: function set(value) {
+ this._w = value;
- return function( vFrom, vTo ) {
+ this._onChangeCallback();
+ }
+ }]);
- if ( v1 === undefined ) v1 = new THREE.Vector3();
+ return Quaternion;
+ }();
- r = vFrom.dot( vTo ) + 1;
+ var Vector3 = /*#__PURE__*/function () {
+ function Vector3(x, y, z) {
+ if (x === void 0) {
+ x = 0;
+ }
- if ( r < EPS ) {
+ if (y === void 0) {
+ y = 0;
+ }
- r = 0;
+ if (z === void 0) {
+ z = 0;
+ }
- if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
+ Object.defineProperty(this, 'isVector3', {
+ value: true
+ });
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
- v1.set( - vFrom.y, vFrom.x, 0 );
+ var _proto = Vector3.prototype;
- } else {
+ _proto.set = function set(x, y, z) {
+ if (z === undefined) z = this.z; // sprite.scale.set(x,y)
- v1.set( 0, - vFrom.z, vFrom.y );
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ return this;
+ };
- }
+ _proto.setScalar = function setScalar(scalar) {
+ this.x = scalar;
+ this.y = scalar;
+ this.z = scalar;
+ return this;
+ };
- } else {
+ _proto.setX = function setX(x) {
+ this.x = x;
+ return this;
+ };
- v1.crossVectors( vFrom, vTo );
+ _proto.setY = function setY(y) {
+ this.y = y;
+ return this;
+ };
- }
+ _proto.setZ = function setZ(z) {
+ this.z = z;
+ return this;
+ };
- this._x = v1.x;
- this._y = v1.y;
- this._z = v1.z;
- this._w = r;
+ _proto.setComponent = function setComponent(index, value) {
+ switch (index) {
+ case 0:
+ this.x = value;
+ break;
+
+ case 1:
+ this.y = value;
+ break;
+
+ case 2:
+ this.z = value;
+ break;
- this.normalize();
+ default:
+ throw new Error('index is out of range: ' + index);
+ }
return this;
+ };
- }
+ _proto.getComponent = function getComponent(index) {
+ switch (index) {
+ case 0:
+ return this.x;
- }(),
+ case 1:
+ return this.y;
- inverse: function () {
+ case 2:
+ return this.z;
- this.conjugate().normalize();
+ default:
+ throw new Error('index is out of range: ' + index);
+ }
+ };
- return this;
+ _proto.clone = function clone() {
+ return new this.constructor(this.x, this.y, this.z);
+ };
- },
+ _proto.copy = function copy(v) {
+ this.x = v.x;
+ this.y = v.y;
+ this.z = v.z;
+ return this;
+ };
- conjugate: function () {
+ _proto.add = function add(v, w) {
+ if (w !== undefined) {
+ console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
+ return this.addVectors(v, w);
+ }
- this._x *= -1;
- this._y *= -1;
- this._z *= -1;
+ this.x += v.x;
+ this.y += v.y;
+ this.z += v.z;
+ return this;
+ };
- this.onChangeCallback();
+ _proto.addScalar = function addScalar(s) {
+ this.x += s;
+ this.y += s;
+ this.z += s;
+ return this;
+ };
- return this;
+ _proto.addVectors = function addVectors(a, b) {
+ this.x = a.x + b.x;
+ this.y = a.y + b.y;
+ this.z = a.z + b.z;
+ return this;
+ };
- },
+ _proto.addScaledVector = function addScaledVector(v, s) {
+ this.x += v.x * s;
+ this.y += v.y * s;
+ this.z += v.z * s;
+ return this;
+ };
- lengthSq: function () {
+ _proto.sub = function sub(v, w) {
+ if (w !== undefined) {
+ console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
+ return this.subVectors(v, w);
+ }
- return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
+ this.x -= v.x;
+ this.y -= v.y;
+ this.z -= v.z;
+ return this;
+ };
- },
+ _proto.subScalar = function subScalar(s) {
+ this.x -= s;
+ this.y -= s;
+ this.z -= s;
+ return this;
+ };
- length: function () {
+ _proto.subVectors = function subVectors(a, b) {
+ this.x = a.x - b.x;
+ this.y = a.y - b.y;
+ this.z = a.z - b.z;
+ return this;
+ };
- return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
+ _proto.multiply = function multiply(v, w) {
+ if (w !== undefined) {
+ console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');
+ return this.multiplyVectors(v, w);
+ }
- },
+ this.x *= v.x;
+ this.y *= v.y;
+ this.z *= v.z;
+ return this;
+ };
- normalize: function () {
+ _proto.multiplyScalar = function multiplyScalar(scalar) {
+ this.x *= scalar;
+ this.y *= scalar;
+ this.z *= scalar;
+ return this;
+ };
- var l = this.length();
+ _proto.multiplyVectors = function multiplyVectors(a, b) {
+ this.x = a.x * b.x;
+ this.y = a.y * b.y;
+ this.z = a.z * b.z;
+ return this;
+ };
- if ( l === 0 ) {
+ _proto.applyEuler = function applyEuler(euler) {
+ if (!(euler && euler.isEuler)) {
+ console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');
+ }
- this._x = 0;
- this._y = 0;
- this._z = 0;
- this._w = 1;
+ return this.applyQuaternion(_quaternion.setFromEuler(euler));
+ };
- } else {
+ _proto.applyAxisAngle = function applyAxisAngle(axis, angle) {
+ return this.applyQuaternion(_quaternion.setFromAxisAngle(axis, angle));
+ };
- l = 1 / l;
+ _proto.applyMatrix3 = function applyMatrix3(m) {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ var e = m.elements;
+ this.x = e[0] * x + e[3] * y + e[6] * z;
+ this.y = e[1] * x + e[4] * y + e[7] * z;
+ this.z = e[2] * x + e[5] * y + e[8] * z;
+ return this;
+ };
- this._x = this._x * l;
- this._y = this._y * l;
- this._z = this._z * l;
- this._w = this._w * l;
+ _proto.applyNormalMatrix = function applyNormalMatrix(m) {
+ return this.applyMatrix3(m).normalize();
+ };
- }
+ _proto.applyMatrix4 = function applyMatrix4(m) {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ var e = m.elements;
+ var w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);
+ this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;
+ this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;
+ this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;
+ return this;
+ };
- this.onChangeCallback();
+ _proto.applyQuaternion = function applyQuaternion(q) {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ var qx = q.x,
+ qy = q.y,
+ qz = q.z,
+ qw = q.w; // calculate quat * vector
+
+ var ix = qw * x + qy * z - qz * y;
+ var iy = qw * y + qz * x - qx * z;
+ var iz = qw * z + qx * y - qy * x;
+ var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat
+
+ this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
+ this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
+ this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
+ return this;
+ };
- return this;
+ _proto.project = function project(camera) {
+ return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix);
+ };
- },
+ _proto.unproject = function unproject(camera) {
+ return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld);
+ };
- multiply: function ( q, p ) {
+ _proto.transformDirection = function transformDirection(m) {
+ // input: THREE.Matrix4 affine matrix
+ // vector interpreted as a direction
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ var e = m.elements;
+ this.x = e[0] * x + e[4] * y + e[8] * z;
+ this.y = e[1] * x + e[5] * y + e[9] * z;
+ this.z = e[2] * x + e[6] * y + e[10] * z;
+ return this.normalize();
+ };
- if ( p !== undefined ) {
+ _proto.divide = function divide(v) {
+ this.x /= v.x;
+ this.y /= v.y;
+ this.z /= v.z;
+ return this;
+ };
- console.warn( 'DEPRECATED: Quaternion\'s .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
- return this.multiplyQuaternions( q, p );
+ _proto.divideScalar = function divideScalar(scalar) {
+ return this.multiplyScalar(1 / scalar);
+ };
- }
+ _proto.min = function min(v) {
+ this.x = Math.min(this.x, v.x);
+ this.y = Math.min(this.y, v.y);
+ this.z = Math.min(this.z, v.z);
+ return this;
+ };
- return this.multiplyQuaternions( this, q );
+ _proto.max = function max(v) {
+ this.x = Math.max(this.x, v.x);
+ this.y = Math.max(this.y, v.y);
+ this.z = Math.max(this.z, v.z);
+ return this;
+ };
- },
+ _proto.clamp = function clamp(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));
+ this.z = Math.max(min.z, Math.min(max.z, this.z));
+ return this;
+ };
- multiplyQuaternions: function ( a, b ) {
+ _proto.clampScalar = function clampScalar(minVal, maxVal) {
+ this.x = Math.max(minVal, Math.min(maxVal, this.x));
+ this.y = Math.max(minVal, Math.min(maxVal, this.y));
+ this.z = Math.max(minVal, Math.min(maxVal, this.z));
+ return this;
+ };
- // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
+ _proto.clampLength = function clampLength(min, max) {
+ var length = this.length();
+ return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
+ };
- var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
- var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
+ _proto.floor = function floor() {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ this.z = Math.floor(this.z);
+ return this;
+ };
- this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
- this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
- this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
- this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
+ _proto.ceil = function ceil() {
+ this.x = Math.ceil(this.x);
+ this.y = Math.ceil(this.y);
+ this.z = Math.ceil(this.z);
+ return this;
+ };
- this.onChangeCallback();
+ _proto.round = function round() {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ this.z = Math.round(this.z);
+ return this;
+ };
- return this;
+ _proto.roundToZero = function roundToZero() {
+ 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);
+ this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z);
+ return this;
+ };
- },
+ _proto.negate = function negate() {
+ this.x = -this.x;
+ this.y = -this.y;
+ this.z = -this.z;
+ return this;
+ };
- multiplyVector3: function ( vector ) {
+ _proto.dot = function dot(v) {
+ return this.x * v.x + this.y * v.y + this.z * v.z;
+ } // TODO lengthSquared?
+ ;
- console.warn( 'DEPRECATED: Quaternion\'s .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
- return vector.applyQuaternion( this );
+ _proto.lengthSq = function lengthSq() {
+ return this.x * this.x + this.y * this.y + this.z * this.z;
+ };
- },
+ _proto.length = function length() {
+ return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
+ };
- slerp: function ( qb, t ) {
+ _proto.manhattanLength = function manhattanLength() {
+ return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);
+ };
- var x = this._x, y = this._y, z = this._z, w = this._w;
+ _proto.normalize = function normalize() {
+ return this.divideScalar(this.length() || 1);
+ };
- // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
+ _proto.setLength = function setLength(length) {
+ return this.normalize().multiplyScalar(length);
+ };
- var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
+ _proto.lerp = function lerp(v, alpha) {
+ this.x += (v.x - this.x) * alpha;
+ this.y += (v.y - this.y) * alpha;
+ this.z += (v.z - this.z) * alpha;
+ return this;
+ };
- if ( cosHalfTheta < 0 ) {
+ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) {
+ this.x = v1.x + (v2.x - v1.x) * alpha;
+ this.y = v1.y + (v2.y - v1.y) * alpha;
+ this.z = v1.z + (v2.z - v1.z) * alpha;
+ return this;
+ };
- this._w = -qb._w;
- this._x = -qb._x;
- this._y = -qb._y;
- this._z = -qb._z;
+ _proto.cross = function cross(v, w) {
+ if (w !== undefined) {
+ console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');
+ return this.crossVectors(v, w);
+ }
- cosHalfTheta = -cosHalfTheta;
+ return this.crossVectors(this, v);
+ };
- } else {
+ _proto.crossVectors = function crossVectors(a, b) {
+ var ax = a.x,
+ ay = a.y,
+ az = a.z;
+ var bx = b.x,
+ by = b.y,
+ bz = b.z;
+ this.x = ay * bz - az * by;
+ this.y = az * bx - ax * bz;
+ this.z = ax * by - ay * bx;
+ return this;
+ };
- this.copy( qb );
+ _proto.projectOnVector = function projectOnVector(v) {
+ var denominator = v.lengthSq();
+ if (denominator === 0) return this.set(0, 0, 0);
+ var scalar = v.dot(this) / denominator;
+ return this.copy(v).multiplyScalar(scalar);
+ };
- }
+ _proto.projectOnPlane = function projectOnPlane(planeNormal) {
+ _vector.copy(this).projectOnVector(planeNormal);
- if ( cosHalfTheta >= 1.0 ) {
+ return this.sub(_vector);
+ };
- this._w = w;
- this._x = x;
- this._y = y;
- this._z = z;
+ _proto.reflect = function reflect(normal) {
+ // reflect incident vector off plane orthogonal to normal
+ // normal is assumed to have unit length
+ return this.sub(_vector.copy(normal).multiplyScalar(2 * this.dot(normal)));
+ };
- return this;
+ _proto.angleTo = function angleTo(v) {
+ var denominator = Math.sqrt(this.lengthSq() * v.lengthSq());
+ if (denominator === 0) return Math.PI / 2;
+ var theta = this.dot(v) / denominator; // clamp, to handle numerical problems
- }
+ return Math.acos(MathUtils.clamp(theta, -1, 1));
+ };
- var halfTheta = Math.acos( cosHalfTheta );
- var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
+ _proto.distanceTo = function distanceTo(v) {
+ return Math.sqrt(this.distanceToSquared(v));
+ };
+
+ _proto.distanceToSquared = function distanceToSquared(v) {
+ var dx = this.x - v.x,
+ dy = this.y - v.y,
+ dz = this.z - v.z;
+ return dx * dx + dy * dy + dz * dz;
+ };
- if ( Math.abs( sinHalfTheta ) < 0.001 ) {
+ _proto.manhattanDistanceTo = function manhattanDistanceTo(v) {
+ return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);
+ };
- this._w = 0.5 * ( w + this._w );
- this._x = 0.5 * ( x + this._x );
- this._y = 0.5 * ( y + this._y );
- this._z = 0.5 * ( z + this._z );
+ _proto.setFromSpherical = function setFromSpherical(s) {
+ return this.setFromSphericalCoords(s.radius, s.phi, s.theta);
+ };
+ _proto.setFromSphericalCoords = function setFromSphericalCoords(radius, phi, theta) {
+ var sinPhiRadius = Math.sin(phi) * radius;
+ this.x = sinPhiRadius * Math.sin(theta);
+ this.y = Math.cos(phi) * radius;
+ this.z = sinPhiRadius * Math.cos(theta);
return this;
+ };
- }
+ _proto.setFromCylindrical = function setFromCylindrical(c) {
+ return this.setFromCylindricalCoords(c.radius, c.theta, c.y);
+ };
- var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
- ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
+ _proto.setFromCylindricalCoords = function setFromCylindricalCoords(radius, theta, y) {
+ this.x = radius * Math.sin(theta);
+ this.y = y;
+ this.z = radius * Math.cos(theta);
+ return this;
+ };
- this._w = ( w * ratioA + this._w * ratioB );
- this._x = ( x * ratioA + this._x * ratioB );
- this._y = ( y * ratioA + this._y * ratioB );
- this._z = ( z * ratioA + this._z * ratioB );
+ _proto.setFromMatrixPosition = function setFromMatrixPosition(m) {
+ var e = m.elements;
+ this.x = e[12];
+ this.y = e[13];
+ this.z = e[14];
+ return this;
+ };
- this.onChangeCallback();
+ _proto.setFromMatrixScale = function setFromMatrixScale(m) {
+ var sx = this.setFromMatrixColumn(m, 0).length();
+ var sy = this.setFromMatrixColumn(m, 1).length();
+ var sz = this.setFromMatrixColumn(m, 2).length();
+ this.x = sx;
+ this.y = sy;
+ this.z = sz;
+ return this;
+ };
- return this;
+ _proto.setFromMatrixColumn = function setFromMatrixColumn(m, index) {
+ return this.fromArray(m.elements, index * 4);
+ };
- },
+ _proto.setFromMatrix3Column = function setFromMatrix3Column(m, index) {
+ return this.fromArray(m.elements, index * 3);
+ };
- equals: function ( quaternion ) {
+ _proto.equals = function equals(v) {
+ return v.x === this.x && v.y === this.y && v.z === this.z;
+ };
- return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- },
+ this.x = array[offset];
+ this.y = array[offset + 1];
+ this.z = array[offset + 2];
+ return this;
+ };
- fromArray: function ( array ) {
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- this._x = array[ 0 ];
- this._y = array[ 1 ];
- this._z = array[ 2 ];
- this._w = array[ 3 ];
+ if (offset === void 0) {
+ offset = 0;
+ }
- this.onChangeCallback();
+ array[offset] = this.x;
+ array[offset + 1] = this.y;
+ array[offset + 2] = this.z;
+ return array;
+ };
- return this;
+ _proto.fromBufferAttribute = function fromBufferAttribute(attribute, index, offset) {
+ if (offset !== undefined) {
+ console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');
+ }
- },
+ this.x = attribute.getX(index);
+ this.y = attribute.getY(index);
+ this.z = attribute.getZ(index);
+ return this;
+ };
- toArray: function () {
+ _proto.random = function random() {
+ this.x = Math.random();
+ this.y = Math.random();
+ this.z = Math.random();
+ return this;
+ };
- return [ this._x, this._y, this._z, this._w ];
+ return Vector3;
+ }();
- },
+ var _vector = /*@__PURE__*/new Vector3();
- onChange: function ( callback ) {
+ var _quaternion = /*@__PURE__*/new Quaternion();
- this.onChangeCallback = callback;
+ var Box3 = /*#__PURE__*/function () {
+ function Box3(min, max) {
+ Object.defineProperty(this, 'isBox3', {
+ value: true
+ });
+ this.min = min !== undefined ? min : new Vector3(+Infinity, +Infinity, +Infinity);
+ this.max = max !== undefined ? max : new Vector3(-Infinity, -Infinity, -Infinity);
+ }
- return this;
+ var _proto = Box3.prototype;
- },
+ _proto.set = function set(min, max) {
+ this.min.copy(min);
+ this.max.copy(max);
+ return this;
+ };
- onChangeCallback: function () {},
+ _proto.setFromArray = function setFromArray(array) {
+ var minX = +Infinity;
+ var minY = +Infinity;
+ var minZ = +Infinity;
+ var maxX = -Infinity;
+ var maxY = -Infinity;
+ var maxZ = -Infinity;
+
+ for (var i = 0, l = array.length; i < l; i += 3) {
+ var x = array[i];
+ var y = array[i + 1];
+ var z = array[i + 2];
+ if (x < minX) minX = x;
+ if (y < minY) minY = y;
+ if (z < minZ) minZ = z;
+ if (x > maxX) maxX = x;
+ if (y > maxY) maxY = y;
+ if (z > maxZ) maxZ = z;
+ }
+
+ this.min.set(minX, minY, minZ);
+ this.max.set(maxX, maxY, maxZ);
+ return this;
+ };
- clone: function () {
+ _proto.setFromBufferAttribute = function setFromBufferAttribute(attribute) {
+ var minX = +Infinity;
+ var minY = +Infinity;
+ var minZ = +Infinity;
+ var maxX = -Infinity;
+ var maxY = -Infinity;
+ var maxZ = -Infinity;
+
+ for (var i = 0, l = attribute.count; i < l; i++) {
+ var x = attribute.getX(i);
+ var y = attribute.getY(i);
+ var z = attribute.getZ(i);
+ if (x < minX) minX = x;
+ if (y < minY) minY = y;
+ if (z < minZ) minZ = z;
+ if (x > maxX) maxX = x;
+ if (y > maxY) maxY = y;
+ if (z > maxZ) maxZ = z;
+ }
+
+ this.min.set(minX, minY, minZ);
+ this.max.set(maxX, maxY, maxZ);
+ return this;
+ };
- return new THREE.Quaternion( this._x, this._y, this._z, this._w );
+ _proto.setFromPoints = function setFromPoints(points) {
+ this.makeEmpty();
- }
+ for (var i = 0, il = points.length; i < il; i++) {
+ this.expandByPoint(points[i]);
+ }
-};
+ return this;
+ };
-THREE.Quaternion.slerp = function ( qa, qb, qm, t ) {
+ _proto.setFromCenterAndSize = function setFromCenterAndSize(center, size) {
+ var halfSize = _vector$1.copy(size).multiplyScalar(0.5);
- return qm.copy( qa ).slerp( qb, t );
+ this.min.copy(center).sub(halfSize);
+ this.max.copy(center).add(halfSize);
+ return this;
+ };
-}
+ _proto.setFromObject = function setFromObject(object) {
+ this.makeEmpty();
+ return this.expandByObject(object);
+ };
-/**
- * @author mrdoob / http://mrdoob.com/
- * @author philogb / http://blog.thejit.org/
- * @author egraether / http://egraether.com/
- * @author zz85 / http://www.lab4games.net/zz85/blog
- */
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
+ };
-THREE.Vector2 = function ( x, y ) {
+ _proto.copy = function copy(box) {
+ this.min.copy(box.min);
+ this.max.copy(box.max);
+ return this;
+ };
- this.x = x || 0;
- this.y = y || 0;
+ _proto.makeEmpty = function makeEmpty() {
+ this.min.x = this.min.y = this.min.z = +Infinity;
+ this.max.x = this.max.y = this.max.z = -Infinity;
+ return this;
+ };
-};
+ _proto.isEmpty = function isEmpty() {
+ // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+ return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;
+ };
-THREE.Vector2.prototype = {
+ _proto.getCenter = function getCenter(target) {
+ if (target === undefined) {
+ console.warn('THREE.Box3: .getCenter() target is now required');
+ target = new Vector3();
+ }
- constructor: THREE.Vector2,
+ return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);
+ };
- set: function ( x, y ) {
+ _proto.getSize = function getSize(target) {
+ if (target === undefined) {
+ console.warn('THREE.Box3: .getSize() target is now required');
+ target = new Vector3();
+ }
- this.x = x;
- this.y = y;
+ return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min);
+ };
- return this;
+ _proto.expandByPoint = function expandByPoint(point) {
+ this.min.min(point);
+ this.max.max(point);
+ return this;
+ };
- },
+ _proto.expandByVector = function expandByVector(vector) {
+ this.min.sub(vector);
+ this.max.add(vector);
+ return this;
+ };
- setX: function ( x ) {
+ _proto.expandByScalar = function expandByScalar(scalar) {
+ this.min.addScalar(-scalar);
+ this.max.addScalar(scalar);
+ return this;
+ };
- this.x = x;
+ _proto.expandByObject = function expandByObject(object) {
+ // Computes the world-axis-aligned bounding box of an object (including its children),
+ // accounting for both the object's, and children's, world transforms
+ object.updateWorldMatrix(false, false);
+ var geometry = object.geometry;
- return this;
+ if (geometry !== undefined) {
+ if (geometry.boundingBox === null) {
+ geometry.computeBoundingBox();
+ }
- },
+ _box.copy(geometry.boundingBox);
- setY: function ( y ) {
+ _box.applyMatrix4(object.matrixWorld);
- this.y = y;
+ this.union(_box);
+ }
- return this;
+ var children = object.children;
- },
+ for (var i = 0, l = children.length; i < l; i++) {
+ this.expandByObject(children[i]);
+ }
- setComponent: function ( index, value ) {
+ return this;
+ };
- switch ( index ) {
+ _proto.containsPoint = function containsPoint(point) {
+ return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true;
+ };
- case 0: this.x = value; break;
- case 1: this.y = value; break;
- default: throw new Error( "index is out of range: " + index );
+ _proto.containsBox = function containsBox(box) {
+ return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y && this.min.z <= box.min.z && box.max.z <= this.max.z;
+ };
- }
+ _proto.getParameter = function getParameter(point, target) {
+ // This can potentially have a divide by zero if the box
+ // has a size dimension of 0.
+ if (target === undefined) {
+ console.warn('THREE.Box3: .getParameter() target is now required');
+ target = new Vector3();
+ }
- },
+ return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y), (point.z - this.min.z) / (this.max.z - this.min.z));
+ };
- getComponent: function ( index ) {
+ _proto.intersectsBox = function intersectsBox(box) {
+ // using 6 splitting planes to rule out intersections.
+ return box.max.x < this.min.x || box.min.x > this.max.x || box.max.y < this.min.y || box.min.y > this.max.y || box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
+ };
- switch ( index ) {
+ _proto.intersectsSphere = function intersectsSphere(sphere) {
+ // Find the point on the AABB closest to the sphere center.
+ this.clampPoint(sphere.center, _vector$1); // If that point is inside the sphere, the AABB and sphere intersect.
- case 0: return this.x;
- case 1: return this.y;
- default: throw new Error( "index is out of range: " + index );
+ return _vector$1.distanceToSquared(sphere.center) <= sphere.radius * sphere.radius;
+ };
- }
+ _proto.intersectsPlane = function intersectsPlane(plane) {
+ // We compute the minimum and maximum dot product values. If those values
+ // are on the same side (back or front) of the plane, then there is no intersection.
+ var min, max;
- },
+ if (plane.normal.x > 0) {
+ min = plane.normal.x * this.min.x;
+ max = plane.normal.x * this.max.x;
+ } else {
+ min = plane.normal.x * this.max.x;
+ max = plane.normal.x * this.min.x;
+ }
- copy: function ( v ) {
+ if (plane.normal.y > 0) {
+ min += plane.normal.y * this.min.y;
+ max += plane.normal.y * this.max.y;
+ } else {
+ min += plane.normal.y * this.max.y;
+ max += plane.normal.y * this.min.y;
+ }
- this.x = v.x;
- this.y = v.y;
+ if (plane.normal.z > 0) {
+ min += plane.normal.z * this.min.z;
+ max += plane.normal.z * this.max.z;
+ } else {
+ min += plane.normal.z * this.max.z;
+ max += plane.normal.z * this.min.z;
+ }
- return this;
+ return min <= -plane.constant && max >= -plane.constant;
+ };
- },
+ _proto.intersectsTriangle = function intersectsTriangle(triangle) {
+ if (this.isEmpty()) {
+ return false;
+ } // compute box center and extents
- add: function ( v, w ) {
- if ( w !== undefined ) {
+ this.getCenter(_center);
- console.warn( 'DEPRECATED: Vector2\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
- return this.addVectors( v, w );
+ _extents.subVectors(this.max, _center); // translate triangle to aabb origin
- }
- this.x += v.x;
- this.y += v.y;
+ _v0.subVectors(triangle.a, _center);
- return this;
+ _v1.subVectors(triangle.b, _center);
- },
+ _v2.subVectors(triangle.c, _center); // compute edge vectors for triangle
- addVectors: function ( a, b ) {
- this.x = a.x + b.x;
- this.y = a.y + b.y;
+ _f0.subVectors(_v1, _v0);
- return this;
+ _f1.subVectors(_v2, _v1);
- },
+ _f2.subVectors(_v0, _v2); // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
+ // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
+ // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
- addScalar: function ( s ) {
- this.x += s;
- this.y += s;
+ var axes = [0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y, _f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x, -_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0];
- return this;
+ if (!satForAxes(axes, _v0, _v1, _v2, _extents)) {
+ return false;
+ } // test 3 face normals from the aabb
- },
- sub: function ( v, w ) {
+ axes = [1, 0, 0, 0, 1, 0, 0, 0, 1];
- if ( w !== undefined ) {
+ if (!satForAxes(axes, _v0, _v1, _v2, _extents)) {
+ return false;
+ } // finally testing the face normal of the triangle
+ // use already existing triangle edge vectors here
- console.warn( 'DEPRECATED: Vector2\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
- return this.subVectors( v, w );
- }
+ _triangleNormal.crossVectors(_f0, _f1);
- this.x -= v.x;
- this.y -= v.y;
+ axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z];
+ return satForAxes(axes, _v0, _v1, _v2, _extents);
+ };
- return this;
+ _proto.clampPoint = function clampPoint(point, target) {
+ if (target === undefined) {
+ console.warn('THREE.Box3: .clampPoint() target is now required');
+ target = new Vector3();
+ }
- },
+ return target.copy(point).clamp(this.min, this.max);
+ };
- subVectors: function ( a, b ) {
+ _proto.distanceToPoint = function distanceToPoint(point) {
+ var clampedPoint = _vector$1.copy(point).clamp(this.min, this.max);
- this.x = a.x - b.x;
- this.y = a.y - b.y;
+ return clampedPoint.sub(point).length();
+ };
- return this;
+ _proto.getBoundingSphere = function getBoundingSphere(target) {
+ if (target === undefined) {
+ console.error('THREE.Box3: .getBoundingSphere() target is now required'); //target = new Sphere(); // removed to avoid cyclic dependency
+ }
- },
-
- multiply: function ( v ) {
+ this.getCenter(target.center);
+ target.radius = this.getSize(_vector$1).length() * 0.5;
+ return target;
+ };
- this.x *= v.x;
- this.y *= v.y;
+ _proto.intersect = function intersect(box) {
+ this.min.max(box.min);
+ this.max.min(box.max); // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
- return this;
+ if (this.isEmpty()) this.makeEmpty();
+ return this;
+ };
- },
+ _proto.union = function union(box) {
+ this.min.min(box.min);
+ this.max.max(box.max);
+ return this;
+ };
- multiplyScalar: function ( s ) {
+ _proto.applyMatrix4 = function applyMatrix4(matrix) {
+ // transform of empty box is an empty box.
+ if (this.isEmpty()) return this; // NOTE: I am using a binary pattern to specify all 2^3 combinations below
- this.x *= s;
- this.y *= s;
+ _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000
- return this;
- },
+ _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001
- divide: function ( v ) {
- this.x /= v.x;
- this.y /= v.y;
+ _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010
- return this;
- },
+ _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011
- divideScalar: function ( scalar ) {
- if ( scalar !== 0 ) {
+ _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100
- var invScalar = 1 / scalar;
- this.x *= invScalar;
- this.y *= invScalar;
+ _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101
- } else {
-
- this.x = 0;
- this.y = 0;
-
- }
- return this;
-
- },
+ _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110
- min: function ( v ) {
- if ( this.x > v.x ) {
-
- this.x = v.x;
+ _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111
- }
- if ( this.y > v.y ) {
+ this.setFromPoints(_points);
+ return this;
+ };
- this.y = v.y;
+ _proto.translate = function translate(offset) {
+ this.min.add(offset);
+ this.max.add(offset);
+ return this;
+ };
- }
+ _proto.equals = function equals(box) {
+ return box.min.equals(this.min) && box.max.equals(this.max);
+ };
- return this;
+ return Box3;
+ }();
- },
+ function satForAxes(axes, v0, v1, v2, extents) {
+ for (var i = 0, j = axes.length - 3; i <= j; i += 3) {
+ _testAxis.fromArray(axes, i); // project the aabb onto the seperating axis
- max: function ( v ) {
- if ( this.x < v.x ) {
+ var r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); // project all 3 vertices of the triangle onto the seperating axis
- this.x = v.x;
+ var p0 = v0.dot(_testAxis);
+ var p1 = v1.dot(_testAxis);
+ var p2 = v2.dot(_testAxis); // actual test, basically see if either of the most extreme of the triangle points intersects r
+ if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) {
+ // points of the projected triangle are outside the projected half-length of the aabb
+ // the axis is seperating and we can exit
+ return false;
+ }
}
- if ( this.y < v.y ) {
+ return true;
+ }
- this.y = v.y;
+ var _points = [/*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3(), /*@__PURE__*/new Vector3()];
- }
+ var _vector$1 = /*@__PURE__*/new Vector3();
- return this;
+ var _box = /*@__PURE__*/new Box3(); // triangle centered vertices
- },
- clamp: function ( min, max ) {
+ var _v0 = /*@__PURE__*/new Vector3();
- // This function assumes min < max, if this assumption isn't true it will not operate correctly
+ var _v1 = /*@__PURE__*/new Vector3();
- if ( this.x < min.x ) {
+ var _v2 = /*@__PURE__*/new Vector3(); // triangle edge vectors
- this.x = min.x;
- } else if ( this.x > max.x ) {
+ var _f0 = /*@__PURE__*/new Vector3();
- this.x = max.x;
+ var _f1 = /*@__PURE__*/new Vector3();
- }
+ var _f2 = /*@__PURE__*/new Vector3();
- if ( this.y < min.y ) {
+ var _center = /*@__PURE__*/new Vector3();
- this.y = min.y;
+ var _extents = /*@__PURE__*/new Vector3();
- } else if ( this.y > max.y ) {
+ var _triangleNormal = /*@__PURE__*/new Vector3();
- this.y = max.y;
+ var _testAxis = /*@__PURE__*/new Vector3();
- }
+ var _box$1 = /*@__PURE__*/new Box3();
- return this;
- },
+ var Sphere = /*#__PURE__*/function () {
+ function Sphere(center, radius) {
+ this.center = center !== undefined ? center : new Vector3();
+ this.radius = radius !== undefined ? radius : -1;
+ }
- clampScalar: ( function () {
+ var _proto = Sphere.prototype;
- var min, max;
+ _proto.set = function set(center, radius) {
+ this.center.copy(center);
+ this.radius = radius;
+ return this;
+ };
- return function ( minVal, maxVal ) {
+ _proto.setFromPoints = function setFromPoints(points, optionalCenter) {
+ var center = this.center;
- if ( min === undefined ) {
+ if (optionalCenter !== undefined) {
+ center.copy(optionalCenter);
+ } else {
+ _box$1.setFromPoints(points).getCenter(center);
+ }
- min = new THREE.Vector2();
- max = new THREE.Vector2();
+ var maxRadiusSq = 0;
+ for (var i = 0, il = points.length; i < il; i++) {
+ maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i]));
}
- min.set( minVal, minVal );
- max.set( maxVal, maxVal );
-
- return this.clamp( min, max );
+ this.radius = Math.sqrt(maxRadiusSq);
+ return this;
+ };
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
};
-
- } )(),
- floor: function () {
+ _proto.copy = function copy(sphere) {
+ this.center.copy(sphere.center);
+ this.radius = sphere.radius;
+ return this;
+ };
- this.x = Math.floor( this.x );
- this.y = Math.floor( this.y );
+ _proto.isEmpty = function isEmpty() {
+ return this.radius < 0;
+ };
- return this;
+ _proto.makeEmpty = function makeEmpty() {
+ this.center.set(0, 0, 0);
+ this.radius = -1;
+ return this;
+ };
- },
+ _proto.containsPoint = function containsPoint(point) {
+ return point.distanceToSquared(this.center) <= this.radius * this.radius;
+ };
- ceil: function () {
+ _proto.distanceToPoint = function distanceToPoint(point) {
+ return point.distanceTo(this.center) - this.radius;
+ };
- this.x = Math.ceil( this.x );
- this.y = Math.ceil( this.y );
+ _proto.intersectsSphere = function intersectsSphere(sphere) {
+ var radiusSum = this.radius + sphere.radius;
+ return sphere.center.distanceToSquared(this.center) <= radiusSum * radiusSum;
+ };
- return this;
+ _proto.intersectsBox = function intersectsBox(box) {
+ return box.intersectsSphere(this);
+ };
- },
+ _proto.intersectsPlane = function intersectsPlane(plane) {
+ return Math.abs(plane.distanceToPoint(this.center)) <= this.radius;
+ };
- round: function () {
+ _proto.clampPoint = function clampPoint(point, target) {
+ var deltaLengthSq = this.center.distanceToSquared(point);
- this.x = Math.round( this.x );
- this.y = Math.round( this.y );
+ if (target === undefined) {
+ console.warn('THREE.Sphere: .clampPoint() target is now required');
+ target = new Vector3();
+ }
- return this;
+ target.copy(point);
- },
+ if (deltaLengthSq > this.radius * this.radius) {
+ target.sub(this.center).normalize();
+ target.multiplyScalar(this.radius).add(this.center);
+ }
- roundToZero: function () {
+ return target;
+ };
- 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 );
+ _proto.getBoundingBox = function getBoundingBox(target) {
+ if (target === undefined) {
+ console.warn('THREE.Sphere: .getBoundingBox() target is now required');
+ target = new Box3();
+ }
- return this;
+ if (this.isEmpty()) {
+ // Empty sphere produces empty bounding box
+ target.makeEmpty();
+ return target;
+ }
- },
+ target.set(this.center, this.center);
+ target.expandByScalar(this.radius);
+ return target;
+ };
- negate: function () {
+ _proto.applyMatrix4 = function applyMatrix4(matrix) {
+ this.center.applyMatrix4(matrix);
+ this.radius = this.radius * matrix.getMaxScaleOnAxis();
+ return this;
+ };
- return this.multiplyScalar( - 1 );
+ _proto.translate = function translate(offset) {
+ this.center.add(offset);
+ return this;
+ };
- },
+ _proto.equals = function equals(sphere) {
+ return sphere.center.equals(this.center) && sphere.radius === this.radius;
+ };
- dot: function ( v ) {
+ return Sphere;
+ }();
- return this.x * v.x + this.y * v.y;
+ var _vector$2 = /*@__PURE__*/new Vector3();
- },
+ var _segCenter = /*@__PURE__*/new Vector3();
- lengthSq: function () {
+ var _segDir = /*@__PURE__*/new Vector3();
- return this.x * this.x + this.y * this.y;
+ var _diff = /*@__PURE__*/new Vector3();
- },
+ var _edge1 = /*@__PURE__*/new Vector3();
- length: function () {
+ var _edge2 = /*@__PURE__*/new Vector3();
- return Math.sqrt( this.x * this.x + this.y * this.y );
+ var _normal = /*@__PURE__*/new Vector3();
- },
+ var Ray = /*#__PURE__*/function () {
+ function Ray(origin, direction) {
+ this.origin = origin !== undefined ? origin : new Vector3();
+ this.direction = direction !== undefined ? direction : new Vector3(0, 0, -1);
+ }
- normalize: function () {
+ var _proto = Ray.prototype;
- return this.divideScalar( this.length() );
+ _proto.set = function set(origin, direction) {
+ this.origin.copy(origin);
+ this.direction.copy(direction);
+ return this;
+ };
- },
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
+ };
- distanceTo: function ( v ) {
+ _proto.copy = function copy(ray) {
+ this.origin.copy(ray.origin);
+ this.direction.copy(ray.direction);
+ return this;
+ };
- return Math.sqrt( this.distanceToSquared( v ) );
+ _proto.at = function at(t, target) {
+ if (target === undefined) {
+ console.warn('THREE.Ray: .at() target is now required');
+ target = new Vector3();
+ }
- },
+ return target.copy(this.direction).multiplyScalar(t).add(this.origin);
+ };
- distanceToSquared: function ( v ) {
+ _proto.lookAt = function lookAt(v) {
+ this.direction.copy(v).sub(this.origin).normalize();
+ return this;
+ };
- var dx = this.x - v.x, dy = this.y - v.y;
- return dx * dx + dy * dy;
+ _proto.recast = function recast(t) {
+ this.origin.copy(this.at(t, _vector$2));
+ return this;
+ };
- },
+ _proto.closestPointToPoint = function closestPointToPoint(point, target) {
+ if (target === undefined) {
+ console.warn('THREE.Ray: .closestPointToPoint() target is now required');
+ target = new Vector3();
+ }
- setLength: function ( l ) {
+ target.subVectors(point, this.origin);
+ var directionDistance = target.dot(this.direction);
- var oldLength = this.length();
+ if (directionDistance < 0) {
+ return target.copy(this.origin);
+ }
- if ( oldLength !== 0 && l !== oldLength ) {
+ return target.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
+ };
- this.multiplyScalar( l / oldLength );
- }
+ _proto.distanceToPoint = function distanceToPoint(point) {
+ return Math.sqrt(this.distanceSqToPoint(point));
+ };
- return this;
+ _proto.distanceSqToPoint = function distanceSqToPoint(point) {
+ var directionDistance = _vector$2.subVectors(point, this.origin).dot(this.direction); // point behind the ray
- },
- lerp: function ( v, alpha ) {
+ if (directionDistance < 0) {
+ return this.origin.distanceToSquared(point);
+ }
- this.x += ( v.x - this.x ) * alpha;
- this.y += ( v.y - this.y ) * alpha;
+ _vector$2.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
- return this;
+ return _vector$2.distanceToSquared(point);
+ };
- },
+ _proto.distanceSqToSegment = function distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment) {
+ // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
+ // It returns the min distance between the ray and the segment
+ // defined by v0 and v1
+ // It can also set two optional targets :
+ // - The closest point on the ray
+ // - The closest point on the segment
+ _segCenter.copy(v0).add(v1).multiplyScalar(0.5);
- equals: function( v ) {
+ _segDir.copy(v1).sub(v0).normalize();
- return ( ( v.x === this.x ) && ( v.y === this.y ) );
+ _diff.copy(this.origin).sub(_segCenter);
- },
+ var segExtent = v0.distanceTo(v1) * 0.5;
+ var a01 = -this.direction.dot(_segDir);
- fromArray: function ( array ) {
+ var b0 = _diff.dot(this.direction);
- this.x = array[ 0 ];
- this.y = array[ 1 ];
+ var b1 = -_diff.dot(_segDir);
- return this;
+ var c = _diff.lengthSq();
- },
+ var det = Math.abs(1 - a01 * a01);
+ var s0, s1, sqrDist, extDet;
- toArray: function () {
+ if (det > 0) {
+ // The ray and segment are not parallel.
+ s0 = a01 * b1 - b0;
+ s1 = a01 * b0 - b1;
+ extDet = segExtent * det;
- return [ this.x, this.y ];
+ if (s0 >= 0) {
+ if (s1 >= -extDet) {
+ if (s1 <= extDet) {
+ // region 0
+ // Minimum at interior points of ray and segment.
+ var invDet = 1 / det;
+ s0 *= invDet;
+ s1 *= invDet;
+ sqrDist = s0 * (s0 + a01 * s1 + 2 * b0) + s1 * (a01 * s0 + s1 + 2 * b1) + c;
+ } else {
+ // region 1
+ s1 = segExtent;
+ s0 = Math.max(0, -(a01 * s1 + b0));
+ sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
+ }
+ } else {
+ // region 5
+ s1 = -segExtent;
+ s0 = Math.max(0, -(a01 * s1 + b0));
+ sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
+ }
+ } else {
+ if (s1 <= -extDet) {
+ // region 4
+ s0 = Math.max(0, -(-a01 * segExtent + b0));
+ s1 = s0 > 0 ? -segExtent : Math.min(Math.max(-segExtent, -b1), segExtent);
+ sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
+ } else if (s1 <= extDet) {
+ // region 3
+ s0 = 0;
+ s1 = Math.min(Math.max(-segExtent, -b1), segExtent);
+ sqrDist = s1 * (s1 + 2 * b1) + c;
+ } else {
+ // region 2
+ s0 = Math.max(0, -(a01 * segExtent + b0));
+ s1 = s0 > 0 ? segExtent : Math.min(Math.max(-segExtent, -b1), segExtent);
+ sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
+ }
+ }
+ } else {
+ // Ray and segment are parallel.
+ s1 = a01 > 0 ? -segExtent : segExtent;
+ s0 = Math.max(0, -(a01 * s1 + b0));
+ sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
+ }
- },
+ if (optionalPointOnRay) {
+ optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin);
+ }
- clone: function () {
+ if (optionalPointOnSegment) {
+ optionalPointOnSegment.copy(_segDir).multiplyScalar(s1).add(_segCenter);
+ }
- return new THREE.Vector2( this.x, this.y );
+ return sqrDist;
+ };
- }
+ _proto.intersectSphere = function intersectSphere(sphere, target) {
+ _vector$2.subVectors(sphere.center, this.origin);
-};
+ var tca = _vector$2.dot(this.direction);
-/**
- * @author mrdoob / http://mrdoob.com/
- * @author *kile / http://kile.stravaganza.org/
- * @author philogb / http://blog.thejit.org/
- * @author mikael emtinger / http://gomo.se/
- * @author egraether / http://egraether.com/
- * @author WestLangley / http://github.com/WestLangley
- */
+ var d2 = _vector$2.dot(_vector$2) - tca * tca;
+ var radius2 = sphere.radius * sphere.radius;
+ if (d2 > radius2) return null;
+ var thc = Math.sqrt(radius2 - d2); // t0 = first intersect point - entrance on front of sphere
-THREE.Vector3 = function ( x, y, z ) {
+ var t0 = tca - thc; // t1 = second intersect point - exit point on back of sphere
- this.x = x || 0;
- this.y = y || 0;
- this.z = z || 0;
+ var t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null
-};
+ if (t0 < 0 && t1 < 0) return null; // test to see if t0 is behind the ray:
+ // if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
+ // in order to always return an intersect point that is in front of the ray.
-THREE.Vector3.prototype = {
+ if (t0 < 0) return this.at(t1, target); // else t0 is in front of the ray, so return the first collision point scaled by t0
- constructor: THREE.Vector3,
+ return this.at(t0, target);
+ };
- set: function ( x, y, z ) {
+ _proto.intersectsSphere = function intersectsSphere(sphere) {
+ return this.distanceSqToPoint(sphere.center) <= sphere.radius * sphere.radius;
+ };
- this.x = x;
- this.y = y;
- this.z = z;
+ _proto.distanceToPlane = function distanceToPlane(plane) {
+ var denominator = plane.normal.dot(this.direction);
- return this;
+ if (denominator === 0) {
+ // line is coplanar, return origin
+ if (plane.distanceToPoint(this.origin) === 0) {
+ return 0;
+ } // Null is preferable to undefined since undefined means.... it is undefined
- },
- setX: function ( x ) {
+ return null;
+ }
- this.x = x;
+ var t = -(this.origin.dot(plane.normal) + plane.constant) / denominator; // Return if the ray never intersects the plane
- return this;
+ return t >= 0 ? t : null;
+ };
- },
+ _proto.intersectPlane = function intersectPlane(plane, target) {
+ var t = this.distanceToPlane(plane);
- setY: function ( y ) {
+ if (t === null) {
+ return null;
+ }
- this.y = y;
+ return this.at(t, target);
+ };
- return this;
+ _proto.intersectsPlane = function intersectsPlane(plane) {
+ // check if the ray lies on the plane first
+ var distToPoint = plane.distanceToPoint(this.origin);
- },
+ if (distToPoint === 0) {
+ return true;
+ }
- setZ: function ( z ) {
+ var denominator = plane.normal.dot(this.direction);
- this.z = z;
+ if (denominator * distToPoint < 0) {
+ return true;
+ } // ray origin is behind the plane (and is pointing behind it)
- return this;
- },
+ return false;
+ };
- setComponent: function ( index, value ) {
+ _proto.intersectBox = function intersectBox(box, target) {
+ var tmin, tmax, tymin, tymax, tzmin, tzmax;
+ var invdirx = 1 / this.direction.x,
+ invdiry = 1 / this.direction.y,
+ invdirz = 1 / this.direction.z;
+ var origin = this.origin;
- switch ( index ) {
+ if (invdirx >= 0) {
+ tmin = (box.min.x - origin.x) * invdirx;
+ tmax = (box.max.x - origin.x) * invdirx;
+ } else {
+ tmin = (box.max.x - origin.x) * invdirx;
+ tmax = (box.min.x - origin.x) * invdirx;
+ }
- case 0: this.x = value; break;
- case 1: this.y = value; break;
- case 2: this.z = value; break;
- default: throw new Error( "index is out of range: " + index );
+ if (invdiry >= 0) {
+ tymin = (box.min.y - origin.y) * invdiry;
+ tymax = (box.max.y - origin.y) * invdiry;
+ } else {
+ tymin = (box.max.y - origin.y) * invdiry;
+ tymax = (box.min.y - origin.y) * invdiry;
+ }
- }
+ if (tmin > tymax || tymin > tmax) return null; // These lines also handle the case where tmin or tmax is NaN
+ // (result of 0 * Infinity). x !== x returns true if x is NaN
- },
+ if (tymin > tmin || tmin !== tmin) tmin = tymin;
+ if (tymax < tmax || tmax !== tmax) tmax = tymax;
- getComponent: function ( index ) {
+ if (invdirz >= 0) {
+ tzmin = (box.min.z - origin.z) * invdirz;
+ tzmax = (box.max.z - origin.z) * invdirz;
+ } else {
+ tzmin = (box.max.z - origin.z) * invdirz;
+ tzmax = (box.min.z - origin.z) * invdirz;
+ }
- switch ( index ) {
+ if (tmin > tzmax || tzmin > tmax) return null;
+ if (tzmin > tmin || tmin !== tmin) tmin = tzmin;
+ if (tzmax < tmax || tmax !== tmax) tmax = tzmax; //return point closest to the ray (positive side)
- case 0: return this.x;
- case 1: return this.y;
- case 2: return this.z;
- default: throw new Error( "index is out of range: " + index );
+ if (tmax < 0) return null;
+ return this.at(tmin >= 0 ? tmin : tmax, target);
+ };
- }
+ _proto.intersectsBox = function intersectsBox(box) {
+ return this.intersectBox(box, _vector$2) !== null;
+ };
- },
+ _proto.intersectTriangle = function intersectTriangle(a, b, c, backfaceCulling, target) {
+ // Compute the offset origin, edges, and normal.
+ // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
+ _edge1.subVectors(b, a);
- copy: function ( v ) {
+ _edge2.subVectors(c, a);
- this.x = v.x;
- this.y = v.y;
- this.z = v.z;
+ _normal.crossVectors(_edge1, _edge2); // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
+ // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
+ // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
+ // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
+ // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
- return this;
- },
+ var DdN = this.direction.dot(_normal);
+ var sign;
- add: function ( v, w ) {
+ if (DdN > 0) {
+ if (backfaceCulling) return null;
+ sign = 1;
+ } else if (DdN < 0) {
+ sign = -1;
+ DdN = -DdN;
+ } else {
+ return null;
+ }
- if ( w !== undefined ) {
+ _diff.subVectors(this.origin, a);
- console.warn( 'DEPRECATED: Vector3\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
- return this.addVectors( v, w );
+ var DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); // b1 < 0, no intersection
- }
+ if (DdQxE2 < 0) {
+ return null;
+ }
- this.x += v.x;
- this.y += v.y;
- this.z += v.z;
+ var DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff)); // b2 < 0, no intersection
- return this;
+ if (DdE1xQ < 0) {
+ return null;
+ } // b1+b2 > 1, no intersection
- },
- addScalar: function ( s ) {
+ if (DdQxE2 + DdE1xQ > DdN) {
+ return null;
+ } // Line intersects triangle, check if ray does.
- this.x += s;
- this.y += s;
- this.z += s;
- return this;
+ var QdN = -sign * _diff.dot(_normal); // t < 0, no intersection
- },
- addVectors: function ( a, b ) {
+ if (QdN < 0) {
+ return null;
+ } // Ray intersects triangle.
- this.x = a.x + b.x;
- this.y = a.y + b.y;
- this.z = a.z + b.z;
- return this;
+ return this.at(QdN / DdN, target);
+ };
- },
+ _proto.applyMatrix4 = function applyMatrix4(matrix4) {
+ this.origin.applyMatrix4(matrix4);
+ this.direction.transformDirection(matrix4);
+ return this;
+ };
- sub: function ( v, w ) {
+ _proto.equals = function equals(ray) {
+ return ray.origin.equals(this.origin) && ray.direction.equals(this.direction);
+ };
- if ( w !== undefined ) {
+ return Ray;
+ }();
- console.warn( 'DEPRECATED: Vector3\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
- return this.subVectors( v, w );
+ var Matrix4 = /*#__PURE__*/function () {
+ function Matrix4() {
+ Object.defineProperty(this, 'isMatrix4', {
+ value: true
+ });
+ 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.');
+ }
}
- this.x -= v.x;
- this.y -= v.y;
- this.z -= v.z;
+ var _proto = Matrix4.prototype;
- return this;
+ _proto.set = function set(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;
+ };
- },
+ _proto.identity = function identity() {
+ this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ return this;
+ };
- subVectors: function ( a, b ) {
+ _proto.clone = function clone() {
+ return new Matrix4().fromArray(this.elements);
+ };
- this.x = a.x - b.x;
- this.y = a.y - b.y;
- this.z = a.z - b.z;
+ _proto.copy = function copy(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;
+ };
- return this;
+ _proto.copyPosition = function copyPosition(m) {
+ var te = this.elements,
+ me = m.elements;
+ te[12] = me[12];
+ te[13] = me[13];
+ te[14] = me[14];
+ return this;
+ };
- },
+ _proto.extractBasis = function extractBasis(xAxis, yAxis, zAxis) {
+ xAxis.setFromMatrixColumn(this, 0);
+ yAxis.setFromMatrixColumn(this, 1);
+ zAxis.setFromMatrixColumn(this, 2);
+ return this;
+ };
- multiply: function ( v, w ) {
+ _proto.makeBasis = function makeBasis(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;
+ };
- if ( w !== undefined ) {
+ _proto.extractRotation = function extractRotation(m) {
+ // this method does not support reflection matrices
+ var te = this.elements;
+ var me = m.elements;
- console.warn( 'DEPRECATED: Vector3\'s .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
- return this.multiplyVectors( v, w );
+ var scaleX = 1 / _v1$1.setFromMatrixColumn(m, 0).length();
- }
+ var scaleY = 1 / _v1$1.setFromMatrixColumn(m, 1).length();
- this.x *= v.x;
- this.y *= v.y;
- this.z *= v.z;
+ var scaleZ = 1 / _v1$1.setFromMatrixColumn(m, 2).length();
- return this;
+ 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;
+ };
- },
+ _proto.makeRotationFromEuler = function makeRotationFromEuler(euler) {
+ if (!(euler && euler.isEuler)) {
+ console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');
+ }
- multiplyScalar: function ( scalar ) {
+ 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;
+ };
- this.x *= scalar;
- this.y *= scalar;
- this.z *= scalar;
+ _proto.makeRotationFromQuaternion = function makeRotationFromQuaternion(q) {
+ return this.compose(_zero, q, _one);
+ };
- return this;
+ _proto.lookAt = function lookAt(eye, target, up) {
+ var te = this.elements;
- },
+ _z.subVectors(eye, target);
- multiplyVectors: function ( a, b ) {
+ if (_z.lengthSq() === 0) {
+ // eye and target are in the same position
+ _z.z = 1;
+ }
- this.x = a.x * b.x;
- this.y = a.y * b.y;
- this.z = a.z * b.z;
+ _z.normalize();
- return this;
+ _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;
+ }
- applyEuler: function () {
+ _z.normalize();
- var quaternion;
+ _x.crossVectors(up, _z);
+ }
- return function ( euler ) {
+ _x.normalize();
- if ( euler instanceof THREE.Euler === false ) {
+ _y.crossVectors(_z, _x);
- console.error( 'ERROR: Vector3\'s .applyEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.' );
+ 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;
+ };
+ _proto.multiply = function multiply(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);
}
- if ( quaternion === undefined ) quaternion = new THREE.Quaternion();
+ return this.multiplyMatrices(this, m);
+ };
- this.applyQuaternion( quaternion.setFromEuler( euler ) );
+ _proto.premultiply = function premultiply(m) {
+ return this.multiplyMatrices(m, this);
+ };
+ _proto.multiplyMatrices = function multiplyMatrices(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;
-
};
- }(),
-
- applyAxisAngle: function () {
+ _proto.multiplyScalar = function multiplyScalar(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;
+ };
- var quaternion;
+ _proto.determinant = function determinant() {
+ 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);
+ };
- return function ( axis, angle ) {
+ _proto.transpose = function transpose() {
+ 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;
+ };
- if ( quaternion === undefined ) quaternion = new THREE.Quaternion();
+ _proto.setPosition = function setPosition(x, y, z) {
+ var te = this.elements;
- this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
+ if (x.isVector3) {
+ te[12] = x.x;
+ te[13] = x.y;
+ te[14] = x.z;
+ } else {
+ te[12] = x;
+ te[13] = y;
+ te[14] = z;
+ }
return this;
+ };
+ _proto.getInverse = function getInverse(m, throwOnDegenerate) {
+ if (throwOnDegenerate !== undefined) {
+ console.warn("THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.");
+ } // 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) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ 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;
};
- }(),
+ _proto.scale = function scale(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;
+ };
- applyMatrix3: function ( m ) {
+ _proto.getMaxScaleOnAxis = function getMaxScaleOnAxis() {
+ 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));
+ };
- var x = this.x;
- var y = this.y;
- var z = this.z;
+ _proto.makeTranslation = function makeTranslation(x, y, z) {
+ this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);
+ return this;
+ };
- var e = m.elements;
+ _proto.makeRotationX = function makeRotationX(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;
+ };
- this.x = e[0] * x + e[3] * y + e[6] * z;
- this.y = e[1] * x + e[4] * y + e[7] * z;
- this.z = e[2] * x + e[5] * y + e[8] * z;
+ _proto.makeRotationY = function makeRotationY(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;
+ };
- return this;
+ _proto.makeRotationZ = function makeRotationZ(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;
+ };
- },
+ _proto.makeRotationAxis = function makeRotationAxis(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;
+ };
- applyMatrix4: function ( m ) {
+ _proto.makeScale = function makeScale(x, y, z) {
+ this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
+ return this;
+ };
- // input: THREE.Matrix4 affine matrix
+ _proto.makeShear = function makeShear(x, y, z) {
+ this.set(1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1);
+ return this;
+ };
- var x = this.x, y = this.y, z = this.z;
+ _proto.compose = function compose(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;
+ };
- var e = m.elements;
+ _proto.decompose = function decompose(position, quaternion, scale) {
+ var te = this.elements;
- this.x = e[0] * x + e[4] * y + e[8] * z + e[12];
- this.y = e[1] * x + e[5] * y + e[9] * z + e[13];
- this.z = e[2] * x + e[6] * y + e[10] * z + e[14];
+ var sx = _v1$1.set(te[0], te[1], te[2]).length();
- return this;
+ var sy = _v1$1.set(te[4], te[5], te[6]).length();
- },
+ var sz = _v1$1.set(te[8], te[9], te[10]).length(); // if determine is negative, we need to invert one scale
- applyProjection: function ( m ) {
- // input: THREE.Matrix4 projection matrix
+ 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
- var x = this.x, y = this.y, z = this.z;
+ _m1.copy(this);
- var e = m.elements;
- var d = 1 / ( e[3] * x + e[7] * y + e[11] * z + e[15] ); // perspective divide
+ var invSX = 1 / sx;
+ var invSY = 1 / sy;
+ var invSZ = 1 / sz;
+ _m1.elements[0] *= invSX;
+ _m1.elements[1] *= invSX;
+ _m1.elements[2] *= invSX;
+ _m1.elements[4] *= invSY;
+ _m1.elements[5] *= invSY;
+ _m1.elements[6] *= invSY;
+ _m1.elements[8] *= invSZ;
+ _m1.elements[9] *= invSZ;
+ _m1.elements[10] *= invSZ;
+ quaternion.setFromRotationMatrix(_m1);
+ scale.x = sx;
+ scale.y = sy;
+ scale.z = sz;
+ return this;
+ };
- this.x = ( e[0] * x + e[4] * y + e[8] * z + e[12] ) * d;
- this.y = ( e[1] * x + e[5] * y + e[9] * z + e[13] ) * d;
- this.z = ( e[2] * x + e[6] * y + e[10] * z + e[14] ) * d;
+ _proto.makePerspective = function makePerspective(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.');
+ }
- return this;
+ 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;
+ };
- },
+ _proto.makeOrthographic = function makeOrthographic(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;
+ };
- applyQuaternion: function ( q ) {
+ _proto.equals = function equals(matrix) {
+ var te = this.elements;
+ var me = matrix.elements;
- var x = this.x;
- var y = this.y;
- var z = this.z;
+ for (var i = 0; i < 16; i++) {
+ if (te[i] !== me[i]) return false;
+ }
- var qx = q.x;
- var qy = q.y;
- var qz = q.z;
- var qw = q.w;
+ return true;
+ };
- // calculate quat * vector
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- var ix = qw * x + qy * z - qz * y;
- var iy = qw * y + qz * x - qx * z;
- var iz = qw * z + qx * y - qy * x;
- var iw = -qx * x - qy * y - qz * z;
+ for (var i = 0; i < 16; i++) {
+ this.elements[i] = array[i + offset];
+ }
- // calculate result * inverse quat
+ return this;
+ };
- this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
- this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
- this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- return this;
+ if (offset === void 0) {
+ 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;
+ };
- transformDirection: function ( m ) {
+ return Matrix4;
+ }();
- // input: THREE.Matrix4 affine matrix
- // vector interpreted as a direction
+ var _v1$1 = /*@__PURE__*/new Vector3();
- var x = this.x, y = this.y, z = this.z;
+ var _m1 = /*@__PURE__*/new Matrix4();
- var e = m.elements;
+ var _zero = /*@__PURE__*/new Vector3(0, 0, 0);
- this.x = e[0] * x + e[4] * y + e[8] * z;
- this.y = e[1] * x + e[5] * y + e[9] * z;
- this.z = e[2] * x + e[6] * y + e[10] * z;
+ var _one = /*@__PURE__*/new Vector3(1, 1, 1);
- this.normalize();
+ var _x = /*@__PURE__*/new Vector3();
- return this;
+ var _y = /*@__PURE__*/new Vector3();
- },
+ var _z = /*@__PURE__*/new Vector3();
- divide: function ( v ) {
+ var Euler = /*#__PURE__*/function () {
+ function Euler(x, y, z, order) {
+ if (x === void 0) {
+ x = 0;
+ }
- this.x /= v.x;
- this.y /= v.y;
- this.z /= v.z;
+ if (y === void 0) {
+ y = 0;
+ }
- return this;
+ if (z === void 0) {
+ z = 0;
+ }
- },
+ if (order === void 0) {
+ order = Euler.DefaultOrder;
+ }
- divideScalar: function ( scalar ) {
+ Object.defineProperty(this, 'isEuler', {
+ value: true
+ });
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ this._order = order;
+ }
- if ( scalar !== 0 ) {
+ var _proto = Euler.prototype;
- var invScalar = 1 / scalar;
+ _proto.set = function set(x, y, z, order) {
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ this._order = order || this._order;
- this.x *= invScalar;
- this.y *= invScalar;
- this.z *= invScalar;
+ this._onChangeCallback();
- } else {
+ return this;
+ };
- this.x = 0;
- this.y = 0;
- this.z = 0;
+ _proto.clone = function clone() {
+ return new this.constructor(this._x, this._y, this._z, this._order);
+ };
- }
+ _proto.copy = function copy(euler) {
+ this._x = euler._x;
+ this._y = euler._y;
+ this._z = euler._z;
+ this._order = euler._order;
- return this;
+ this._onChangeCallback();
- },
+ return this;
+ };
- min: function ( v ) {
+ _proto.setFromRotationMatrix = function setFromRotationMatrix(m, order, update) {
+ var clamp = MathUtils.clamp; // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+
+ var te = m.elements;
+ var m11 = te[0],
+ m12 = te[4],
+ m13 = te[8];
+ var m21 = te[1],
+ m22 = te[5],
+ m23 = te[9];
+ var m31 = te[2],
+ m32 = te[6],
+ m33 = te[10];
+ order = order || this._order;
+
+ switch (order) {
+ case 'XYZ':
+ this._y = Math.asin(clamp(m13, -1, 1));
+
+ if (Math.abs(m13) < 0.9999999) {
+ this._x = Math.atan2(-m23, m33);
+ this._z = Math.atan2(-m12, m11);
+ } else {
+ this._x = Math.atan2(m32, m22);
+ this._z = 0;
+ }
- if ( this.x > v.x ) {
+ break;
- this.x = v.x;
+ case 'YXZ':
+ this._x = Math.asin(-clamp(m23, -1, 1));
- }
+ if (Math.abs(m23) < 0.9999999) {
+ this._y = Math.atan2(m13, m33);
+ this._z = Math.atan2(m21, m22);
+ } else {
+ this._y = Math.atan2(-m31, m11);
+ this._z = 0;
+ }
- if ( this.y > v.y ) {
+ break;
- this.y = v.y;
+ case 'ZXY':
+ this._x = Math.asin(clamp(m32, -1, 1));
- }
+ if (Math.abs(m32) < 0.9999999) {
+ this._y = Math.atan2(-m31, m33);
+ this._z = Math.atan2(-m12, m22);
+ } else {
+ this._y = 0;
+ this._z = Math.atan2(m21, m11);
+ }
- if ( this.z > v.z ) {
+ break;
- this.z = v.z;
+ case 'ZYX':
+ this._y = Math.asin(-clamp(m31, -1, 1));
- }
+ if (Math.abs(m31) < 0.9999999) {
+ this._x = Math.atan2(m32, m33);
+ this._z = Math.atan2(m21, m11);
+ } else {
+ this._x = 0;
+ this._z = Math.atan2(-m12, m22);
+ }
- return this;
+ break;
- },
+ case 'YZX':
+ this._z = Math.asin(clamp(m21, -1, 1));
- max: function ( v ) {
+ if (Math.abs(m21) < 0.9999999) {
+ this._x = Math.atan2(-m23, m22);
+ this._y = Math.atan2(-m31, m11);
+ } else {
+ this._x = 0;
+ this._y = Math.atan2(m13, m33);
+ }
- if ( this.x < v.x ) {
+ break;
- this.x = v.x;
+ case 'XZY':
+ this._z = Math.asin(-clamp(m12, -1, 1));
- }
+ if (Math.abs(m12) < 0.9999999) {
+ this._x = Math.atan2(m32, m22);
+ this._y = Math.atan2(m13, m11);
+ } else {
+ this._x = Math.atan2(-m23, m33);
+ this._y = 0;
+ }
- if ( this.y < v.y ) {
+ break;
- this.y = v.y;
+ default:
+ console.warn('THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order);
+ }
- }
+ this._order = order;
+ if (update !== false) this._onChangeCallback();
+ return this;
+ };
- if ( this.z < v.z ) {
+ _proto.setFromQuaternion = function setFromQuaternion(q, order, update) {
+ _matrix.makeRotationFromQuaternion(q);
- this.z = v.z;
+ return this.setFromRotationMatrix(_matrix, order, update);
+ };
- }
+ _proto.setFromVector3 = function setFromVector3(v, order) {
+ return this.set(v.x, v.y, v.z, order || this._order);
+ };
- return this;
+ _proto.reorder = function reorder(newOrder) {
+ // WARNING: this discards revolution information -bhouston
+ _quaternion$1.setFromEuler(this);
- },
+ return this.setFromQuaternion(_quaternion$1, newOrder);
+ };
- clamp: function ( min, max ) {
+ _proto.equals = function equals(euler) {
+ return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order;
+ };
- // This function assumes min < max, if this assumption isn't true it will not operate correctly
+ _proto.fromArray = function fromArray(array) {
+ this._x = array[0];
+ this._y = array[1];
+ this._z = array[2];
+ if (array[3] !== undefined) this._order = array[3];
- if ( this.x < min.x ) {
+ this._onChangeCallback();
- this.x = min.x;
+ return this;
+ };
- } else if ( this.x > max.x ) {
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- this.x = max.x;
+ if (offset === void 0) {
+ offset = 0;
+ }
- }
+ array[offset] = this._x;
+ array[offset + 1] = this._y;
+ array[offset + 2] = this._z;
+ array[offset + 3] = this._order;
+ return array;
+ };
- if ( this.y < min.y ) {
+ _proto.toVector3 = function toVector3(optionalResult) {
+ if (optionalResult) {
+ return optionalResult.set(this._x, this._y, this._z);
+ } else {
+ return new Vector3(this._x, this._y, this._z);
+ }
+ };
- this.y = min.y;
+ _proto._onChange = function _onChange(callback) {
+ this._onChangeCallback = callback;
+ return this;
+ };
- } else if ( this.y > max.y ) {
+ _proto._onChangeCallback = function _onChangeCallback() {};
- this.y = max.y;
+ _createClass(Euler, [{
+ key: "x",
+ get: function get() {
+ return this._x;
+ },
+ set: function set(value) {
+ this._x = value;
- }
+ this._onChangeCallback();
+ }
+ }, {
+ key: "y",
+ get: function get() {
+ return this._y;
+ },
+ set: function set(value) {
+ this._y = value;
- if ( this.z < min.z ) {
+ this._onChangeCallback();
+ }
+ }, {
+ key: "z",
+ get: function get() {
+ return this._z;
+ },
+ set: function set(value) {
+ this._z = value;
- this.z = min.z;
+ this._onChangeCallback();
+ }
+ }, {
+ key: "order",
+ get: function get() {
+ return this._order;
+ },
+ set: function set(value) {
+ this._order = value;
- } else if ( this.z > max.z ) {
+ this._onChangeCallback();
+ }
+ }]);
- this.z = max.z;
+ return Euler;
+ }();
- }
+ Euler.DefaultOrder = 'XYZ';
+ Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'];
- return this;
+ var _matrix = /*@__PURE__*/new Matrix4();
- },
+ var _quaternion$1 = /*@__PURE__*/new Quaternion();
- clampScalar: ( function () {
+ var Layers = /*#__PURE__*/function () {
+ function Layers() {
+ this.mask = 1 | 0;
+ }
- var min, max;
+ var _proto = Layers.prototype;
- return function ( minVal, maxVal ) {
+ _proto.set = function set(channel) {
+ this.mask = 1 << channel | 0;
+ };
- if ( min === undefined ) {
+ _proto.enable = function enable(channel) {
+ this.mask |= 1 << channel | 0;
+ };
- min = new THREE.Vector3();
- max = new THREE.Vector3();
+ _proto.enableAll = function enableAll() {
+ this.mask = 0xffffffff | 0;
+ };
- }
+ _proto.toggle = function toggle(channel) {
+ this.mask ^= 1 << channel | 0;
+ };
- min.set( minVal, minVal, minVal );
- max.set( maxVal, maxVal, maxVal );
+ _proto.disable = function disable(channel) {
+ this.mask &= ~(1 << channel | 0);
+ };
- return this.clamp( min, max );
+ _proto.disableAll = function disableAll() {
+ this.mask = 0;
+ };
+ _proto.test = function test(layers) {
+ return (this.mask & layers.mask) !== 0;
};
- } )(),
+ return Layers;
+ }();
- floor: function () {
+ var _object3DId = 0;
- this.x = Math.floor( this.x );
- this.y = Math.floor( this.y );
- this.z = Math.floor( this.z );
+ var _v1$2 = new Vector3();
- return this;
+ var _q1 = new Quaternion();
- },
+ var _m1$1 = new Matrix4();
- ceil: function () {
+ var _target = new Vector3();
- this.x = Math.ceil( this.x );
- this.y = Math.ceil( this.y );
- this.z = Math.ceil( this.z );
+ var _position = new Vector3();
- return this;
+ var _scale = new Vector3();
- },
+ var _quaternion$2 = new Quaternion();
- round: function () {
+ var _xAxis = new Vector3(1, 0, 0);
- this.x = Math.round( this.x );
- this.y = Math.round( this.y );
- this.z = Math.round( this.z );
+ var _yAxis = new Vector3(0, 1, 0);
- return this;
+ var _zAxis = new Vector3(0, 0, 1);
- },
+ var _addedEvent = {
+ type: 'added'
+ };
+ var _removedEvent = {
+ type: 'removed'
+ };
- roundToZero: function () {
+ function Object3D() {
+ Object.defineProperty(this, 'id', {
+ value: _object3DId++
+ });
+ this.uuid = MathUtils.generateUUID();
+ this.name = '';
+ this.type = 'Object3D';
+ this.parent = null;
+ this.children = [];
+ this.up = Object3D.DefaultUp.clone();
+ var position = new Vector3();
+ var rotation = new Euler();
+ var quaternion = new Quaternion();
+ var scale = new Vector3(1, 1, 1);
+
+ function onRotationChange() {
+ quaternion.setFromEuler(rotation, false);
+ }
+
+ function onQuaternionChange() {
+ rotation.setFromQuaternion(quaternion, undefined, false);
+ }
+
+ rotation._onChange(onRotationChange);
+
+ quaternion._onChange(onQuaternionChange);
+
+ Object.defineProperties(this, {
+ position: {
+ configurable: true,
+ enumerable: true,
+ value: position
+ },
+ rotation: {
+ configurable: true,
+ enumerable: true,
+ value: rotation
+ },
+ quaternion: {
+ configurable: true,
+ enumerable: true,
+ value: quaternion
+ },
+ scale: {
+ configurable: true,
+ enumerable: true,
+ value: scale
+ },
+ modelViewMatrix: {
+ value: new Matrix4()
+ },
+ normalMatrix: {
+ value: new Matrix3()
+ }
+ });
+ this.matrix = new Matrix4();
+ this.matrixWorld = new Matrix4();
+ this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
+ this.matrixWorldNeedsUpdate = false;
+ this.layers = new Layers();
+ this.visible = true;
+ this.castShadow = false;
+ this.receiveShadow = false;
+ this.frustumCulled = true;
+ this.renderOrder = 0;
+ this.userData = {};
+ }
+
+ Object3D.DefaultUp = new Vector3(0, 1, 0);
+ Object3D.DefaultMatrixAutoUpdate = true;
+ Object3D.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
+ constructor: Object3D,
+ isObject3D: true,
+ onBeforeRender: function onBeforeRender() {},
+ onAfterRender: function onAfterRender() {},
+ applyMatrix4: function applyMatrix4(matrix) {
+ if (this.matrixAutoUpdate) this.updateMatrix();
+ this.matrix.premultiply(matrix);
+ this.matrix.decompose(this.position, this.quaternion, this.scale);
+ },
+ applyQuaternion: function applyQuaternion(q) {
+ this.quaternion.premultiply(q);
+ return this;
+ },
+ setRotationFromAxisAngle: function setRotationFromAxisAngle(axis, angle) {
+ // assumes axis is normalized
+ this.quaternion.setFromAxisAngle(axis, angle);
+ },
+ setRotationFromEuler: function setRotationFromEuler(euler) {
+ this.quaternion.setFromEuler(euler, true);
+ },
+ setRotationFromMatrix: function setRotationFromMatrix(m) {
+ // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+ this.quaternion.setFromRotationMatrix(m);
+ },
+ setRotationFromQuaternion: function setRotationFromQuaternion(q) {
+ // assumes q is normalized
+ this.quaternion.copy(q);
+ },
+ rotateOnAxis: function rotateOnAxis(axis, angle) {
+ // rotate object on axis in object space
+ // axis is assumed to be normalized
+ _q1.setFromAxisAngle(axis, angle);
- 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 );
- this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
+ this.quaternion.multiply(_q1);
+ return this;
+ },
+ rotateOnWorldAxis: function rotateOnWorldAxis(axis, angle) {
+ // rotate object on axis in world space
+ // axis is assumed to be normalized
+ // method assumes no rotated parent
+ _q1.setFromAxisAngle(axis, angle);
- return this;
+ this.quaternion.premultiply(_q1);
+ return this;
+ },
+ rotateX: function rotateX(angle) {
+ return this.rotateOnAxis(_xAxis, angle);
+ },
+ rotateY: function rotateY(angle) {
+ return this.rotateOnAxis(_yAxis, angle);
+ },
+ rotateZ: function rotateZ(angle) {
+ return this.rotateOnAxis(_zAxis, angle);
+ },
+ translateOnAxis: function translateOnAxis(axis, distance) {
+ // translate object by distance along axis in object space
+ // axis is assumed to be normalized
+ _v1$2.copy(axis).applyQuaternion(this.quaternion);
- },
+ this.position.add(_v1$2.multiplyScalar(distance));
+ return this;
+ },
+ translateX: function translateX(distance) {
+ return this.translateOnAxis(_xAxis, distance);
+ },
+ translateY: function translateY(distance) {
+ return this.translateOnAxis(_yAxis, distance);
+ },
+ translateZ: function translateZ(distance) {
+ return this.translateOnAxis(_zAxis, distance);
+ },
+ localToWorld: function localToWorld(vector) {
+ return vector.applyMatrix4(this.matrixWorld);
+ },
+ worldToLocal: function worldToLocal(vector) {
+ return vector.applyMatrix4(_m1$1.getInverse(this.matrixWorld));
+ },
+ lookAt: function lookAt(x, y, z) {
+ // This method does not support objects having non-uniformly-scaled parent(s)
+ if (x.isVector3) {
+ _target.copy(x);
+ } else {
+ _target.set(x, y, z);
+ }
- negate: function () {
+ var parent = this.parent;
+ this.updateWorldMatrix(true, false);
- return this.multiplyScalar( - 1 );
+ _position.setFromMatrixPosition(this.matrixWorld);
- },
+ if (this.isCamera || this.isLight) {
+ _m1$1.lookAt(_position, _target, this.up);
+ } else {
+ _m1$1.lookAt(_target, _position, this.up);
+ }
- dot: function ( v ) {
+ this.quaternion.setFromRotationMatrix(_m1$1);
- return this.x * v.x + this.y * v.y + this.z * v.z;
+ if (parent) {
+ _m1$1.extractRotation(parent.matrixWorld);
- },
+ _q1.setFromRotationMatrix(_m1$1);
- lengthSq: function () {
+ this.quaternion.premultiply(_q1.inverse());
+ }
+ },
+ add: function add(object) {
+ if (arguments.length > 1) {
+ for (var i = 0; i < arguments.length; i++) {
+ this.add(arguments[i]);
+ }
- return this.x * this.x + this.y * this.y + this.z * this.z;
+ return this;
+ }
- },
+ if (object === this) {
+ console.error("THREE.Object3D.add: object can't be added as a child of itself.", object);
+ return this;
+ }
- length: function () {
+ if (object && object.isObject3D) {
+ if (object.parent !== null) {
+ object.parent.remove(object);
+ }
- return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
+ object.parent = this;
+ this.children.push(object);
+ object.dispatchEvent(_addedEvent);
+ } else {
+ console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", object);
+ }
- },
+ return this;
+ },
+ remove: function remove(object) {
+ if (arguments.length > 1) {
+ for (var i = 0; i < arguments.length; i++) {
+ this.remove(arguments[i]);
+ }
- lengthManhattan: function () {
+ return this;
+ }
- return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
+ var index = this.children.indexOf(object);
- },
+ if (index !== -1) {
+ object.parent = null;
+ this.children.splice(index, 1);
+ object.dispatchEvent(_removedEvent);
+ }
- normalize: function () {
+ return this;
+ },
+ clear: function clear() {
+ for (var i = 0; i < this.children.length; i++) {
+ var object = this.children[i];
+ object.parent = null;
+ object.dispatchEvent(_removedEvent);
+ }
- return this.divideScalar( this.length() );
+ this.children.length = 0;
+ return this;
+ },
+ attach: function attach(object) {
+ // adds object as a child of this, while maintaining the object's world transform
+ this.updateWorldMatrix(true, false);
- },
+ _m1$1.getInverse(this.matrixWorld);
- setLength: function ( l ) {
+ if (object.parent !== null) {
+ object.parent.updateWorldMatrix(true, false);
- var oldLength = this.length();
+ _m1$1.multiply(object.parent.matrixWorld);
+ }
- if ( oldLength !== 0 && l !== oldLength ) {
+ object.applyMatrix4(_m1$1);
+ object.updateWorldMatrix(false, false);
+ this.add(object);
+ return this;
+ },
+ getObjectById: function getObjectById(id) {
+ return this.getObjectByProperty('id', id);
+ },
+ getObjectByName: function getObjectByName(name) {
+ return this.getObjectByProperty('name', name);
+ },
+ getObjectByProperty: function getObjectByProperty(name, value) {
+ if (this[name] === value) return this;
- this.multiplyScalar( l / oldLength );
- }
+ for (var i = 0, l = this.children.length; i < l; i++) {
+ var child = this.children[i];
+ var object = child.getObjectByProperty(name, value);
- return this;
+ if (object !== undefined) {
+ return object;
+ }
+ }
- },
+ return undefined;
+ },
+ getWorldPosition: function getWorldPosition(target) {
+ if (target === undefined) {
+ console.warn('THREE.Object3D: .getWorldPosition() target is now required');
+ target = new Vector3();
+ }
- lerp: function ( v, alpha ) {
+ this.updateWorldMatrix(true, false);
+ return target.setFromMatrixPosition(this.matrixWorld);
+ },
+ getWorldQuaternion: function getWorldQuaternion(target) {
+ if (target === undefined) {
+ console.warn('THREE.Object3D: .getWorldQuaternion() target is now required');
+ target = new Quaternion();
+ }
- this.x += ( v.x - this.x ) * alpha;
- this.y += ( v.y - this.y ) * alpha;
- this.z += ( v.z - this.z ) * alpha;
+ this.updateWorldMatrix(true, false);
+ this.matrixWorld.decompose(_position, target, _scale);
+ return target;
+ },
+ getWorldScale: function getWorldScale(target) {
+ if (target === undefined) {
+ console.warn('THREE.Object3D: .getWorldScale() target is now required');
+ target = new Vector3();
+ }
- return this;
+ this.updateWorldMatrix(true, false);
+ this.matrixWorld.decompose(_position, _quaternion$2, target);
+ return target;
+ },
+ getWorldDirection: function getWorldDirection(target) {
+ if (target === undefined) {
+ console.warn('THREE.Object3D: .getWorldDirection() target is now required');
+ target = new Vector3();
+ }
- },
+ this.updateWorldMatrix(true, false);
+ var e = this.matrixWorld.elements;
+ return target.set(e[8], e[9], e[10]).normalize();
+ },
+ raycast: function raycast() {},
+ traverse: function traverse(callback) {
+ callback(this);
+ var children = this.children;
- cross: function ( v, w ) {
+ for (var i = 0, l = children.length; i < l; i++) {
+ children[i].traverse(callback);
+ }
+ },
+ traverseVisible: function traverseVisible(callback) {
+ if (this.visible === false) return;
+ callback(this);
+ var children = this.children;
- if ( w !== undefined ) {
+ for (var i = 0, l = children.length; i < l; i++) {
+ children[i].traverseVisible(callback);
+ }
+ },
+ traverseAncestors: function traverseAncestors(callback) {
+ var parent = this.parent;
- console.warn( 'DEPRECATED: Vector3\'s .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
- return this.crossVectors( v, w );
+ if (parent !== null) {
+ callback(parent);
+ parent.traverseAncestors(callback);
+ }
+ },
+ updateMatrix: function updateMatrix() {
+ this.matrix.compose(this.position, this.quaternion, this.scale);
+ this.matrixWorldNeedsUpdate = true;
+ },
+ updateMatrixWorld: function updateMatrixWorld(force) {
+ if (this.matrixAutoUpdate) this.updateMatrix();
- }
+ if (this.matrixWorldNeedsUpdate || force) {
+ if (this.parent === null) {
+ this.matrixWorld.copy(this.matrix);
+ } else {
+ this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);
+ }
- var x = this.x, y = this.y, z = this.z;
+ this.matrixWorldNeedsUpdate = false;
+ force = true;
+ } // update children
- this.x = y * v.z - z * v.y;
- this.y = z * v.x - x * v.z;
- this.z = x * v.y - y * v.x;
- return this;
+ var children = this.children;
- },
+ for (var i = 0, l = children.length; i < l; i++) {
+ children[i].updateMatrixWorld(force);
+ }
+ },
+ updateWorldMatrix: function updateWorldMatrix(updateParents, updateChildren) {
+ var parent = this.parent;
- crossVectors: function ( a, b ) {
+ if (updateParents === true && parent !== null) {
+ parent.updateWorldMatrix(true, false);
+ }
- var ax = a.x, ay = a.y, az = a.z;
- var bx = b.x, by = b.y, bz = b.z;
+ if (this.matrixAutoUpdate) this.updateMatrix();
- this.x = ay * bz - az * by;
- this.y = az * bx - ax * bz;
- this.z = ax * by - ay * bx;
+ if (this.parent === null) {
+ this.matrixWorld.copy(this.matrix);
+ } else {
+ this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);
+ } // update children
- return this;
- },
+ if (updateChildren === true) {
+ var children = this.children;
- projectOnVector: function () {
+ for (var i = 0, l = children.length; i < l; i++) {
+ children[i].updateWorldMatrix(false, true);
+ }
+ }
+ },
+ toJSON: function toJSON(meta) {
+ // meta is a string when called from JSON.stringify
+ var isRootObject = meta === undefined || typeof meta === 'string';
+ var output = {}; // meta is a hash used to collect geometries, materials.
+ // not providing it implies that this is the root object
+ // being serialized.
+
+ if (isRootObject) {
+ // initialize meta obj
+ meta = {
+ geometries: {},
+ materials: {},
+ textures: {},
+ images: {},
+ shapes: {}
+ };
+ output.metadata = {
+ version: 4.5,
+ type: 'Object',
+ generator: 'Object3D.toJSON'
+ };
+ } // standard Object3D serialization
+
+
+ var object = {};
+ object.uuid = this.uuid;
+ object.type = this.type;
+ if (this.name !== '') object.name = this.name;
+ if (this.castShadow === true) object.castShadow = true;
+ if (this.receiveShadow === true) object.receiveShadow = true;
+ if (this.visible === false) object.visible = false;
+ if (this.frustumCulled === false) object.frustumCulled = false;
+ if (this.renderOrder !== 0) object.renderOrder = this.renderOrder;
+ if (JSON.stringify(this.userData) !== '{}') object.userData = this.userData;
+ object.layers = this.layers.mask;
+ object.matrix = this.matrix.toArray();
+ if (this.matrixAutoUpdate === false) object.matrixAutoUpdate = false; // object specific properties
+
+ if (this.isInstancedMesh) {
+ object.type = 'InstancedMesh';
+ object.count = this.count;
+ object.instanceMatrix = this.instanceMatrix.toJSON();
+ } //
+
+
+ function serialize(library, element) {
+ if (library[element.uuid] === undefined) {
+ library[element.uuid] = element.toJSON(meta);
+ }
- var v1, dot;
+ return element.uuid;
+ }
- return function ( vector ) {
+ if (this.isMesh || this.isLine || this.isPoints) {
+ object.geometry = serialize(meta.geometries, this.geometry);
+ var parameters = this.geometry.parameters;
- if ( v1 === undefined ) v1 = new THREE.Vector3();
+ if (parameters !== undefined && parameters.shapes !== undefined) {
+ var shapes = parameters.shapes;
- v1.copy( vector ).normalize();
+ if (Array.isArray(shapes)) {
+ for (var i = 0, l = shapes.length; i < l; i++) {
+ var shape = shapes[i];
+ serialize(meta.shapes, shape);
+ }
+ } else {
+ serialize(meta.shapes, shapes);
+ }
+ }
+ }
- dot = this.dot( v1 );
+ if (this.material !== undefined) {
+ if (Array.isArray(this.material)) {
+ var uuids = [];
- return this.copy( v1 ).multiplyScalar( dot );
+ for (var _i = 0, _l = this.material.length; _i < _l; _i++) {
+ uuids.push(serialize(meta.materials, this.material[_i]));
+ }
- };
+ object.material = uuids;
+ } else {
+ object.material = serialize(meta.materials, this.material);
+ }
+ } //
- }(),
- projectOnPlane: function () {
+ if (this.children.length > 0) {
+ object.children = [];
- var v1;
+ for (var _i2 = 0; _i2 < this.children.length; _i2++) {
+ object.children.push(this.children[_i2].toJSON(meta).object);
+ }
+ }
- return function ( planeNormal ) {
+ if (isRootObject) {
+ var geometries = extractFromCache(meta.geometries);
+ var materials = extractFromCache(meta.materials);
+ var textures = extractFromCache(meta.textures);
+ var images = extractFromCache(meta.images);
- if ( v1 === undefined ) v1 = new THREE.Vector3();
+ var _shapes = extractFromCache(meta.shapes);
- v1.copy( this ).projectOnVector( planeNormal );
+ if (geometries.length > 0) output.geometries = geometries;
+ if (materials.length > 0) output.materials = materials;
+ if (textures.length > 0) output.textures = textures;
+ if (images.length > 0) output.images = images;
+ if (_shapes.length > 0) output.shapes = _shapes;
+ }
- return this.sub( v1 );
+ output.object = object;
+ return output; // extract data from the cache hash
+ // remove metadata on each item
+ // and return as array
- }
+ function extractFromCache(cache) {
+ var values = [];
- }(),
+ for (var key in cache) {
+ var data = cache[key];
+ delete data.metadata;
+ values.push(data);
+ }
- reflect: function () {
+ return values;
+ }
+ },
+ clone: function clone(recursive) {
+ return new this.constructor().copy(this, recursive);
+ },
+ copy: function copy(source, recursive) {
+ if (recursive === undefined) recursive = true;
+ this.name = source.name;
+ this.up.copy(source.up);
+ this.position.copy(source.position);
+ this.rotation.order = source.rotation.order;
+ this.quaternion.copy(source.quaternion);
+ this.scale.copy(source.scale);
+ this.matrix.copy(source.matrix);
+ this.matrixWorld.copy(source.matrixWorld);
+ this.matrixAutoUpdate = source.matrixAutoUpdate;
+ this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
+ this.layers.mask = source.layers.mask;
+ this.visible = source.visible;
+ this.castShadow = source.castShadow;
+ this.receiveShadow = source.receiveShadow;
+ this.frustumCulled = source.frustumCulled;
+ this.renderOrder = source.renderOrder;
+ this.userData = JSON.parse(JSON.stringify(source.userData));
+
+ if (recursive === true) {
+ for (var i = 0; i < source.children.length; i++) {
+ var child = source.children[i];
+ this.add(child.clone());
+ }
+ }
- // reflect incident vector off plane orthogonal to normal
- // normal is assumed to have unit length
+ return this;
+ }
+ });
- var v1;
+ var _vector1 = /*@__PURE__*/new Vector3();
- return function ( normal ) {
+ var _vector2 = /*@__PURE__*/new Vector3();
- if ( v1 === undefined ) v1 = new THREE.Vector3();
+ var _normalMatrix = /*@__PURE__*/new Matrix3();
- return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
+ var Plane = /*#__PURE__*/function () {
+ function Plane(normal, constant) {
+ Object.defineProperty(this, 'isPlane', {
+ value: true
+ }); // normal is assumed to be normalized
+ this.normal = normal !== undefined ? normal : new Vector3(1, 0, 0);
+ this.constant = constant !== undefined ? constant : 0;
}
- }(),
+ var _proto = Plane.prototype;
- angleTo: function ( v ) {
+ _proto.set = function set(normal, constant) {
+ this.normal.copy(normal);
+ this.constant = constant;
+ return this;
+ };
- var theta = this.dot( v ) / ( this.length() * v.length() );
+ _proto.setComponents = function setComponents(x, y, z, w) {
+ this.normal.set(x, y, z);
+ this.constant = w;
+ return this;
+ };
- // clamp, to handle numerical problems
+ _proto.setFromNormalAndCoplanarPoint = function setFromNormalAndCoplanarPoint(normal, point) {
+ this.normal.copy(normal);
+ this.constant = -point.dot(this.normal);
+ return this;
+ };
- return Math.acos( THREE.Math.clamp( theta, -1, 1 ) );
+ _proto.setFromCoplanarPoints = function setFromCoplanarPoints(a, b, c) {
+ var normal = _vector1.subVectors(c, b).cross(_vector2.subVectors(a, b)).normalize(); // Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
- },
- distanceTo: function ( v ) {
+ this.setFromNormalAndCoplanarPoint(normal, a);
+ return this;
+ };
- return Math.sqrt( this.distanceToSquared( v ) );
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
+ };
- },
+ _proto.copy = function copy(plane) {
+ this.normal.copy(plane.normal);
+ this.constant = plane.constant;
+ return this;
+ };
- distanceToSquared: function ( v ) {
+ _proto.normalize = function normalize() {
+ // Note: will lead to a divide by zero if the plane is invalid.
+ var inverseNormalLength = 1.0 / this.normal.length();
+ this.normal.multiplyScalar(inverseNormalLength);
+ this.constant *= inverseNormalLength;
+ return this;
+ };
- var dx = this.x - v.x;
- var dy = this.y - v.y;
- var dz = this.z - v.z;
+ _proto.negate = function negate() {
+ this.constant *= -1;
+ this.normal.negate();
+ return this;
+ };
- return dx * dx + dy * dy + dz * dz;
+ _proto.distanceToPoint = function distanceToPoint(point) {
+ return this.normal.dot(point) + this.constant;
+ };
- },
+ _proto.distanceToSphere = function distanceToSphere(sphere) {
+ return this.distanceToPoint(sphere.center) - sphere.radius;
+ };
- setEulerFromRotationMatrix: function ( m, order ) {
+ _proto.projectPoint = function projectPoint(point, target) {
+ if (target === undefined) {
+ console.warn('THREE.Plane: .projectPoint() target is now required');
+ target = new Vector3();
+ }
- console.error( "REMOVED: Vector3\'s setEulerFromRotationMatrix has been removed in favor of Euler.setFromRotationMatrix(), please update your code.");
+ return target.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point);
+ };
- },
+ _proto.intersectLine = function intersectLine(line, target) {
+ if (target === undefined) {
+ console.warn('THREE.Plane: .intersectLine() target is now required');
+ target = new Vector3();
+ }
- setEulerFromQuaternion: function ( q, order ) {
+ var direction = line.delta(_vector1);
+ var denominator = this.normal.dot(direction);
- console.error( "REMOVED: Vector3\'s setEulerFromQuaternion: has been removed in favor of Euler.setFromQuaternion(), please update your code.");
+ if (denominator === 0) {
+ // line is coplanar, return origin
+ if (this.distanceToPoint(line.start) === 0) {
+ return target.copy(line.start);
+ } // Unsure if this is the correct method to handle this case.
- },
- getPositionFromMatrix: function ( m ) {
+ return undefined;
+ }
- console.warn( "DEPRECATED: Vector3\'s .getPositionFromMatrix() has been renamed to .setFromMatrixPosition(). Please update your code." );
+ var t = -(line.start.dot(this.normal) + this.constant) / denominator;
- return this.setFromMatrixPosition( m );
+ if (t < 0 || t > 1) {
+ return undefined;
+ }
- },
+ return target.copy(direction).multiplyScalar(t).add(line.start);
+ };
- getScaleFromMatrix: function ( m ) {
+ _proto.intersectsLine = function intersectsLine(line) {
+ // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
+ var startSign = this.distanceToPoint(line.start);
+ var endSign = this.distanceToPoint(line.end);
+ return startSign < 0 && endSign > 0 || endSign < 0 && startSign > 0;
+ };
- console.warn( "DEPRECATED: Vector3\'s .getScaleFromMatrix() has been renamed to .setFromMatrixScale(). Please update your code." );
+ _proto.intersectsBox = function intersectsBox(box) {
+ return box.intersectsPlane(this);
+ };
- return this.setFromMatrixScale( m );
- },
+ _proto.intersectsSphere = function intersectsSphere(sphere) {
+ return sphere.intersectsPlane(this);
+ };
- getColumnFromMatrix: function ( index, matrix ) {
+ _proto.coplanarPoint = function coplanarPoint(target) {
+ if (target === undefined) {
+ console.warn('THREE.Plane: .coplanarPoint() target is now required');
+ target = new Vector3();
+ }
- console.warn( "DEPRECATED: Vector3\'s .getColumnFromMatrix() has been renamed to .setFromMatrixColumn(). Please update your code." );
-
- return this.setFromMatrixColumn( index, matrix );
+ return target.copy(this.normal).multiplyScalar(-this.constant);
+ };
- },
+ _proto.applyMatrix4 = function applyMatrix4(matrix, optionalNormalMatrix) {
+ var normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix(matrix);
- setFromMatrixPosition: function ( m ) {
+ var referencePoint = this.coplanarPoint(_vector1).applyMatrix4(matrix);
+ var normal = this.normal.applyMatrix3(normalMatrix).normalize();
+ this.constant = -referencePoint.dot(normal);
+ return this;
+ };
- this.x = m.elements[ 12 ];
- this.y = m.elements[ 13 ];
- this.z = m.elements[ 14 ];
+ _proto.translate = function translate(offset) {
+ this.constant -= offset.dot(this.normal);
+ return this;
+ };
- return this;
+ _proto.equals = function equals(plane) {
+ return plane.normal.equals(this.normal) && plane.constant === this.constant;
+ };
- },
+ return Plane;
+ }();
- setFromMatrixScale: function ( m ) {
+ var _v0$1 = /*@__PURE__*/new Vector3();
- var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length();
- var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length();
- var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length();
+ var _v1$3 = /*@__PURE__*/new Vector3();
- this.x = sx;
- this.y = sy;
- this.z = sz;
+ var _v2$1 = /*@__PURE__*/new Vector3();
- return this;
- },
+ var _v3 = /*@__PURE__*/new Vector3();
- setFromMatrixColumn: function ( index, matrix ) {
+ var _vab = /*@__PURE__*/new Vector3();
- var offset = index * 4;
+ var _vac = /*@__PURE__*/new Vector3();
- var me = matrix.elements;
+ var _vbc = /*@__PURE__*/new Vector3();
- this.x = me[ offset ];
- this.y = me[ offset + 1 ];
- this.z = me[ offset + 2 ];
+ var _vap = /*@__PURE__*/new Vector3();
- return this;
+ var _vbp = /*@__PURE__*/new Vector3();
- },
+ var _vcp = /*@__PURE__*/new Vector3();
- equals: function ( v ) {
+ var Triangle = /*#__PURE__*/function () {
+ function Triangle(a, b, c) {
+ this.a = a !== undefined ? a : new Vector3();
+ this.b = b !== undefined ? b : new Vector3();
+ this.c = c !== undefined ? c : new Vector3();
+ }
- return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
+ Triangle.getNormal = function getNormal(a, b, c, target) {
+ if (target === undefined) {
+ console.warn('THREE.Triangle: .getNormal() target is now required');
+ target = new Vector3();
+ }
- },
+ target.subVectors(c, b);
- fromArray: function ( array ) {
+ _v0$1.subVectors(a, b);
- this.x = array[ 0 ];
- this.y = array[ 1 ];
- this.z = array[ 2 ];
+ target.cross(_v0$1);
+ var targetLengthSq = target.lengthSq();
- return this;
+ if (targetLengthSq > 0) {
+ return target.multiplyScalar(1 / Math.sqrt(targetLengthSq));
+ }
- },
+ return target.set(0, 0, 0);
+ } // static/instance method to calculate barycentric coordinates
+ // based on: http://www.blackpawn.com/texts/pointinpoly/default.html
+ ;
- toArray: function () {
+ Triangle.getBarycoord = function getBarycoord(point, a, b, c, target) {
+ _v0$1.subVectors(c, a);
- return [ this.x, this.y, this.z ];
+ _v1$3.subVectors(b, a);
- },
+ _v2$1.subVectors(point, a);
- clone: function () {
+ var dot00 = _v0$1.dot(_v0$1);
- return new THREE.Vector3( this.x, this.y, this.z );
+ var dot01 = _v0$1.dot(_v1$3);
- }
+ var dot02 = _v0$1.dot(_v2$1);
-};
-/**
- * @author supereggbert / http://www.paulbrunt.co.uk/
- * @author philogb / http://blog.thejit.org/
- * @author mikael emtinger / http://gomo.se/
- * @author egraether / http://egraether.com/
- * @author WestLangley / http://github.com/WestLangley
- */
+ var dot11 = _v1$3.dot(_v1$3);
-THREE.Vector4 = function ( x, y, z, w ) {
+ var dot12 = _v1$3.dot(_v2$1);
- this.x = x || 0;
- this.y = y || 0;
- this.z = z || 0;
- this.w = ( w !== undefined ) ? w : 1;
+ var denom = dot00 * dot11 - dot01 * dot01;
-};
+ if (target === undefined) {
+ console.warn('THREE.Triangle: .getBarycoord() target is now required');
+ target = new Vector3();
+ } // collinear or singular triangle
-THREE.Vector4.prototype = {
- constructor: THREE.Vector4,
+ if (denom === 0) {
+ // arbitrary location outside of triangle?
+ // not sure if this is the best idea, maybe should be returning undefined
+ return target.set(-2, -1, -1);
+ }
- set: function ( x, y, z, w ) {
+ var invDenom = 1 / denom;
+ var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ var v = (dot00 * dot12 - dot01 * dot02) * invDenom; // barycentric coordinates must always sum to 1
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
+ return target.set(1 - u - v, v, u);
+ };
- return this;
+ Triangle.containsPoint = function containsPoint(point, a, b, c) {
+ this.getBarycoord(point, a, b, c, _v3);
+ return _v3.x >= 0 && _v3.y >= 0 && _v3.x + _v3.y <= 1;
+ };
- },
+ Triangle.getUV = function getUV(point, p1, p2, p3, uv1, uv2, uv3, target) {
+ this.getBarycoord(point, p1, p2, p3, _v3);
+ target.set(0, 0);
+ target.addScaledVector(uv1, _v3.x);
+ target.addScaledVector(uv2, _v3.y);
+ target.addScaledVector(uv3, _v3.z);
+ return target;
+ };
- setX: function ( x ) {
+ Triangle.isFrontFacing = function isFrontFacing(a, b, c, direction) {
+ _v0$1.subVectors(c, b);
- this.x = x;
+ _v1$3.subVectors(a, b); // strictly front facing
- return this;
- },
+ return _v0$1.cross(_v1$3).dot(direction) < 0 ? true : false;
+ };
- setY: function ( y ) {
+ var _proto = Triangle.prototype;
- this.y = y;
+ _proto.set = function set(a, b, c) {
+ this.a.copy(a);
+ this.b.copy(b);
+ this.c.copy(c);
+ return this;
+ };
- return this;
+ _proto.setFromPointsAndIndices = function setFromPointsAndIndices(points, i0, i1, i2) {
+ this.a.copy(points[i0]);
+ this.b.copy(points[i1]);
+ this.c.copy(points[i2]);
+ return this;
+ };
- },
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
+ };
- setZ: function ( z ) {
+ _proto.copy = function copy(triangle) {
+ this.a.copy(triangle.a);
+ this.b.copy(triangle.b);
+ this.c.copy(triangle.c);
+ return this;
+ };
- this.z = z;
+ _proto.getArea = function getArea() {
+ _v0$1.subVectors(this.c, this.b);
- return this;
+ _v1$3.subVectors(this.a, this.b);
- },
+ return _v0$1.cross(_v1$3).length() * 0.5;
+ };
- setW: function ( w ) {
+ _proto.getMidpoint = function getMidpoint(target) {
+ if (target === undefined) {
+ console.warn('THREE.Triangle: .getMidpoint() target is now required');
+ target = new Vector3();
+ }
- this.w = w;
+ return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3);
+ };
- return this;
+ _proto.getNormal = function getNormal(target) {
+ return Triangle.getNormal(this.a, this.b, this.c, target);
+ };
- },
+ _proto.getPlane = function getPlane(target) {
+ if (target === undefined) {
+ console.warn('THREE.Triangle: .getPlane() target is now required');
+ target = new Plane();
+ }
- setComponent: function ( index, value ) {
+ return target.setFromCoplanarPoints(this.a, this.b, this.c);
+ };
- switch ( index ) {
+ _proto.getBarycoord = function getBarycoord(point, target) {
+ return Triangle.getBarycoord(point, this.a, this.b, this.c, target);
+ };
- case 0: this.x = value; break;
- case 1: this.y = value; break;
- case 2: this.z = value; break;
- case 3: this.w = value; break;
- default: throw new Error( "index is out of range: " + index );
+ _proto.getUV = function getUV(point, uv1, uv2, uv3, target) {
+ return Triangle.getUV(point, this.a, this.b, this.c, uv1, uv2, uv3, target);
+ };
- }
+ _proto.containsPoint = function containsPoint(point) {
+ return Triangle.containsPoint(point, this.a, this.b, this.c);
+ };
- },
+ _proto.isFrontFacing = function isFrontFacing(direction) {
+ return Triangle.isFrontFacing(this.a, this.b, this.c, direction);
+ };
- getComponent: function ( index ) {
+ _proto.intersectsBox = function intersectsBox(box) {
+ return box.intersectsTriangle(this);
+ };
- switch ( index ) {
+ _proto.closestPointToPoint = function closestPointToPoint(p, target) {
+ if (target === undefined) {
+ console.warn('THREE.Triangle: .closestPointToPoint() target is now required');
+ target = new Vector3();
+ }
- case 0: return this.x;
- case 1: return this.y;
- case 2: return this.z;
- case 3: return this.w;
- default: throw new Error( "index is out of range: " + index );
+ var a = this.a,
+ b = this.b,
+ c = this.c;
+ var v, w; // algorithm thanks to Real-Time Collision Detection by Christer Ericson,
+ // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,
+ // under the accompanying license; see chapter 5.1.5 for detailed explanation.
+ // basically, we're distinguishing which of the voronoi regions of the triangle
+ // the point lies in with the minimum amount of redundant computation.
- }
+ _vab.subVectors(b, a);
- },
+ _vac.subVectors(c, a);
- copy: function ( v ) {
+ _vap.subVectors(p, a);
- this.x = v.x;
- this.y = v.y;
- this.z = v.z;
- this.w = ( v.w !== undefined ) ? v.w : 1;
+ var d1 = _vab.dot(_vap);
- return this;
+ var d2 = _vac.dot(_vap);
- },
+ if (d1 <= 0 && d2 <= 0) {
+ // vertex region of A; barycentric coords (1, 0, 0)
+ return target.copy(a);
+ }
- add: function ( v, w ) {
+ _vbp.subVectors(p, b);
- if ( w !== undefined ) {
+ var d3 = _vab.dot(_vbp);
- console.warn( 'DEPRECATED: Vector4\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
- return this.addVectors( v, w );
+ var d4 = _vac.dot(_vbp);
- }
+ if (d3 >= 0 && d4 <= d3) {
+ // vertex region of B; barycentric coords (0, 1, 0)
+ return target.copy(b);
+ }
- this.x += v.x;
- this.y += v.y;
- this.z += v.z;
- this.w += v.w;
+ var vc = d1 * d4 - d3 * d2;
- return this;
+ if (vc <= 0 && d1 >= 0 && d3 <= 0) {
+ v = d1 / (d1 - d3); // edge region of AB; barycentric coords (1-v, v, 0)
- },
+ return target.copy(a).addScaledVector(_vab, v);
+ }
- addScalar: function ( s ) {
+ _vcp.subVectors(p, c);
- this.x += s;
- this.y += s;
- this.z += s;
- this.w += s;
+ var d5 = _vab.dot(_vcp);
- return this;
+ var d6 = _vac.dot(_vcp);
- },
+ if (d6 >= 0 && d5 <= d6) {
+ // vertex region of C; barycentric coords (0, 0, 1)
+ return target.copy(c);
+ }
- addVectors: function ( a, b ) {
+ var vb = d5 * d2 - d1 * d6;
- this.x = a.x + b.x;
- this.y = a.y + b.y;
- this.z = a.z + b.z;
- this.w = a.w + b.w;
+ if (vb <= 0 && d2 >= 0 && d6 <= 0) {
+ w = d2 / (d2 - d6); // edge region of AC; barycentric coords (1-w, 0, w)
- return this;
+ return target.copy(a).addScaledVector(_vac, w);
+ }
- },
+ var va = d3 * d6 - d5 * d4;
- sub: function ( v, w ) {
+ if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0) {
+ _vbc.subVectors(c, b);
- if ( w !== undefined ) {
+ w = (d4 - d3) / (d4 - d3 + (d5 - d6)); // edge region of BC; barycentric coords (0, 1-w, w)
- console.warn( 'DEPRECATED: Vector4\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
- return this.subVectors( v, w );
+ return target.copy(b).addScaledVector(_vbc, w); // edge region of BC
+ } // face region
- }
- this.x -= v.x;
- this.y -= v.y;
- this.z -= v.z;
- this.w -= v.w;
+ var denom = 1 / (va + vb + vc); // u = va * denom
- return this;
+ v = vb * denom;
+ w = vc * denom;
+ return target.copy(a).addScaledVector(_vab, v).addScaledVector(_vac, w);
+ };
- },
+ _proto.equals = function equals(triangle) {
+ return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c);
+ };
- subVectors: function ( a, b ) {
+ return Triangle;
+ }();
- this.x = a.x - b.x;
- this.y = a.y - b.y;
- this.z = a.z - b.z;
- this.w = a.w - b.w;
+ var _colorKeywords = {
+ 'aliceblue': 0xF0F8FF,
+ 'antiquewhite': 0xFAEBD7,
+ 'aqua': 0x00FFFF,
+ 'aquamarine': 0x7FFFD4,
+ 'azure': 0xF0FFFF,
+ 'beige': 0xF5F5DC,
+ 'bisque': 0xFFE4C4,
+ 'black': 0x000000,
+ 'blanchedalmond': 0xFFEBCD,
+ 'blue': 0x0000FF,
+ 'blueviolet': 0x8A2BE2,
+ 'brown': 0xA52A2A,
+ 'burlywood': 0xDEB887,
+ 'cadetblue': 0x5F9EA0,
+ 'chartreuse': 0x7FFF00,
+ 'chocolate': 0xD2691E,
+ 'coral': 0xFF7F50,
+ 'cornflowerblue': 0x6495ED,
+ 'cornsilk': 0xFFF8DC,
+ 'crimson': 0xDC143C,
+ 'cyan': 0x00FFFF,
+ 'darkblue': 0x00008B,
+ 'darkcyan': 0x008B8B,
+ 'darkgoldenrod': 0xB8860B,
+ 'darkgray': 0xA9A9A9,
+ 'darkgreen': 0x006400,
+ 'darkgrey': 0xA9A9A9,
+ 'darkkhaki': 0xBDB76B,
+ 'darkmagenta': 0x8B008B,
+ 'darkolivegreen': 0x556B2F,
+ 'darkorange': 0xFF8C00,
+ 'darkorchid': 0x9932CC,
+ 'darkred': 0x8B0000,
+ 'darksalmon': 0xE9967A,
+ 'darkseagreen': 0x8FBC8F,
+ 'darkslateblue': 0x483D8B,
+ 'darkslategray': 0x2F4F4F,
+ 'darkslategrey': 0x2F4F4F,
+ 'darkturquoise': 0x00CED1,
+ 'darkviolet': 0x9400D3,
+ 'deeppink': 0xFF1493,
+ 'deepskyblue': 0x00BFFF,
+ 'dimgray': 0x696969,
+ 'dimgrey': 0x696969,
+ 'dodgerblue': 0x1E90FF,
+ 'firebrick': 0xB22222,
+ 'floralwhite': 0xFFFAF0,
+ 'forestgreen': 0x228B22,
+ 'fuchsia': 0xFF00FF,
+ 'gainsboro': 0xDCDCDC,
+ 'ghostwhite': 0xF8F8FF,
+ 'gold': 0xFFD700,
+ 'goldenrod': 0xDAA520,
+ 'gray': 0x808080,
+ 'green': 0x008000,
+ 'greenyellow': 0xADFF2F,
+ 'grey': 0x808080,
+ 'honeydew': 0xF0FFF0,
+ 'hotpink': 0xFF69B4,
+ 'indianred': 0xCD5C5C,
+ 'indigo': 0x4B0082,
+ 'ivory': 0xFFFFF0,
+ 'khaki': 0xF0E68C,
+ 'lavender': 0xE6E6FA,
+ 'lavenderblush': 0xFFF0F5,
+ 'lawngreen': 0x7CFC00,
+ 'lemonchiffon': 0xFFFACD,
+ 'lightblue': 0xADD8E6,
+ 'lightcoral': 0xF08080,
+ 'lightcyan': 0xE0FFFF,
+ 'lightgoldenrodyellow': 0xFAFAD2,
+ 'lightgray': 0xD3D3D3,
+ 'lightgreen': 0x90EE90,
+ 'lightgrey': 0xD3D3D3,
+ 'lightpink': 0xFFB6C1,
+ 'lightsalmon': 0xFFA07A,
+ 'lightseagreen': 0x20B2AA,
+ 'lightskyblue': 0x87CEFA,
+ 'lightslategray': 0x778899,
+ 'lightslategrey': 0x778899,
+ 'lightsteelblue': 0xB0C4DE,
+ 'lightyellow': 0xFFFFE0,
+ 'lime': 0x00FF00,
+ 'limegreen': 0x32CD32,
+ 'linen': 0xFAF0E6,
+ 'magenta': 0xFF00FF,
+ 'maroon': 0x800000,
+ 'mediumaquamarine': 0x66CDAA,
+ 'mediumblue': 0x0000CD,
+ 'mediumorchid': 0xBA55D3,
+ 'mediumpurple': 0x9370DB,
+ 'mediumseagreen': 0x3CB371,
+ 'mediumslateblue': 0x7B68EE,
+ 'mediumspringgreen': 0x00FA9A,
+ 'mediumturquoise': 0x48D1CC,
+ 'mediumvioletred': 0xC71585,
+ 'midnightblue': 0x191970,
+ 'mintcream': 0xF5FFFA,
+ 'mistyrose': 0xFFE4E1,
+ 'moccasin': 0xFFE4B5,
+ 'navajowhite': 0xFFDEAD,
+ 'navy': 0x000080,
+ 'oldlace': 0xFDF5E6,
+ 'olive': 0x808000,
+ 'olivedrab': 0x6B8E23,
+ 'orange': 0xFFA500,
+ 'orangered': 0xFF4500,
+ 'orchid': 0xDA70D6,
+ 'palegoldenrod': 0xEEE8AA,
+ 'palegreen': 0x98FB98,
+ 'paleturquoise': 0xAFEEEE,
+ 'palevioletred': 0xDB7093,
+ 'papayawhip': 0xFFEFD5,
+ 'peachpuff': 0xFFDAB9,
+ 'peru': 0xCD853F,
+ 'pink': 0xFFC0CB,
+ 'plum': 0xDDA0DD,
+ 'powderblue': 0xB0E0E6,
+ 'purple': 0x800080,
+ 'rebeccapurple': 0x663399,
+ 'red': 0xFF0000,
+ 'rosybrown': 0xBC8F8F,
+ 'royalblue': 0x4169E1,
+ 'saddlebrown': 0x8B4513,
+ 'salmon': 0xFA8072,
+ 'sandybrown': 0xF4A460,
+ 'seagreen': 0x2E8B57,
+ 'seashell': 0xFFF5EE,
+ 'sienna': 0xA0522D,
+ 'silver': 0xC0C0C0,
+ 'skyblue': 0x87CEEB,
+ 'slateblue': 0x6A5ACD,
+ 'slategray': 0x708090,
+ 'slategrey': 0x708090,
+ 'snow': 0xFFFAFA,
+ 'springgreen': 0x00FF7F,
+ 'steelblue': 0x4682B4,
+ 'tan': 0xD2B48C,
+ 'teal': 0x008080,
+ 'thistle': 0xD8BFD8,
+ 'tomato': 0xFF6347,
+ 'turquoise': 0x40E0D0,
+ 'violet': 0xEE82EE,
+ 'wheat': 0xF5DEB3,
+ 'white': 0xFFFFFF,
+ 'whitesmoke': 0xF5F5F5,
+ 'yellow': 0xFFFF00,
+ 'yellowgreen': 0x9ACD32
+ };
+ var _hslA = {
+ h: 0,
+ s: 0,
+ l: 0
+ };
+ var _hslB = {
+ h: 0,
+ s: 0,
+ l: 0
+ };
- return this;
+ function hue2rgb(p, q, t) {
+ if (t < 0) t += 1;
+ if (t > 1) t -= 1;
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
+ if (t < 1 / 2) return q;
+ if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);
+ return p;
+ }
- },
+ function SRGBToLinear(c) {
+ return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);
+ }
- multiplyScalar: function ( scalar ) {
+ function LinearToSRGB(c) {
+ return c < 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055;
+ }
- this.x *= scalar;
- this.y *= scalar;
- this.z *= scalar;
- this.w *= scalar;
+ var Color = /*#__PURE__*/function () {
+ function Color(r, g, b) {
+ Object.defineProperty(this, 'isColor', {
+ value: true
+ });
- return this;
+ if (g === undefined && b === undefined) {
+ // r is THREE.Color, hex or string
+ return this.set(r);
+ }
- },
+ return this.setRGB(r, g, b);
+ }
- applyMatrix4: function ( m ) {
+ var _proto = Color.prototype;
- var x = this.x;
- var y = this.y;
- var z = this.z;
- var w = this.w;
+ _proto.set = function set(value) {
+ if (value && value.isColor) {
+ this.copy(value);
+ } else if (typeof value === 'number') {
+ this.setHex(value);
+ } else if (typeof value === 'string') {
+ this.setStyle(value);
+ }
- var e = m.elements;
+ return this;
+ };
- this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;
- this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;
- this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;
- this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;
+ _proto.setScalar = function setScalar(scalar) {
+ this.r = scalar;
+ this.g = scalar;
+ this.b = scalar;
+ return this;
+ };
- return this;
+ _proto.setHex = function setHex(hex) {
+ hex = Math.floor(hex);
+ this.r = (hex >> 16 & 255) / 255;
+ this.g = (hex >> 8 & 255) / 255;
+ this.b = (hex & 255) / 255;
+ return this;
+ };
- },
+ _proto.setRGB = function setRGB(r, g, b) {
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ return this;
+ };
- divideScalar: function ( scalar ) {
+ _proto.setHSL = function setHSL(h, s, l) {
+ // h,s,l ranges are in 0.0 - 1.0
+ h = MathUtils.euclideanModulo(h, 1);
+ s = MathUtils.clamp(s, 0, 1);
+ l = MathUtils.clamp(l, 0, 1);
- if ( scalar !== 0 ) {
+ if (s === 0) {
+ this.r = this.g = this.b = l;
+ } else {
+ var p = l <= 0.5 ? l * (1 + s) : l + s - l * s;
+ var q = 2 * l - p;
+ this.r = hue2rgb(q, p, h + 1 / 3);
+ this.g = hue2rgb(q, p, h);
+ this.b = hue2rgb(q, p, h - 1 / 3);
+ }
- var invScalar = 1 / scalar;
+ return this;
+ };
- this.x *= invScalar;
- this.y *= invScalar;
- this.z *= invScalar;
- this.w *= invScalar;
+ _proto.setStyle = function setStyle(style) {
+ function handleAlpha(string) {
+ if (string === undefined) return;
- } else {
+ if (parseFloat(string) < 1) {
+ console.warn('THREE.Color: Alpha component of ' + style + ' will be ignored.');
+ }
+ }
- this.x = 0;
- this.y = 0;
- this.z = 0;
- this.w = 1;
+ var m;
+
+ if (m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)) {
+ // rgb / hsl
+ var color;
+ var name = m[1];
+ var components = m[2];
+
+ switch (name) {
+ case 'rgb':
+ case 'rgba':
+ if (color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)) {
+ // rgb(255,0,0) rgba(255,0,0,0.5)
+ this.r = Math.min(255, parseInt(color[1], 10)) / 255;
+ this.g = Math.min(255, parseInt(color[2], 10)) / 255;
+ this.b = Math.min(255, parseInt(color[3], 10)) / 255;
+ handleAlpha(color[5]);
+ return this;
+ }
- }
+ if (color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)) {
+ // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
+ this.r = Math.min(100, parseInt(color[1], 10)) / 100;
+ this.g = Math.min(100, parseInt(color[2], 10)) / 100;
+ this.b = Math.min(100, parseInt(color[3], 10)) / 100;
+ handleAlpha(color[5]);
+ return this;
+ }
- return this;
+ break;
- },
+ case 'hsl':
+ case 'hsla':
+ if (color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)) {
+ // hsl(120,50%,50%) hsla(120,50%,50%,0.5)
+ var h = parseFloat(color[1]) / 360;
+ var s = parseInt(color[2], 10) / 100;
+ var l = parseInt(color[3], 10) / 100;
+ handleAlpha(color[5]);
+ return this.setHSL(h, s, l);
+ }
- setAxisAngleFromQuaternion: function ( q ) {
+ break;
+ }
+ } else if (m = /^\#([A-Fa-f0-9]+)$/.exec(style)) {
+ // hex color
+ var hex = m[1];
+ var size = hex.length;
+
+ if (size === 3) {
+ // #ff0
+ this.r = parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255;
+ this.g = parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255;
+ this.b = parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255;
+ return this;
+ } else if (size === 6) {
+ // #ff0000
+ this.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;
+ this.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;
+ this.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;
+ return this;
+ }
+ }
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
+ if (style && style.length > 0) {
+ return this.setColorName(style);
+ }
- // q is assumed to be normalized
+ return this;
+ };
- this.w = 2 * Math.acos( q.w );
+ _proto.setColorName = function setColorName(style) {
+ // color keywords
+ var hex = _colorKeywords[style];
- var s = Math.sqrt( 1 - q.w * q.w );
+ if (hex !== undefined) {
+ // red
+ this.setHex(hex);
+ } else {
+ // unknown color
+ console.warn('THREE.Color: Unknown color ' + style);
+ }
- if ( s < 0.0001 ) {
+ return this;
+ };
- this.x = 1;
- this.y = 0;
- this.z = 0;
+ _proto.clone = function clone() {
+ return new this.constructor(this.r, this.g, this.b);
+ };
- } else {
+ _proto.copy = function copy(color) {
+ this.r = color.r;
+ this.g = color.g;
+ this.b = color.b;
+ return this;
+ };
- this.x = q.x / s;
- this.y = q.y / s;
- this.z = q.z / s;
+ _proto.copyGammaToLinear = function copyGammaToLinear(color, gammaFactor) {
+ if (gammaFactor === undefined) gammaFactor = 2.0;
+ this.r = Math.pow(color.r, gammaFactor);
+ this.g = Math.pow(color.g, gammaFactor);
+ this.b = Math.pow(color.b, gammaFactor);
+ return this;
+ };
- }
+ _proto.copyLinearToGamma = function copyLinearToGamma(color, gammaFactor) {
+ if (gammaFactor === undefined) gammaFactor = 2.0;
+ var safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0;
+ this.r = Math.pow(color.r, safeInverse);
+ this.g = Math.pow(color.g, safeInverse);
+ this.b = Math.pow(color.b, safeInverse);
+ return this;
+ };
- return this;
+ _proto.convertGammaToLinear = function convertGammaToLinear(gammaFactor) {
+ this.copyGammaToLinear(this, gammaFactor);
+ return this;
+ };
- },
+ _proto.convertLinearToGamma = function convertLinearToGamma(gammaFactor) {
+ this.copyLinearToGamma(this, gammaFactor);
+ return this;
+ };
- setAxisAngleFromRotationMatrix: function ( m ) {
+ _proto.copySRGBToLinear = function copySRGBToLinear(color) {
+ this.r = SRGBToLinear(color.r);
+ this.g = SRGBToLinear(color.g);
+ this.b = SRGBToLinear(color.b);
+ return this;
+ };
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
+ _proto.copyLinearToSRGB = function copyLinearToSRGB(color) {
+ this.r = LinearToSRGB(color.r);
+ this.g = LinearToSRGB(color.g);
+ this.b = LinearToSRGB(color.b);
+ return this;
+ };
- // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+ _proto.convertSRGBToLinear = function convertSRGBToLinear() {
+ this.copySRGBToLinear(this);
+ return this;
+ };
- var angle, x, y, z, // variables for result
- epsilon = 0.01, // margin to allow for rounding errors
- epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees
+ _proto.convertLinearToSRGB = function convertLinearToSRGB() {
+ this.copyLinearToSRGB(this);
+ return this;
+ };
- te = m.elements,
+ _proto.getHex = function getHex() {
+ return this.r * 255 << 16 ^ this.g * 255 << 8 ^ this.b * 255 << 0;
+ };
- m11 = te[0], m12 = te[4], m13 = te[8],
- m21 = te[1], m22 = te[5], m23 = te[9],
- m31 = te[2], m32 = te[6], m33 = te[10];
+ _proto.getHexString = function getHexString() {
+ return ('000000' + this.getHex().toString(16)).slice(-6);
+ };
- if ( ( Math.abs( m12 - m21 ) < epsilon )
- && ( Math.abs( m13 - m31 ) < epsilon )
- && ( Math.abs( m23 - m32 ) < epsilon ) ) {
+ _proto.getHSL = function getHSL(target) {
+ // h,s,l ranges are in 0.0 - 1.0
+ if (target === undefined) {
+ console.warn('THREE.Color: .getHSL() target is now required');
+ target = {
+ h: 0,
+ s: 0,
+ l: 0
+ };
+ }
- // singularity found
- // first check for identity matrix which must have +1 for all terms
- // in leading diagonal and zero in other terms
+ var r = this.r,
+ g = this.g,
+ b = this.b;
+ var max = Math.max(r, g, b);
+ var min = Math.min(r, g, b);
+ var hue, saturation;
+ var lightness = (min + max) / 2.0;
- if ( ( Math.abs( m12 + m21 ) < epsilon2 )
- && ( Math.abs( m13 + m31 ) < epsilon2 )
- && ( Math.abs( m23 + m32 ) < epsilon2 )
- && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
+ if (min === max) {
+ hue = 0;
+ saturation = 0;
+ } else {
+ var delta = max - min;
+ saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min);
- // this singularity is identity matrix so angle = 0
+ switch (max) {
+ case r:
+ hue = (g - b) / delta + (g < b ? 6 : 0);
+ break;
- this.set( 1, 0, 0, 0 );
+ case g:
+ hue = (b - r) / delta + 2;
+ break;
- return this; // zero angle, arbitrary axis
+ case b:
+ hue = (r - g) / delta + 4;
+ break;
+ }
+ hue /= 6;
}
- // otherwise this singularity is angle = 180
-
- angle = Math.PI;
+ target.h = hue;
+ target.s = saturation;
+ target.l = lightness;
+ return target;
+ };
- var xx = ( m11 + 1 ) / 2;
- var yy = ( m22 + 1 ) / 2;
- var zz = ( m33 + 1 ) / 2;
- var xy = ( m12 + m21 ) / 4;
- var xz = ( m13 + m31 ) / 4;
- var yz = ( m23 + m32 ) / 4;
+ _proto.getStyle = function getStyle() {
+ return 'rgb(' + (this.r * 255 | 0) + ',' + (this.g * 255 | 0) + ',' + (this.b * 255 | 0) + ')';
+ };
- if ( ( xx > yy ) && ( xx > zz ) ) { // m11 is the largest diagonal term
+ _proto.offsetHSL = function offsetHSL(h, s, l) {
+ this.getHSL(_hslA);
+ _hslA.h += h;
+ _hslA.s += s;
+ _hslA.l += l;
+ this.setHSL(_hslA.h, _hslA.s, _hslA.l);
+ return this;
+ };
- if ( xx < epsilon ) {
+ _proto.add = function add(color) {
+ this.r += color.r;
+ this.g += color.g;
+ this.b += color.b;
+ return this;
+ };
- x = 0;
- y = 0.707106781;
- z = 0.707106781;
+ _proto.addColors = function addColors(color1, color2) {
+ this.r = color1.r + color2.r;
+ this.g = color1.g + color2.g;
+ this.b = color1.b + color2.b;
+ return this;
+ };
- } else {
+ _proto.addScalar = function addScalar(s) {
+ this.r += s;
+ this.g += s;
+ this.b += s;
+ return this;
+ };
- x = Math.sqrt( xx );
- y = xy / x;
- z = xz / x;
+ _proto.sub = function sub(color) {
+ this.r = Math.max(0, this.r - color.r);
+ this.g = Math.max(0, this.g - color.g);
+ this.b = Math.max(0, this.b - color.b);
+ return this;
+ };
- }
+ _proto.multiply = function multiply(color) {
+ this.r *= color.r;
+ this.g *= color.g;
+ this.b *= color.b;
+ return this;
+ };
- } else if ( yy > zz ) { // m22 is the largest diagonal term
+ _proto.multiplyScalar = function multiplyScalar(s) {
+ this.r *= s;
+ this.g *= s;
+ this.b *= s;
+ return this;
+ };
- if ( yy < epsilon ) {
+ _proto.lerp = function lerp(color, alpha) {
+ this.r += (color.r - this.r) * alpha;
+ this.g += (color.g - this.g) * alpha;
+ this.b += (color.b - this.b) * alpha;
+ return this;
+ };
- x = 0.707106781;
- y = 0;
- z = 0.707106781;
+ _proto.lerpHSL = function lerpHSL(color, alpha) {
+ this.getHSL(_hslA);
+ color.getHSL(_hslB);
+ var h = MathUtils.lerp(_hslA.h, _hslB.h, alpha);
+ var s = MathUtils.lerp(_hslA.s, _hslB.s, alpha);
+ var l = MathUtils.lerp(_hslA.l, _hslB.l, alpha);
+ this.setHSL(h, s, l);
+ return this;
+ };
- } else {
+ _proto.equals = function equals(c) {
+ return c.r === this.r && c.g === this.g && c.b === this.b;
+ };
- y = Math.sqrt( yy );
- x = xy / y;
- z = yz / y;
+ _proto.fromArray = function fromArray(array, offset) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- }
+ this.r = array[offset];
+ this.g = array[offset + 1];
+ this.b = array[offset + 2];
+ return this;
+ };
- } else { // m33 is the largest diagonal term so base result on this
+ _proto.toArray = function toArray(array, offset) {
+ if (array === void 0) {
+ array = [];
+ }
- if ( zz < epsilon ) {
+ if (offset === void 0) {
+ offset = 0;
+ }
- x = 0.707106781;
- y = 0.707106781;
- z = 0;
+ array[offset] = this.r;
+ array[offset + 1] = this.g;
+ array[offset + 2] = this.b;
+ return array;
+ };
- } else {
+ _proto.fromBufferAttribute = function fromBufferAttribute(attribute, index) {
+ this.r = attribute.getX(index);
+ this.g = attribute.getY(index);
+ this.b = attribute.getZ(index);
- z = Math.sqrt( zz );
- x = xz / z;
- y = yz / z;
+ if (attribute.normalized === true) {
+ // assuming Uint8Array
+ this.r /= 255;
+ this.g /= 255;
+ this.b /= 255;
+ }
- }
+ return this;
+ };
- }
+ _proto.toJSON = function toJSON() {
+ return this.getHex();
+ };
- this.set( x, y, z, angle );
+ return Color;
+ }();
- return this; // return 180 deg rotation
+ Color.NAMES = _colorKeywords;
+ Color.prototype.r = 1;
+ Color.prototype.g = 1;
+ Color.prototype.b = 1;
+ var Face3 = /*#__PURE__*/function () {
+ function Face3(a, b, c, normal, color, materialIndex) {
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.normal = normal && normal.isVector3 ? normal : new Vector3();
+ this.vertexNormals = Array.isArray(normal) ? normal : [];
+ this.color = color && color.isColor ? color : new Color();
+ this.vertexColors = Array.isArray(color) ? color : [];
+ this.materialIndex = materialIndex !== undefined ? materialIndex : 0;
}
- // as we have reached here there are no singularities so we can handle normally
+ var _proto = Face3.prototype;
- var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 )
- + ( m13 - m31 ) * ( m13 - m31 )
- + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
+ };
- if ( Math.abs( s ) < 0.001 ) s = 1;
+ _proto.copy = function copy(source) {
+ this.a = source.a;
+ this.b = source.b;
+ this.c = source.c;
+ this.normal.copy(source.normal);
+ this.color.copy(source.color);
+ this.materialIndex = source.materialIndex;
- // prevent divide by zero, should not happen if matrix is orthogonal and should be
- // caught by singularity test above, but I've left it in just in case
+ for (var i = 0, il = source.vertexNormals.length; i < il; i++) {
+ this.vertexNormals[i] = source.vertexNormals[i].clone();
+ }
- this.x = ( m32 - m23 ) / s;
- this.y = ( m13 - m31 ) / s;
- this.z = ( m21 - m12 ) / s;
- this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
+ for (var _i = 0, _il = source.vertexColors.length; _i < _il; _i++) {
+ this.vertexColors[_i] = source.vertexColors[_i].clone();
+ }
- return this;
+ return this;
+ };
- },
+ return Face3;
+ }();
- min: function ( v ) {
+ var materialId = 0;
+
+ function Material() {
+ Object.defineProperty(this, 'id', {
+ value: materialId++
+ });
+ this.uuid = MathUtils.generateUUID();
+ this.name = '';
+ this.type = 'Material';
+ this.fog = true;
+ this.blending = NormalBlending;
+ this.side = FrontSide;
+ this.flatShading = false;
+ this.vertexColors = false;
+ this.opacity = 1;
+ this.transparent = false;
+ this.blendSrc = SrcAlphaFactor;
+ this.blendDst = OneMinusSrcAlphaFactor;
+ this.blendEquation = AddEquation;
+ this.blendSrcAlpha = null;
+ this.blendDstAlpha = null;
+ this.blendEquationAlpha = null;
+ this.depthFunc = LessEqualDepth;
+ this.depthTest = true;
+ this.depthWrite = true;
+ this.stencilWriteMask = 0xff;
+ this.stencilFunc = AlwaysStencilFunc;
+ this.stencilRef = 0;
+ this.stencilFuncMask = 0xff;
+ this.stencilFail = KeepStencilOp;
+ this.stencilZFail = KeepStencilOp;
+ this.stencilZPass = KeepStencilOp;
+ this.stencilWrite = false;
+ this.clippingPlanes = null;
+ this.clipIntersection = false;
+ this.clipShadows = false;
+ this.shadowSide = null;
+ this.colorWrite = true;
+ this.precision = null; // override the renderer's default precision for this material
+
+ this.polygonOffset = false;
+ this.polygonOffsetFactor = 0;
+ this.polygonOffsetUnits = 0;
+ this.dithering = false;
+ this.alphaTest = 0;
+ this.premultipliedAlpha = false;
+ this.visible = true;
+ this.toneMapped = true;
+ this.userData = {};
+ this.version = 0;
+ }
+
+ Material.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
+ constructor: Material,
+ isMaterial: true,
+ onBeforeCompile: function onBeforeCompile()
+ /* shaderobject, renderer */
+ {},
+ customProgramCacheKey: function customProgramCacheKey() {
+ return this.onBeforeCompile.toString();
+ },
+ setValues: function setValues(values) {
+ if (values === undefined) return;
- if ( this.x > v.x ) {
+ for (var key in values) {
+ var newValue = values[key];
- this.x = v.x;
+ if (newValue === undefined) {
+ console.warn("THREE.Material: '" + key + "' parameter is undefined.");
+ continue;
+ } // for backward compatability if shading is set in the constructor
- }
- if ( this.y > v.y ) {
+ if (key === 'shading') {
+ console.warn('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
+ this.flatShading = newValue === FlatShading ? true : false;
+ continue;
+ }
- this.y = v.y;
+ var currentValue = this[key];
- }
+ if (currentValue === undefined) {
+ console.warn("THREE." + this.type + ": '" + key + "' is not a property of this material.");
+ continue;
+ }
- if ( this.z > v.z ) {
+ if (currentValue && currentValue.isColor) {
+ currentValue.set(newValue);
+ } else if (currentValue && currentValue.isVector3 && newValue && newValue.isVector3) {
+ currentValue.copy(newValue);
+ } else {
+ this[key] = newValue;
+ }
+ }
+ },
+ toJSON: function toJSON(meta) {
+ var isRoot = meta === undefined || typeof meta === 'string';
- this.z = v.z;
+ if (isRoot) {
+ meta = {
+ textures: {},
+ images: {}
+ };
+ }
- }
+ var data = {
+ metadata: {
+ version: 4.5,
+ type: 'Material',
+ generator: 'Material.toJSON'
+ }
+ }; // standard Material serialization
+
+ data.uuid = this.uuid;
+ data.type = this.type;
+ if (this.name !== '') data.name = this.name;
+ if (this.color && this.color.isColor) data.color = this.color.getHex();
+ if (this.roughness !== undefined) data.roughness = this.roughness;
+ if (this.metalness !== undefined) data.metalness = this.metalness;
+ if (this.sheen && this.sheen.isColor) data.sheen = this.sheen.getHex();
+ if (this.emissive && this.emissive.isColor) data.emissive = this.emissive.getHex();
+ if (this.emissiveIntensity && this.emissiveIntensity !== 1) data.emissiveIntensity = this.emissiveIntensity;
+ if (this.specular && this.specular.isColor) data.specular = this.specular.getHex();
+ if (this.shininess !== undefined) data.shininess = this.shininess;
+ if (this.clearcoat !== undefined) data.clearcoat = this.clearcoat;
+ if (this.clearcoatRoughness !== undefined) data.clearcoatRoughness = this.clearcoatRoughness;
+
+ if (this.clearcoatMap && this.clearcoatMap.isTexture) {
+ data.clearcoatMap = this.clearcoatMap.toJSON(meta).uuid;
+ }
+
+ if (this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture) {
+ data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(meta).uuid;
+ }
+
+ if (this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture) {
+ data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(meta).uuid;
+ data.clearcoatNormalScale = this.clearcoatNormalScale.toArray();
+ }
+
+ if (this.map && this.map.isTexture) data.map = this.map.toJSON(meta).uuid;
+ if (this.matcap && this.matcap.isTexture) data.matcap = this.matcap.toJSON(meta).uuid;
+ if (this.alphaMap && this.alphaMap.isTexture) data.alphaMap = this.alphaMap.toJSON(meta).uuid;
+ if (this.lightMap && this.lightMap.isTexture) data.lightMap = this.lightMap.toJSON(meta).uuid;
+
+ if (this.aoMap && this.aoMap.isTexture) {
+ data.aoMap = this.aoMap.toJSON(meta).uuid;
+ data.aoMapIntensity = this.aoMapIntensity;
+ }
+
+ if (this.bumpMap && this.bumpMap.isTexture) {
+ data.bumpMap = this.bumpMap.toJSON(meta).uuid;
+ data.bumpScale = this.bumpScale;
+ }
+
+ if (this.normalMap && this.normalMap.isTexture) {
+ data.normalMap = this.normalMap.toJSON(meta).uuid;
+ data.normalMapType = this.normalMapType;
+ data.normalScale = this.normalScale.toArray();
+ }
+
+ if (this.displacementMap && this.displacementMap.isTexture) {
+ data.displacementMap = this.displacementMap.toJSON(meta).uuid;
+ data.displacementScale = this.displacementScale;
+ data.displacementBias = this.displacementBias;
+ }
+
+ if (this.roughnessMap && this.roughnessMap.isTexture) data.roughnessMap = this.roughnessMap.toJSON(meta).uuid;
+ if (this.metalnessMap && this.metalnessMap.isTexture) data.metalnessMap = this.metalnessMap.toJSON(meta).uuid;
+ if (this.emissiveMap && this.emissiveMap.isTexture) data.emissiveMap = this.emissiveMap.toJSON(meta).uuid;
+ if (this.specularMap && this.specularMap.isTexture) data.specularMap = this.specularMap.toJSON(meta).uuid;
+
+ if (this.envMap && this.envMap.isTexture) {
+ data.envMap = this.envMap.toJSON(meta).uuid;
+ data.reflectivity = this.reflectivity; // Scale behind envMap
+
+ data.refractionRatio = this.refractionRatio;
+ if (this.combine !== undefined) data.combine = this.combine;
+ if (this.envMapIntensity !== undefined) data.envMapIntensity = this.envMapIntensity;
+ }
+
+ if (this.gradientMap && this.gradientMap.isTexture) {
+ data.gradientMap = this.gradientMap.toJSON(meta).uuid;
+ }
+
+ if (this.size !== undefined) data.size = this.size;
+ if (this.sizeAttenuation !== undefined) data.sizeAttenuation = this.sizeAttenuation;
+ if (this.blending !== NormalBlending) data.blending = this.blending;
+ if (this.flatShading === true) data.flatShading = this.flatShading;
+ if (this.side !== FrontSide) data.side = this.side;
+ if (this.vertexColors) data.vertexColors = true;
+ if (this.opacity < 1) data.opacity = this.opacity;
+ if (this.transparent === true) data.transparent = this.transparent;
+ data.depthFunc = this.depthFunc;
+ data.depthTest = this.depthTest;
+ data.depthWrite = this.depthWrite;
+ data.stencilWrite = this.stencilWrite;
+ data.stencilWriteMask = this.stencilWriteMask;
+ data.stencilFunc = this.stencilFunc;
+ data.stencilRef = this.stencilRef;
+ data.stencilFuncMask = this.stencilFuncMask;
+ data.stencilFail = this.stencilFail;
+ data.stencilZFail = this.stencilZFail;
+ data.stencilZPass = this.stencilZPass; // rotation (SpriteMaterial)
+
+ if (this.rotation && this.rotation !== 0) data.rotation = this.rotation;
+ if (this.polygonOffset === true) data.polygonOffset = true;
+ if (this.polygonOffsetFactor !== 0) data.polygonOffsetFactor = this.polygonOffsetFactor;
+ if (this.polygonOffsetUnits !== 0) data.polygonOffsetUnits = this.polygonOffsetUnits;
+ if (this.linewidth && this.linewidth !== 1) data.linewidth = this.linewidth;
+ if (this.dashSize !== undefined) data.dashSize = this.dashSize;
+ if (this.gapSize !== undefined) data.gapSize = this.gapSize;
+ if (this.scale !== undefined) data.scale = this.scale;
+ if (this.dithering === true) data.dithering = true;
+ if (this.alphaTest > 0) data.alphaTest = this.alphaTest;
+ if (this.premultipliedAlpha === true) data.premultipliedAlpha = this.premultipliedAlpha;
+ if (this.wireframe === true) data.wireframe = this.wireframe;
+ if (this.wireframeLinewidth > 1) data.wireframeLinewidth = this.wireframeLinewidth;
+ if (this.wireframeLinecap !== 'round') data.wireframeLinecap = this.wireframeLinecap;
+ if (this.wireframeLinejoin !== 'round') data.wireframeLinejoin = this.wireframeLinejoin;
+ if (this.morphTargets === true) data.morphTargets = true;
+ if (this.morphNormals === true) data.morphNormals = true;
+ if (this.skinning === true) data.skinning = true;
+ if (this.visible === false) data.visible = false;
+ if (this.toneMapped === false) data.toneMapped = false;
+ if (JSON.stringify(this.userData) !== '{}') data.userData = this.userData; // TODO: Copied from Object3D.toJSON
+
+ function extractFromCache(cache) {
+ var values = [];
+
+ for (var key in cache) {
+ var _data = cache[key];
+ delete _data.metadata;
+ values.push(_data);
+ }
- if ( this.w > v.w ) {
+ return values;
+ }
- this.w = v.w;
+ if (isRoot) {
+ var textures = extractFromCache(meta.textures);
+ var images = extractFromCache(meta.images);
+ if (textures.length > 0) data.textures = textures;
+ if (images.length > 0) data.images = images;
+ }
- }
+ return data;
+ },
+ clone: function clone() {
+ return new this.constructor().copy(this);
+ },
+ copy: function copy(source) {
+ this.name = source.name;
+ this.fog = source.fog;
+ this.blending = source.blending;
+ this.side = source.side;
+ this.flatShading = source.flatShading;
+ this.vertexColors = source.vertexColors;
+ this.opacity = source.opacity;
+ this.transparent = source.transparent;
+ this.blendSrc = source.blendSrc;
+ this.blendDst = source.blendDst;
+ this.blendEquation = source.blendEquation;
+ this.blendSrcAlpha = source.blendSrcAlpha;
+ this.blendDstAlpha = source.blendDstAlpha;
+ this.blendEquationAlpha = source.blendEquationAlpha;
+ this.depthFunc = source.depthFunc;
+ this.depthTest = source.depthTest;
+ this.depthWrite = source.depthWrite;
+ this.stencilWriteMask = source.stencilWriteMask;
+ this.stencilFunc = source.stencilFunc;
+ this.stencilRef = source.stencilRef;
+ this.stencilFuncMask = source.stencilFuncMask;
+ this.stencilFail = source.stencilFail;
+ this.stencilZFail = source.stencilZFail;
+ this.stencilZPass = source.stencilZPass;
+ this.stencilWrite = source.stencilWrite;
+ var srcPlanes = source.clippingPlanes;
+ var dstPlanes = null;
+
+ if (srcPlanes !== null) {
+ var n = srcPlanes.length;
+ dstPlanes = new Array(n);
+
+ for (var i = 0; i !== n; ++i) {
+ dstPlanes[i] = srcPlanes[i].clone();
+ }
+ }
- return this;
+ this.clippingPlanes = dstPlanes;
+ this.clipIntersection = source.clipIntersection;
+ this.clipShadows = source.clipShadows;
+ this.shadowSide = source.shadowSide;
+ this.colorWrite = source.colorWrite;
+ this.precision = source.precision;
+ this.polygonOffset = source.polygonOffset;
+ this.polygonOffsetFactor = source.polygonOffsetFactor;
+ this.polygonOffsetUnits = source.polygonOffsetUnits;
+ this.dithering = source.dithering;
+ this.alphaTest = source.alphaTest;
+ this.premultipliedAlpha = source.premultipliedAlpha;
+ this.visible = source.visible;
+ this.toneMapped = source.toneMapped;
+ this.userData = JSON.parse(JSON.stringify(source.userData));
+ return this;
+ },
+ dispose: function dispose() {
+ this.dispatchEvent({
+ type: 'dispose'
+ });
+ }
+ });
+ Object.defineProperty(Material.prototype, 'needsUpdate', {
+ set: function set(value) {
+ if (value === true) this.version++;
+ }
+ });
- },
+ /**
+ * parameters = {
+ * color: ,
+ * opacity: ,
+ * map: new THREE.Texture( ),
+ *
+ * lightMap: new THREE.Texture( ),
+ * lightMapIntensity:
+ *
+ * aoMap: new THREE.Texture( ),
+ * aoMapIntensity:
+ *
+ * specularMap: new THREE.Texture( ),
+ *
+ * alphaMap: new THREE.Texture( ),
+ *
+ * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
+ * combine: THREE.Multiply,
+ * reflectivity: ,
+ * refractionRatio: ,
+ *
+ * depthTest: ,
+ * depthWrite: ,
+ *
+ * wireframe: ,
+ * wireframeLinewidth: ,
+ *
+ * skinning: ,
+ * morphTargets:
+ * }
+ */
- max: function ( v ) {
+ function MeshBasicMaterial(parameters) {
+ Material.call(this);
+ this.type = 'MeshBasicMaterial';
+ this.color = new Color(0xffffff); // emissive
+
+ this.map = null;
+ this.lightMap = null;
+ this.lightMapIntensity = 1.0;
+ this.aoMap = null;
+ this.aoMapIntensity = 1.0;
+ this.specularMap = null;
+ this.alphaMap = null;
+ this.envMap = null;
+ this.combine = MultiplyOperation;
+ this.reflectivity = 1;
+ this.refractionRatio = 0.98;
+ this.wireframe = false;
+ this.wireframeLinewidth = 1;
+ this.wireframeLinecap = 'round';
+ this.wireframeLinejoin = 'round';
+ this.skinning = false;
+ this.morphTargets = false;
+ this.setValues(parameters);
+ }
+
+ MeshBasicMaterial.prototype = Object.create(Material.prototype);
+ MeshBasicMaterial.prototype.constructor = MeshBasicMaterial;
+ MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
+
+ MeshBasicMaterial.prototype.copy = function (source) {
+ Material.prototype.copy.call(this, source);
+ this.color.copy(source.color);
+ this.map = source.map;
+ this.lightMap = source.lightMap;
+ this.lightMapIntensity = source.lightMapIntensity;
+ this.aoMap = source.aoMap;
+ this.aoMapIntensity = source.aoMapIntensity;
+ this.specularMap = source.specularMap;
+ this.alphaMap = source.alphaMap;
+ this.envMap = source.envMap;
+ this.combine = source.combine;
+ this.reflectivity = source.reflectivity;
+ this.refractionRatio = source.refractionRatio;
+ this.wireframe = source.wireframe;
+ this.wireframeLinewidth = source.wireframeLinewidth;
+ this.wireframeLinecap = source.wireframeLinecap;
+ this.wireframeLinejoin = source.wireframeLinejoin;
+ this.skinning = source.skinning;
+ this.morphTargets = source.morphTargets;
+ return this;
+ };
- if ( this.x < v.x ) {
+ var _vector$3 = new Vector3();
- this.x = v.x;
+ var _vector2$1 = new Vector2();
+ function BufferAttribute(array, itemSize, normalized) {
+ if (Array.isArray(array)) {
+ throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
}
- if ( this.y < v.y ) {
-
- this.y = v.y;
+ this.name = '';
+ this.array = array;
+ this.itemSize = itemSize;
+ this.count = array !== undefined ? array.length / itemSize : 0;
+ this.normalized = normalized === true;
+ this.usage = StaticDrawUsage;
+ this.updateRange = {
+ offset: 0,
+ count: -1
+ };
+ this.version = 0;
+ }
+ Object.defineProperty(BufferAttribute.prototype, 'needsUpdate', {
+ set: function set(value) {
+ if (value === true) this.version++;
}
+ });
+ Object.assign(BufferAttribute.prototype, {
+ isBufferAttribute: true,
+ onUploadCallback: function onUploadCallback() {},
+ setUsage: function setUsage(value) {
+ this.usage = value;
+ return this;
+ },
+ copy: function copy(source) {
+ this.name = source.name;
+ this.array = new source.array.constructor(source.array);
+ this.itemSize = source.itemSize;
+ this.count = source.count;
+ this.normalized = source.normalized;
+ this.usage = source.usage;
+ return this;
+ },
+ copyAt: function copyAt(index1, attribute, index2) {
+ index1 *= this.itemSize;
+ index2 *= attribute.itemSize;
- if ( this.z < v.z ) {
+ for (var i = 0, l = this.itemSize; i < l; i++) {
+ this.array[index1 + i] = attribute.array[index2 + i];
+ }
- this.z = v.z;
+ return this;
+ },
+ copyArray: function copyArray(array) {
+ this.array.set(array);
+ return this;
+ },
+ copyColorsArray: function copyColorsArray(colors) {
+ var array = this.array;
+ var offset = 0;
- }
+ for (var i = 0, l = colors.length; i < l; i++) {
+ var color = colors[i];
- if ( this.w < v.w ) {
+ if (color === undefined) {
+ console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined', i);
+ color = new Color();
+ }
- this.w = v.w;
+ array[offset++] = color.r;
+ array[offset++] = color.g;
+ array[offset++] = color.b;
+ }
- }
+ return this;
+ },
+ copyVector2sArray: function copyVector2sArray(vectors) {
+ var array = this.array;
+ var offset = 0;
- return this;
+ for (var i = 0, l = vectors.length; i < l; i++) {
+ var vector = vectors[i];
- },
+ if (vector === undefined) {
+ console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i);
+ vector = new Vector2();
+ }
- clamp: function ( min, max ) {
-
- // This function assumes min < max, if this assumption isn't true it will not operate correctly
-
- if ( this.x < min.x ) {
-
- this.x = min.x;
-
- } else if ( this.x > max.x ) {
-
- this.x = max.x;
-
- }
-
- if ( this.y < min.y ) {
+ array[offset++] = vector.x;
+ array[offset++] = vector.y;
+ }
- this.y = min.y;
+ return this;
+ },
+ copyVector3sArray: function copyVector3sArray(vectors) {
+ var array = this.array;
+ var offset = 0;
- } else if ( this.y > max.y ) {
+ for (var i = 0, l = vectors.length; i < l; i++) {
+ var vector = vectors[i];
- this.y = max.y;
+ if (vector === undefined) {
+ console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i);
+ vector = new Vector3();
+ }
- }
+ array[offset++] = vector.x;
+ array[offset++] = vector.y;
+ array[offset++] = vector.z;
+ }
- if ( this.z < min.z ) {
+ return this;
+ },
+ copyVector4sArray: function copyVector4sArray(vectors) {
+ var array = this.array;
+ var offset = 0;
- this.z = min.z;
+ for (var i = 0, l = vectors.length; i < l; i++) {
+ var vector = vectors[i];
- } else if ( this.z > max.z ) {
+ if (vector === undefined) {
+ console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i);
+ vector = new Vector4();
+ }
- this.z = max.z;
+ array[offset++] = vector.x;
+ array[offset++] = vector.y;
+ array[offset++] = vector.z;
+ array[offset++] = vector.w;
+ }
- }
+ return this;
+ },
+ applyMatrix3: function applyMatrix3(m) {
+ if (this.itemSize === 2) {
+ for (var i = 0, l = this.count; i < l; i++) {
+ _vector2$1.fromBufferAttribute(this, i);
- if ( this.w < min.w ) {
+ _vector2$1.applyMatrix3(m);
- this.w = min.w;
+ this.setXY(i, _vector2$1.x, _vector2$1.y);
+ }
+ } else if (this.itemSize === 3) {
+ for (var _i = 0, _l = this.count; _i < _l; _i++) {
+ _vector$3.fromBufferAttribute(this, _i);
- } else if ( this.w > max.w ) {
+ _vector$3.applyMatrix3(m);
- this.w = max.w;
+ this.setXYZ(_i, _vector$3.x, _vector$3.y, _vector$3.z);
+ }
+ }
- }
+ return this;
+ },
+ applyMatrix4: function applyMatrix4(m) {
+ for (var i = 0, l = this.count; i < l; i++) {
+ _vector$3.x = this.getX(i);
+ _vector$3.y = this.getY(i);
+ _vector$3.z = this.getZ(i);
- return this;
+ _vector$3.applyMatrix4(m);
- },
+ this.setXYZ(i, _vector$3.x, _vector$3.y, _vector$3.z);
+ }
- clampScalar: ( function () {
+ return this;
+ },
+ applyNormalMatrix: function applyNormalMatrix(m) {
+ for (var i = 0, l = this.count; i < l; i++) {
+ _vector$3.x = this.getX(i);
+ _vector$3.y = this.getY(i);
+ _vector$3.z = this.getZ(i);
- var min, max;
+ _vector$3.applyNormalMatrix(m);
- return function ( minVal, maxVal ) {
+ this.setXYZ(i, _vector$3.x, _vector$3.y, _vector$3.z);
+ }
- if ( min === undefined ) {
+ return this;
+ },
+ transformDirection: function transformDirection(m) {
+ for (var i = 0, l = this.count; i < l; i++) {
+ _vector$3.x = this.getX(i);
+ _vector$3.y = this.getY(i);
+ _vector$3.z = this.getZ(i);
- min = new THREE.Vector4();
- max = new THREE.Vector4();
+ _vector$3.transformDirection(m);
+ this.setXYZ(i, _vector$3.x, _vector$3.y, _vector$3.z);
}
- min.set( minVal, minVal, minVal, minVal );
- max.set( maxVal, maxVal, maxVal, maxVal );
+ return this;
+ },
+ set: function set(value, offset) {
+ if (offset === undefined) offset = 0;
+ this.array.set(value, offset);
+ return this;
+ },
+ getX: function getX(index) {
+ return this.array[index * this.itemSize];
+ },
+ setX: function setX(index, x) {
+ this.array[index * this.itemSize] = x;
+ return this;
+ },
+ getY: function getY(index) {
+ return this.array[index * this.itemSize + 1];
+ },
+ setY: function setY(index, y) {
+ this.array[index * this.itemSize + 1] = y;
+ return this;
+ },
+ getZ: function getZ(index) {
+ return this.array[index * this.itemSize + 2];
+ },
+ setZ: function setZ(index, z) {
+ this.array[index * this.itemSize + 2] = z;
+ return this;
+ },
+ getW: function getW(index) {
+ return this.array[index * this.itemSize + 3];
+ },
+ setW: function setW(index, w) {
+ this.array[index * this.itemSize + 3] = w;
+ return this;
+ },
+ setXY: function setXY(index, x, y) {
+ index *= this.itemSize;
+ this.array[index + 0] = x;
+ this.array[index + 1] = y;
+ return this;
+ },
+ setXYZ: function setXYZ(index, x, y, z) {
+ index *= this.itemSize;
+ this.array[index + 0] = x;
+ this.array[index + 1] = y;
+ this.array[index + 2] = z;
+ return this;
+ },
+ setXYZW: function setXYZW(index, x, y, z, w) {
+ index *= this.itemSize;
+ this.array[index + 0] = x;
+ this.array[index + 1] = y;
+ this.array[index + 2] = z;
+ this.array[index + 3] = w;
+ return this;
+ },
+ onUpload: function onUpload(callback) {
+ this.onUploadCallback = callback;
+ return this;
+ },
+ clone: function clone() {
+ return new this.constructor(this.array, this.itemSize).copy(this);
+ },
+ toJSON: function toJSON() {
+ return {
+ itemSize: this.itemSize,
+ type: this.array.constructor.name,
+ array: Array.prototype.slice.call(this.array),
+ normalized: this.normalized
+ };
+ }
+ }); //
- return this.clamp( min, max );
+ function Int8BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Int8Array(array), itemSize, normalized);
+ }
- };
+ Int8BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Int8BufferAttribute.prototype.constructor = Int8BufferAttribute;
- } )(),
+ function Uint8BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Uint8Array(array), itemSize, normalized);
+ }
- floor: function () {
+ Uint8BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;
- this.x = Math.floor( this.x );
- this.y = Math.floor( this.y );
- this.z = Math.floor( this.z );
- this.w = Math.floor( this.w );
+ function Uint8ClampedBufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Uint8ClampedArray(array), itemSize, normalized);
+ }
- return this;
+ Uint8ClampedBufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;
- },
+ function Int16BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Int16Array(array), itemSize, normalized);
+ }
- ceil: function () {
+ Int16BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Int16BufferAttribute.prototype.constructor = Int16BufferAttribute;
- this.x = Math.ceil( this.x );
- this.y = Math.ceil( this.y );
- this.z = Math.ceil( this.z );
- this.w = Math.ceil( this.w );
+ function Uint16BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Uint16Array(array), itemSize, normalized);
+ }
- return this;
+ Uint16BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;
- },
+ function Int32BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Int32Array(array), itemSize, normalized);
+ }
- round: function () {
+ Int32BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Int32BufferAttribute.prototype.constructor = Int32BufferAttribute;
- this.x = Math.round( this.x );
- this.y = Math.round( this.y );
- this.z = Math.round( this.z );
- this.w = Math.round( this.w );
+ function Uint32BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Uint32Array(array), itemSize, normalized);
+ }
- return this;
+ Uint32BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;
- },
+ function Float32BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Float32Array(array), itemSize, normalized);
+ }
- roundToZero: function () {
+ Float32BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Float32BufferAttribute.prototype.constructor = Float32BufferAttribute;
- 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 );
- this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
- this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );
+ function Float64BufferAttribute(array, itemSize, normalized) {
+ BufferAttribute.call(this, new Float64Array(array), itemSize, normalized);
+ }
- return this;
+ Float64BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
+ Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; //
- },
+ var DirectGeometry = /*#__PURE__*/function () {
+ function DirectGeometry() {
+ this.vertices = [];
+ this.normals = [];
+ this.colors = [];
+ this.uvs = [];
+ this.uvs2 = [];
+ this.groups = [];
+ this.morphTargets = {};
+ this.skinWeights = [];
+ this.skinIndices = []; // this.lineDistances = [];
- negate: function () {
+ this.boundingBox = null;
+ this.boundingSphere = null; // update flags
- return this.multiplyScalar( -1 );
+ this.verticesNeedUpdate = false;
+ this.normalsNeedUpdate = false;
+ this.colorsNeedUpdate = false;
+ this.uvsNeedUpdate = false;
+ this.groupsNeedUpdate = false;
+ }
- },
+ var _proto = DirectGeometry.prototype;
- dot: function ( v ) {
+ _proto.computeGroups = function computeGroups(geometry) {
+ var groups = [];
+ var group, i;
+ var materialIndex = undefined;
+ var faces = geometry.faces;
- return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
+ for (i = 0; i < faces.length; i++) {
+ var face = faces[i]; // materials
- },
+ if (face.materialIndex !== materialIndex) {
+ materialIndex = face.materialIndex;
- lengthSq: function () {
+ if (group !== undefined) {
+ group.count = i * 3 - group.start;
+ groups.push(group);
+ }
- return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
+ group = {
+ start: i * 3,
+ materialIndex: materialIndex
+ };
+ }
+ }
- },
+ if (group !== undefined) {
+ group.count = i * 3 - group.start;
+ groups.push(group);
+ }
- length: function () {
+ this.groups = groups;
+ };
- return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
+ _proto.fromGeometry = function fromGeometry(geometry) {
+ var faces = geometry.faces;
+ var vertices = geometry.vertices;
+ var faceVertexUvs = geometry.faceVertexUvs;
+ var hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0;
+ var hasFaceVertexUv2 = faceVertexUvs[1] && faceVertexUvs[1].length > 0; // morphs
+
+ var morphTargets = geometry.morphTargets;
+ var morphTargetsLength = morphTargets.length;
+ var morphTargetsPosition;
+
+ if (morphTargetsLength > 0) {
+ morphTargetsPosition = [];
+
+ for (var i = 0; i < morphTargetsLength; i++) {
+ morphTargetsPosition[i] = {
+ name: morphTargets[i].name,
+ data: []
+ };
+ }
- },
+ this.morphTargets.position = morphTargetsPosition;
+ }
- lengthManhattan: function () {
+ var morphNormals = geometry.morphNormals;
+ var morphNormalsLength = morphNormals.length;
+ var morphTargetsNormal;
- return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
+ if (morphNormalsLength > 0) {
+ morphTargetsNormal = [];
- },
+ for (var _i = 0; _i < morphNormalsLength; _i++) {
+ morphTargetsNormal[_i] = {
+ name: morphNormals[_i].name,
+ data: []
+ };
+ }
- normalize: function () {
+ this.morphTargets.normal = morphTargetsNormal;
+ } // skins
- return this.divideScalar( this.length() );
- },
+ var skinIndices = geometry.skinIndices;
+ var skinWeights = geometry.skinWeights;
+ var hasSkinIndices = skinIndices.length === vertices.length;
+ var hasSkinWeights = skinWeights.length === vertices.length; //
- setLength: function ( l ) {
+ if (vertices.length > 0 && faces.length === 0) {
+ console.error('THREE.DirectGeometry: Faceless geometries are not supported.');
+ }
- var oldLength = this.length();
+ for (var _i2 = 0; _i2 < faces.length; _i2++) {
+ var face = faces[_i2];
+ this.vertices.push(vertices[face.a], vertices[face.b], vertices[face.c]);
+ var vertexNormals = face.vertexNormals;
- if ( oldLength !== 0 && l !== oldLength ) {
+ if (vertexNormals.length === 3) {
+ this.normals.push(vertexNormals[0], vertexNormals[1], vertexNormals[2]);
+ } else {
+ var normal = face.normal;
+ this.normals.push(normal, normal, normal);
+ }
- this.multiplyScalar( l / oldLength );
+ var vertexColors = face.vertexColors;
- }
+ if (vertexColors.length === 3) {
+ this.colors.push(vertexColors[0], vertexColors[1], vertexColors[2]);
+ } else {
+ var color = face.color;
+ this.colors.push(color, color, color);
+ }
- return this;
+ if (hasFaceVertexUv === true) {
+ var vertexUvs = faceVertexUvs[0][_i2];
- },
+ if (vertexUvs !== undefined) {
+ this.uvs.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]);
+ } else {
+ console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', _i2);
+ this.uvs.push(new Vector2(), new Vector2(), new Vector2());
+ }
+ }
- lerp: function ( v, alpha ) {
+ if (hasFaceVertexUv2 === true) {
+ var _vertexUvs = faceVertexUvs[1][_i2];
- this.x += ( v.x - this.x ) * alpha;
- this.y += ( v.y - this.y ) * alpha;
- this.z += ( v.z - this.z ) * alpha;
- this.w += ( v.w - this.w ) * alpha;
+ if (_vertexUvs !== undefined) {
+ this.uvs2.push(_vertexUvs[0], _vertexUvs[1], _vertexUvs[2]);
+ } else {
+ console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', _i2);
+ this.uvs2.push(new Vector2(), new Vector2(), new Vector2());
+ }
+ } // morphs
- return this;
- },
+ for (var j = 0; j < morphTargetsLength; j++) {
+ var morphTarget = morphTargets[j].vertices;
+ morphTargetsPosition[j].data.push(morphTarget[face.a], morphTarget[face.b], morphTarget[face.c]);
+ }
- equals: function ( v ) {
+ for (var _j = 0; _j < morphNormalsLength; _j++) {
+ var morphNormal = morphNormals[_j].vertexNormals[_i2];
- return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );
+ morphTargetsNormal[_j].data.push(morphNormal.a, morphNormal.b, morphNormal.c);
+ } // skins
- },
- fromArray: function ( array ) {
+ if (hasSkinIndices) {
+ this.skinIndices.push(skinIndices[face.a], skinIndices[face.b], skinIndices[face.c]);
+ }
- this.x = array[ 0 ];
- this.y = array[ 1 ];
- this.z = array[ 2 ];
- this.w = array[ 3 ];
+ if (hasSkinWeights) {
+ this.skinWeights.push(skinWeights[face.a], skinWeights[face.b], skinWeights[face.c]);
+ }
+ }
- return this;
+ this.computeGroups(geometry);
+ this.verticesNeedUpdate = geometry.verticesNeedUpdate;
+ this.normalsNeedUpdate = geometry.normalsNeedUpdate;
+ this.colorsNeedUpdate = geometry.colorsNeedUpdate;
+ this.uvsNeedUpdate = geometry.uvsNeedUpdate;
+ this.groupsNeedUpdate = geometry.groupsNeedUpdate;
- },
+ if (geometry.boundingSphere !== null) {
+ this.boundingSphere = geometry.boundingSphere.clone();
+ }
- toArray: function () {
+ if (geometry.boundingBox !== null) {
+ this.boundingBox = geometry.boundingBox.clone();
+ }
- return [ this.x, this.y, this.z, this.w ];
+ return this;
+ };
- },
+ return DirectGeometry;
+ }();
- clone: function () {
+ function arrayMax(array) {
+ if (array.length === 0) return -Infinity;
+ var max = array[0];
- return new THREE.Vector4( this.x, this.y, this.z, this.w );
+ for (var i = 1, l = array.length; i < l; ++i) {
+ if (array[i] > max) max = array[i];
+ }
+ return max;
}
-};
+ var _bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id
-/**
- * @author mrdoob / http://mrdoob.com/
- * @author WestLangley / http://github.com/WestLangley
- * @author bhouston / http://exocortex.com
- */
+ var _m1$2 = new Matrix4();
-THREE.Euler = function ( x, y, z, order ) {
+ var _obj = new Object3D();
- this._x = x || 0;
- this._y = y || 0;
- this._z = z || 0;
- this._order = order || THREE.Euler.DefaultOrder;
+ var _offset = new Vector3();
-};
+ var _box$2 = new Box3();
-THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
+ var _boxMorphTargets = new Box3();
-THREE.Euler.DefaultOrder = 'XYZ';
+ var _vector$4 = new Vector3();
-THREE.Euler.prototype = {
-
- constructor: THREE.Euler,
+ function BufferGeometry() {
+ Object.defineProperty(this, 'id', {
+ value: _bufferGeometryId += 2
+ });
+ this.uuid = MathUtils.generateUUID();
+ this.name = '';
+ this.type = 'BufferGeometry';
+ this.index = null;
+ this.attributes = {};
+ this.morphAttributes = {};
+ this.morphTargetsRelative = false;
+ this.groups = [];
+ this.boundingBox = null;
+ this.boundingSphere = null;
+ this.drawRange = {
+ start: 0,
+ count: Infinity
+ };
+ this.userData = {};
+ }
- _x: 0, _y: 0, _z: 0, _order: THREE.Euler.DefaultOrder,
+ BufferGeometry.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
+ constructor: BufferGeometry,
+ isBufferGeometry: true,
+ getIndex: function getIndex() {
+ return this.index;
+ },
+ setIndex: function setIndex(index) {
+ if (Array.isArray(index)) {
+ this.index = new (arrayMax(index) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute)(index, 1);
+ } else {
+ this.index = index;
+ }
- get x () {
+ return this;
+ },
+ getAttribute: function getAttribute(name) {
+ return this.attributes[name];
+ },
+ setAttribute: function setAttribute(name, attribute) {
+ this.attributes[name] = attribute;
+ return this;
+ },
+ deleteAttribute: function deleteAttribute(name) {
+ delete this.attributes[name];
+ return this;
+ },
+ addGroup: function addGroup(start, count, materialIndex) {
+ this.groups.push({
+ start: start,
+ count: count,
+ materialIndex: materialIndex !== undefined ? materialIndex : 0
+ });
+ },
+ clearGroups: function clearGroups() {
+ this.groups = [];
+ },
+ setDrawRange: function setDrawRange(start, count) {
+ this.drawRange.start = start;
+ this.drawRange.count = count;
+ },
+ applyMatrix4: function applyMatrix4(matrix) {
+ var position = this.attributes.position;
- return this._x;
+ if (position !== undefined) {
+ position.applyMatrix4(matrix);
+ position.needsUpdate = true;
+ }
- },
+ var normal = this.attributes.normal;
- set x ( value ) {
+ if (normal !== undefined) {
+ var normalMatrix = new Matrix3().getNormalMatrix(matrix);
+ normal.applyNormalMatrix(normalMatrix);
+ normal.needsUpdate = true;
+ }
- this._x = value;
- this.onChangeCallback();
+ var tangent = this.attributes.tangent;
- },
+ if (tangent !== undefined) {
+ tangent.transformDirection(matrix);
+ tangent.needsUpdate = true;
+ }
- get y () {
+ if (this.boundingBox !== null) {
+ this.computeBoundingBox();
+ }
- return this._y;
+ if (this.boundingSphere !== null) {
+ this.computeBoundingSphere();
+ }
- },
+ return this;
+ },
+ rotateX: function rotateX(angle) {
+ // rotate geometry around world x-axis
+ _m1$2.makeRotationX(angle);
- set y ( value ) {
+ this.applyMatrix4(_m1$2);
+ return this;
+ },
+ rotateY: function rotateY(angle) {
+ // rotate geometry around world y-axis
+ _m1$2.makeRotationY(angle);
- this._y = value;
- this.onChangeCallback();
+ this.applyMatrix4(_m1$2);
+ return this;
+ },
+ rotateZ: function rotateZ(angle) {
+ // rotate geometry around world z-axis
+ _m1$2.makeRotationZ(angle);
- },
+ this.applyMatrix4(_m1$2);
+ return this;
+ },
+ translate: function translate(x, y, z) {
+ // translate geometry
+ _m1$2.makeTranslation(x, y, z);
- get z () {
+ this.applyMatrix4(_m1$2);
+ return this;
+ },
+ scale: function scale(x, y, z) {
+ // scale geometry
+ _m1$2.makeScale(x, y, z);
- return this._z;
+ this.applyMatrix4(_m1$2);
+ return this;
+ },
+ lookAt: function lookAt(vector) {
+ _obj.lookAt(vector);
- },
+ _obj.updateMatrix();
- set z ( value ) {
+ this.applyMatrix4(_obj.matrix);
+ return this;
+ },
+ center: function center() {
+ this.computeBoundingBox();
+ this.boundingBox.getCenter(_offset).negate();
+ this.translate(_offset.x, _offset.y, _offset.z);
+ return this;
+ },
+ setFromObject: function setFromObject(object) {
+ // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );
+ var geometry = object.geometry;
- this._z = value;
- this.onChangeCallback();
+ if (object.isPoints || object.isLine) {
+ var positions = new Float32BufferAttribute(geometry.vertices.length * 3, 3);
+ var colors = new Float32BufferAttribute(geometry.colors.length * 3, 3);
+ this.setAttribute('position', positions.copyVector3sArray(geometry.vertices));
+ this.setAttribute('color', colors.copyColorsArray(geometry.colors));
- },
+ if (geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length) {
+ var lineDistances = new Float32BufferAttribute(geometry.lineDistances.length, 1);
+ this.setAttribute('lineDistance', lineDistances.copyArray(geometry.lineDistances));
+ }
- get order () {
+ if (geometry.boundingSphere !== null) {
+ this.boundingSphere = geometry.boundingSphere.clone();
+ }
- return this._order;
+ if (geometry.boundingBox !== null) {
+ this.boundingBox = geometry.boundingBox.clone();
+ }
+ } else if (object.isMesh) {
+ if (geometry && geometry.isGeometry) {
+ this.fromGeometry(geometry);
+ }
+ }
- },
+ return this;
+ },
+ setFromPoints: function setFromPoints(points) {
+ var position = [];
- set order ( value ) {
+ for (var i = 0, l = points.length; i < l; i++) {
+ var point = points[i];
+ position.push(point.x, point.y, point.z || 0);
+ }
- this._order = value;
- this.onChangeCallback();
+ this.setAttribute('position', new Float32BufferAttribute(position, 3));
+ return this;
+ },
+ updateFromObject: function updateFromObject(object) {
+ var geometry = object.geometry;
- },
+ if (object.isMesh) {
+ var direct = geometry.__directGeometry;
- set: function ( x, y, z, order ) {
+ if (geometry.elementsNeedUpdate === true) {
+ direct = undefined;
+ geometry.elementsNeedUpdate = false;
+ }
- this._x = x;
- this._y = y;
- this._z = z;
- this._order = order || this._order;
+ if (direct === undefined) {
+ return this.fromGeometry(geometry);
+ }
- this.onChangeCallback();
+ direct.verticesNeedUpdate = geometry.verticesNeedUpdate;
+ direct.normalsNeedUpdate = geometry.normalsNeedUpdate;
+ direct.colorsNeedUpdate = geometry.colorsNeedUpdate;
+ direct.uvsNeedUpdate = geometry.uvsNeedUpdate;
+ direct.groupsNeedUpdate = geometry.groupsNeedUpdate;
+ geometry.verticesNeedUpdate = false;
+ geometry.normalsNeedUpdate = false;
+ geometry.colorsNeedUpdate = false;
+ geometry.uvsNeedUpdate = false;
+ geometry.groupsNeedUpdate = false;
+ geometry = direct;
+ }
- return this;
+ if (geometry.verticesNeedUpdate === true) {
+ var attribute = this.attributes.position;
- },
+ if (attribute !== undefined) {
+ attribute.copyVector3sArray(geometry.vertices);
+ attribute.needsUpdate = true;
+ }
- copy: function ( euler ) {
+ geometry.verticesNeedUpdate = false;
+ }
- this._x = euler._x;
- this._y = euler._y;
- this._z = euler._z;
- this._order = euler._order;
+ if (geometry.normalsNeedUpdate === true) {
+ var _attribute = this.attributes.normal;
- this.onChangeCallback();
+ if (_attribute !== undefined) {
+ _attribute.copyVector3sArray(geometry.normals);
- return this;
+ _attribute.needsUpdate = true;
+ }
- },
+ geometry.normalsNeedUpdate = false;
+ }
- setFromRotationMatrix: function ( m, order ) {
+ if (geometry.colorsNeedUpdate === true) {
+ var _attribute2 = this.attributes.color;
- var clamp = THREE.Math.clamp;
+ if (_attribute2 !== undefined) {
+ _attribute2.copyColorsArray(geometry.colors);
- // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+ _attribute2.needsUpdate = true;
+ }
- var te = m.elements;
- var m11 = te[0], m12 = te[4], m13 = te[8];
- var m21 = te[1], m22 = te[5], m23 = te[9];
- var m31 = te[2], m32 = te[6], m33 = te[10];
+ geometry.colorsNeedUpdate = false;
+ }
- order = order || this._order;
+ if (geometry.uvsNeedUpdate) {
+ var _attribute3 = this.attributes.uv;
- if ( order === 'XYZ' ) {
+ if (_attribute3 !== undefined) {
+ _attribute3.copyVector2sArray(geometry.uvs);
- this._y = Math.asin( clamp( m13, -1, 1 ) );
+ _attribute3.needsUpdate = true;
+ }
- if ( Math.abs( m13 ) < 0.99999 ) {
+ geometry.uvsNeedUpdate = false;
+ }
- this._x = Math.atan2( - m23, m33 );
- this._z = Math.atan2( - m12, m11 );
+ if (geometry.lineDistancesNeedUpdate) {
+ var _attribute4 = this.attributes.lineDistance;
- } else {
+ if (_attribute4 !== undefined) {
+ _attribute4.copyArray(geometry.lineDistances);
- this._x = Math.atan2( m32, m22 );
- this._z = 0;
+ _attribute4.needsUpdate = true;
+ }
+ geometry.lineDistancesNeedUpdate = false;
}
- } else if ( order === 'YXZ' ) {
-
- this._x = Math.asin( - clamp( m23, -1, 1 ) );
-
- if ( Math.abs( m23 ) < 0.99999 ) {
+ if (geometry.groupsNeedUpdate) {
+ geometry.computeGroups(object.geometry);
+ this.groups = geometry.groups;
+ geometry.groupsNeedUpdate = false;
+ }
- this._y = Math.atan2( m13, m33 );
- this._z = Math.atan2( m21, m22 );
+ return this;
+ },
+ fromGeometry: function fromGeometry(geometry) {
+ geometry.__directGeometry = new DirectGeometry().fromGeometry(geometry);
+ return this.fromDirectGeometry(geometry.__directGeometry);
+ },
+ fromDirectGeometry: function fromDirectGeometry(geometry) {
+ var positions = new Float32Array(geometry.vertices.length * 3);
+ this.setAttribute('position', new BufferAttribute(positions, 3).copyVector3sArray(geometry.vertices));
- } else {
+ if (geometry.normals.length > 0) {
+ var normals = new Float32Array(geometry.normals.length * 3);
+ this.setAttribute('normal', new BufferAttribute(normals, 3).copyVector3sArray(geometry.normals));
+ }
- this._y = Math.atan2( - m31, m11 );
- this._z = 0;
+ if (geometry.colors.length > 0) {
+ var colors = new Float32Array(geometry.colors.length * 3);
+ this.setAttribute('color', new BufferAttribute(colors, 3).copyColorsArray(geometry.colors));
+ }
+ if (geometry.uvs.length > 0) {
+ var uvs = new Float32Array(geometry.uvs.length * 2);
+ this.setAttribute('uv', new BufferAttribute(uvs, 2).copyVector2sArray(geometry.uvs));
}
- } else if ( order === 'ZXY' ) {
+ if (geometry.uvs2.length > 0) {
+ var uvs2 = new Float32Array(geometry.uvs2.length * 2);
+ this.setAttribute('uv2', new BufferAttribute(uvs2, 2).copyVector2sArray(geometry.uvs2));
+ } // groups
- this._x = Math.asin( clamp( m32, -1, 1 ) );
- if ( Math.abs( m32 ) < 0.99999 ) {
+ this.groups = geometry.groups; // morphs
- this._y = Math.atan2( - m31, m33 );
- this._z = Math.atan2( - m12, m22 );
+ for (var name in geometry.morphTargets) {
+ var array = [];
+ var morphTargets = geometry.morphTargets[name];
- } else {
+ for (var i = 0, l = morphTargets.length; i < l; i++) {
+ var morphTarget = morphTargets[i];
+ var attribute = new Float32BufferAttribute(morphTarget.data.length * 3, 3);
+ attribute.name = morphTarget.name;
+ array.push(attribute.copyVector3sArray(morphTarget.data));
+ }
+
+ this.morphAttributes[name] = array;
+ } // skinning
- this._y = 0;
- this._z = Math.atan2( m21, m11 );
+ if (geometry.skinIndices.length > 0) {
+ var skinIndices = new Float32BufferAttribute(geometry.skinIndices.length * 4, 4);
+ this.setAttribute('skinIndex', skinIndices.copyVector4sArray(geometry.skinIndices));
}
- } else if ( order === 'ZYX' ) {
+ if (geometry.skinWeights.length > 0) {
+ var skinWeights = new Float32BufferAttribute(geometry.skinWeights.length * 4, 4);
+ this.setAttribute('skinWeight', skinWeights.copyVector4sArray(geometry.skinWeights));
+ } //
- this._y = Math.asin( - clamp( m31, -1, 1 ) );
- if ( Math.abs( m31 ) < 0.99999 ) {
+ if (geometry.boundingSphere !== null) {
+ this.boundingSphere = geometry.boundingSphere.clone();
+ }
- this._x = Math.atan2( m32, m33 );
- this._z = Math.atan2( m21, m11 );
+ if (geometry.boundingBox !== null) {
+ this.boundingBox = geometry.boundingBox.clone();
+ }
- } else {
+ return this;
+ },
+ computeBoundingBox: function computeBoundingBox() {
+ if (this.boundingBox === null) {
+ this.boundingBox = new Box3();
+ }
- this._x = 0;
- this._z = Math.atan2( - m12, m22 );
+ var position = this.attributes.position;
+ var morphAttributesPosition = this.morphAttributes.position;
+ if (position && position.isGLBufferAttribute) {
+ console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this);
+ this.boundingBox.set(new Vector3(-Infinity, -Infinity, -Infinity), new Vector3(+Infinity, +Infinity, +Infinity));
+ return;
}
- } else if ( order === 'YZX' ) {
+ if (position !== undefined) {
+ this.boundingBox.setFromBufferAttribute(position); // process morph attributes if present
- this._z = Math.asin( clamp( m21, -1, 1 ) );
+ if (morphAttributesPosition) {
+ for (var i = 0, il = morphAttributesPosition.length; i < il; i++) {
+ var morphAttribute = morphAttributesPosition[i];
- if ( Math.abs( m21 ) < 0.99999 ) {
+ _box$2.setFromBufferAttribute(morphAttribute);
- this._x = Math.atan2( - m23, m22 );
- this._y = Math.atan2( - m31, m11 );
+ if (this.morphTargetsRelative) {
+ _vector$4.addVectors(this.boundingBox.min, _box$2.min);
- } else {
+ this.boundingBox.expandByPoint(_vector$4);
- this._x = 0;
- this._y = Math.atan2( m13, m33 );
+ _vector$4.addVectors(this.boundingBox.max, _box$2.max);
+ this.boundingBox.expandByPoint(_vector$4);
+ } else {
+ this.boundingBox.expandByPoint(_box$2.min);
+ this.boundingBox.expandByPoint(_box$2.max);
+ }
+ }
+ }
+ } else {
+ this.boundingBox.makeEmpty();
}
- } else if ( order === 'XZY' ) {
+ if (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) {
+ console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this);
+ }
+ },
+ computeBoundingSphere: function computeBoundingSphere() {
+ if (this.boundingSphere === null) {
+ this.boundingSphere = new Sphere();
+ }
- this._z = Math.asin( - clamp( m12, -1, 1 ) );
+ var position = this.attributes.position;
+ var morphAttributesPosition = this.morphAttributes.position;
- if ( Math.abs( m12 ) < 0.99999 ) {
+ if (position && position.isGLBufferAttribute) {
+ console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this);
+ this.boundingSphere.set(new Vector3(), Infinity);
+ return;
+ }
- this._x = Math.atan2( m32, m22 );
- this._y = Math.atan2( m13, m11 );
+ if (position) {
+ // first, find the center of the bounding sphere
+ var center = this.boundingSphere.center;
- } else {
+ _box$2.setFromBufferAttribute(position); // process morph attributes if present
- this._x = Math.atan2( - m23, m33 );
- this._y = 0;
- }
+ if (morphAttributesPosition) {
+ for (var i = 0, il = morphAttributesPosition.length; i < il; i++) {
+ var morphAttribute = morphAttributesPosition[i];
- } else {
+ _boxMorphTargets.setFromBufferAttribute(morphAttribute);
- console.warn( 'WARNING: Euler.setFromRotationMatrix() given unsupported order: ' + order )
+ if (this.morphTargetsRelative) {
+ _vector$4.addVectors(_box$2.min, _boxMorphTargets.min);
- }
+ _box$2.expandByPoint(_vector$4);
- this._order = order;
+ _vector$4.addVectors(_box$2.max, _boxMorphTargets.max);
- this.onChangeCallback();
+ _box$2.expandByPoint(_vector$4);
+ } else {
+ _box$2.expandByPoint(_boxMorphTargets.min);
- return this;
+ _box$2.expandByPoint(_boxMorphTargets.max);
+ }
+ }
+ }
- },
+ _box$2.getCenter(center); // second, try to find a boundingSphere with a radius smaller than the
+ // boundingSphere of the boundingBox: sqrt(3) smaller in the best case
- setFromQuaternion: function ( q, order, update ) {
- var clamp = THREE.Math.clamp;
+ var maxRadiusSq = 0;
- // q is assumed to be normalized
+ for (var _i = 0, _il = position.count; _i < _il; _i++) {
+ _vector$4.fromBufferAttribute(position, _i);
- // http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
+ maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$4));
+ } // process morph attributes if present
- var sqx = q.x * q.x;
- var sqy = q.y * q.y;
- var sqz = q.z * q.z;
- var sqw = q.w * q.w;
- order = order || this._order;
+ if (morphAttributesPosition) {
+ for (var _i2 = 0, _il2 = morphAttributesPosition.length; _i2 < _il2; _i2++) {
+ var _morphAttribute = morphAttributesPosition[_i2];
+ var morphTargetsRelative = this.morphTargetsRelative;
- if ( order === 'XYZ' ) {
+ for (var j = 0, jl = _morphAttribute.count; j < jl; j++) {
+ _vector$4.fromBufferAttribute(_morphAttribute, j);
- this._x = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) );
- this._y = Math.asin( clamp( 2 * ( q.x * q.z + q.y * q.w ), -1, 1 ) );
- this._z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) );
+ if (morphTargetsRelative) {
+ _offset.fromBufferAttribute(position, j);
- } else if ( order === 'YXZ' ) {
+ _vector$4.add(_offset);
+ }
- this._x = Math.asin( clamp( 2 * ( q.x * q.w - q.y * q.z ), -1, 1 ) );
- this._y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw - sqx - sqy + sqz ) );
- this._z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw - sqx + sqy - sqz ) );
+ maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$4));
+ }
+ }
+ }
- } else if ( order === 'ZXY' ) {
+ this.boundingSphere.radius = Math.sqrt(maxRadiusSq);
- this._x = Math.asin( clamp( 2 * ( q.x * q.w + q.y * q.z ), -1, 1 ) );
- this._y = Math.atan2( 2 * ( q.y * q.w - q.z * q.x ), ( sqw - sqx - sqy + sqz ) );
- this._z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw - sqx + sqy - sqz ) );
+ if (isNaN(this.boundingSphere.radius)) {
+ console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this);
+ }
+ }
+ },
+ computeFaceNormals: function computeFaceNormals() {// backwards compatibility
+ },
+ computeVertexNormals: function computeVertexNormals() {
+ var index = this.index;
+ var positionAttribute = this.getAttribute('position');
- } else if ( order === 'ZYX' ) {
+ if (positionAttribute !== undefined) {
+ var normalAttribute = this.getAttribute('normal');
- this._x = Math.atan2( 2 * ( q.x * q.w + q.z * q.y ), ( sqw - sqx - sqy + sqz ) );
- this._y = Math.asin( clamp( 2 * ( q.y * q.w - q.x * q.z ), -1, 1 ) );
- this._z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw + sqx - sqy - sqz ) );
+ if (normalAttribute === undefined) {
+ normalAttribute = new BufferAttribute(new Float32Array(positionAttribute.count * 3), 3);
+ this.setAttribute('normal', normalAttribute);
+ } else {
+ // reset existing normals to zero
+ for (var i = 0, il = normalAttribute.count; i < il; i++) {
+ normalAttribute.setXYZ(i, 0, 0, 0);
+ }
+ }
- } else if ( order === 'YZX' ) {
+ var pA = new Vector3(),
+ pB = new Vector3(),
+ pC = new Vector3();
+ var nA = new Vector3(),
+ nB = new Vector3(),
+ nC = new Vector3();
+ var cb = new Vector3(),
+ ab = new Vector3(); // indexed elements
+
+ if (index) {
+ for (var _i3 = 0, _il3 = index.count; _i3 < _il3; _i3 += 3) {
+ var vA = index.getX(_i3 + 0);
+ var vB = index.getX(_i3 + 1);
+ var vC = index.getX(_i3 + 2);
+ pA.fromBufferAttribute(positionAttribute, vA);
+ pB.fromBufferAttribute(positionAttribute, vB);
+ pC.fromBufferAttribute(positionAttribute, vC);
+ cb.subVectors(pC, pB);
+ ab.subVectors(pA, pB);
+ cb.cross(ab);
+ nA.fromBufferAttribute(normalAttribute, vA);
+ nB.fromBufferAttribute(normalAttribute, vB);
+ nC.fromBufferAttribute(normalAttribute, vC);
+ nA.add(cb);
+ nB.add(cb);
+ nC.add(cb);
+ normalAttribute.setXYZ(vA, nA.x, nA.y, nA.z);
+ normalAttribute.setXYZ(vB, nB.x, nB.y, nB.z);
+ normalAttribute.setXYZ(vC, nC.x, nC.y, nC.z);
+ }
+ } else {
+ // non-indexed elements (unconnected triangle soup)
+ for (var _i4 = 0, _il4 = positionAttribute.count; _i4 < _il4; _i4 += 3) {
+ pA.fromBufferAttribute(positionAttribute, _i4 + 0);
+ pB.fromBufferAttribute(positionAttribute, _i4 + 1);
+ pC.fromBufferAttribute(positionAttribute, _i4 + 2);
+ cb.subVectors(pC, pB);
+ ab.subVectors(pA, pB);
+ cb.cross(ab);
+ normalAttribute.setXYZ(_i4 + 0, cb.x, cb.y, cb.z);
+ normalAttribute.setXYZ(_i4 + 1, cb.x, cb.y, cb.z);
+ normalAttribute.setXYZ(_i4 + 2, cb.x, cb.y, cb.z);
+ }
+ }
- this._x = Math.atan2( 2 * ( q.x * q.w - q.z * q.y ), ( sqw - sqx + sqy - sqz ) );
- this._y = Math.atan2( 2 * ( q.y * q.w - q.x * q.z ), ( sqw + sqx - sqy - sqz ) );
- this._z = Math.asin( clamp( 2 * ( q.x * q.y + q.z * q.w ), -1, 1 ) );
+ this.normalizeNormals();
+ normalAttribute.needsUpdate = true;
+ }
+ },
+ merge: function merge(geometry, offset) {
+ if (!(geometry && geometry.isBufferGeometry)) {
+ console.error('THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry);
+ return;
+ }
- } else if ( order === 'XZY' ) {
+ if (offset === undefined) {
+ offset = 0;
+ console.warn('THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.');
+ }
- this._x = Math.atan2( 2 * ( q.x * q.w + q.y * q.z ), ( sqw - sqx + sqy - sqz ) );
- this._y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw + sqx - sqy - sqz ) );
- this._z = Math.asin( clamp( 2 * ( q.z * q.w - q.x * q.y ), -1, 1 ) );
+ var attributes = this.attributes;
- } else {
+ for (var key in attributes) {
+ if (geometry.attributes[key] === undefined) continue;
+ var attribute1 = attributes[key];
+ var attributeArray1 = attribute1.array;
+ var attribute2 = geometry.attributes[key];
+ var attributeArray2 = attribute2.array;
+ var attributeOffset = attribute2.itemSize * offset;
+ var length = Math.min(attributeArray2.length, attributeArray1.length - attributeOffset);
- console.warn( 'WARNING: Euler.setFromQuaternion() given unsupported order: ' + order )
+ for (var i = 0, j = attributeOffset; i < length; i++, j++) {
+ attributeArray1[j] = attributeArray2[i];
+ }
+ }
- }
+ return this;
+ },
+ normalizeNormals: function normalizeNormals() {
+ var normals = this.attributes.normal;
- this._order = order;
+ for (var i = 0, il = normals.count; i < il; i++) {
+ _vector$4.fromBufferAttribute(normals, i);
- if ( update !== false ) this.onChangeCallback();
+ _vector$4.normalize();
- return this;
+ normals.setXYZ(i, _vector$4.x, _vector$4.y, _vector$4.z);
+ }
+ },
+ toNonIndexed: function toNonIndexed() {
+ function convertBufferAttribute(attribute, indices) {
+ var array = attribute.array;
+ var itemSize = attribute.itemSize;
+ var normalized = attribute.normalized;
+ var array2 = new array.constructor(indices.length * itemSize);
+ var index = 0,
+ index2 = 0;
+
+ for (var i = 0, l = indices.length; i < l; i++) {
+ index = indices[i] * itemSize;
+
+ for (var j = 0; j < itemSize; j++) {
+ array2[index2++] = array[index++];
+ }
+ }
- },
+ return new BufferAttribute(array2, itemSize, normalized);
+ } //
- reorder: function () {
- // WARNING: this discards revolution information -bhouston
+ if (this.index === null) {
+ console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');
+ return this;
+ }
- var q = new THREE.Quaternion();
+ var geometry2 = new BufferGeometry();
+ var indices = this.index.array;
+ var attributes = this.attributes; // attributes
- return function ( newOrder ) {
+ for (var name in attributes) {
+ var attribute = attributes[name];
+ var newAttribute = convertBufferAttribute(attribute, indices);
+ geometry2.setAttribute(name, newAttribute);
+ } // morph attributes
- q.setFromEuler( this );
- this.setFromQuaternion( q, newOrder );
- };
+ var morphAttributes = this.morphAttributes;
+ for (var _name in morphAttributes) {
+ var morphArray = [];
+ var morphAttribute = morphAttributes[_name]; // morphAttribute: array of Float32BufferAttributes
- }(),
+ for (var i = 0, il = morphAttribute.length; i < il; i++) {
+ var _attribute5 = morphAttribute[i];
- equals: function ( euler ) {
+ var _newAttribute = convertBufferAttribute(_attribute5, indices);
- return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
+ morphArray.push(_newAttribute);
+ }
- },
+ geometry2.morphAttributes[_name] = morphArray;
+ }
- fromArray: function ( array ) {
+ geometry2.morphTargetsRelative = this.morphTargetsRelative; // groups
- this._x = array[ 0 ];
- this._y = array[ 1 ];
- this._z = array[ 2 ];
- if ( array[ 3 ] !== undefined ) this._order = array[ 3 ];
+ var groups = this.groups;
- this.onChangeCallback();
+ for (var _i5 = 0, l = groups.length; _i5 < l; _i5++) {
+ var group = groups[_i5];
+ geometry2.addGroup(group.start, group.count, group.materialIndex);
+ }
- return this;
+ return geometry2;
+ },
+ toJSON: function toJSON() {
+ var data = {
+ metadata: {
+ version: 4.5,
+ type: 'BufferGeometry',
+ generator: 'BufferGeometry.toJSON'
+ }
+ }; // standard BufferGeometry serialization
- },
+ data.uuid = this.uuid;
+ data.type = this.type;
+ if (this.name !== '') data.name = this.name;
+ if (Object.keys(this.userData).length > 0) data.userData = this.userData;
- toArray: function () {
+ if (this.parameters !== undefined) {
+ var parameters = this.parameters;
- return [ this._x, this._y, this._z, this._order ];
+ for (var key in parameters) {
+ if (parameters[key] !== undefined) data[key] = parameters[key];
+ }
- },
+ return data;
+ }
- onChange: function ( callback ) {
-
- this.onChangeCallback = callback;
-
- return this;
+ data.data = {
+ attributes: {}
+ };
+ var index = this.index;
- },
+ if (index !== null) {
+ data.data.index = {
+ type: index.array.constructor.name,
+ array: Array.prototype.slice.call(index.array)
+ };
+ }
- onChangeCallback: function () {},
+ var attributes = this.attributes;
- clone: function () {
+ for (var _key in attributes) {
+ var attribute = attributes[_key];
+ var attributeData = attribute.toJSON(data.data);
+ if (attribute.name !== '') attributeData.name = attribute.name;
+ data.data.attributes[_key] = attributeData;
+ }
- return new THREE.Euler( this._x, this._y, this._z, this._order );
+ var morphAttributes = {};
+ var hasMorphAttributes = false;
- }
+ for (var _key2 in this.morphAttributes) {
+ var attributeArray = this.morphAttributes[_key2];
+ var array = [];
-};
+ for (var i = 0, il = attributeArray.length; i < il; i++) {
+ var _attribute6 = attributeArray[i];
-/**
- * @author bhouston / http://exocortex.com
- */
+ var _attributeData = _attribute6.toJSON(data.data);
-THREE.Line3 = function ( start, end ) {
+ if (_attribute6.name !== '') _attributeData.name = _attribute6.name;
+ array.push(_attributeData);
+ }
- this.start = ( start !== undefined ) ? start : new THREE.Vector3();
- this.end = ( end !== undefined ) ? end : new THREE.Vector3();
+ if (array.length > 0) {
+ morphAttributes[_key2] = array;
+ hasMorphAttributes = true;
+ }
+ }
-};
+ if (hasMorphAttributes) {
+ data.data.morphAttributes = morphAttributes;
+ data.data.morphTargetsRelative = this.morphTargetsRelative;
+ }
-THREE.Line3.prototype = {
+ var groups = this.groups;
- constructor: THREE.Line3,
+ if (groups.length > 0) {
+ data.data.groups = JSON.parse(JSON.stringify(groups));
+ }
- set: function ( start, end ) {
+ var boundingSphere = this.boundingSphere;
- this.start.copy( start );
- this.end.copy( end );
+ if (boundingSphere !== null) {
+ data.data.boundingSphere = {
+ center: boundingSphere.center.toArray(),
+ radius: boundingSphere.radius
+ };
+ }
- return this;
+ return data;
+ },
+ clone: function clone() {
+ /*
+ // Handle primitives
+ const parameters = this.parameters;
+ if ( parameters !== undefined ) {
+ const values = [];
+ for ( const key in parameters ) {
+ values.push( parameters[ key ] );
+ }
+ const geometry = Object.create( this.constructor.prototype );
+ this.constructor.apply( geometry, values );
+ return geometry;
+ }
+ return new this.constructor().copy( this );
+ */
+ return new BufferGeometry().copy(this);
+ },
+ copy: function copy(source) {
+ // reset
+ this.index = null;
+ this.attributes = {};
+ this.morphAttributes = {};
+ this.groups = [];
+ this.boundingBox = null;
+ this.boundingSphere = null; // used for storing cloned, shared data
- },
+ var data = {}; // name
- copy: function ( line ) {
+ this.name = source.name; // index
- this.start.copy( line.start );
- this.end.copy( line.end );
+ var index = source.index;
- return this;
+ if (index !== null) {
+ this.setIndex(index.clone(data));
+ } // attributes
- },
- center: function ( optionalTarget ) {
+ var attributes = source.attributes;
- var result = optionalTarget || new THREE.Vector3();
- return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
+ for (var name in attributes) {
+ var attribute = attributes[name];
+ this.setAttribute(name, attribute.clone(data));
+ } // morph attributes
- },
- delta: function ( optionalTarget ) {
+ var morphAttributes = source.morphAttributes;
- var result = optionalTarget || new THREE.Vector3();
- return result.subVectors( this.end, this.start );
+ for (var _name2 in morphAttributes) {
+ var array = [];
+ var morphAttribute = morphAttributes[_name2]; // morphAttribute: array of Float32BufferAttributes
- },
+ for (var i = 0, l = morphAttribute.length; i < l; i++) {
+ array.push(morphAttribute[i].clone(data));
+ }
- distanceSq: function () {
+ this.morphAttributes[_name2] = array;
+ }
- return this.start.distanceToSquared( this.end );
+ this.morphTargetsRelative = source.morphTargetsRelative; // groups
- },
+ var groups = source.groups;
- distance: function () {
+ for (var _i6 = 0, _l = groups.length; _i6 < _l; _i6++) {
+ var group = groups[_i6];
+ this.addGroup(group.start, group.count, group.materialIndex);
+ } // bounding box
- return this.start.distanceTo( this.end );
- },
+ var boundingBox = source.boundingBox;
- at: function ( t, optionalTarget ) {
+ if (boundingBox !== null) {
+ this.boundingBox = boundingBox.clone();
+ } // bounding sphere
- var result = optionalTarget || new THREE.Vector3();
- return this.delta( result ).multiplyScalar( t ).add( this.start );
+ var boundingSphere = source.boundingSphere;
- },
+ if (boundingSphere !== null) {
+ this.boundingSphere = boundingSphere.clone();
+ } // draw range
- closestPointToPointParameter: function() {
- var startP = new THREE.Vector3();
- var startEnd = new THREE.Vector3();
+ this.drawRange.start = source.drawRange.start;
+ this.drawRange.count = source.drawRange.count; // user data
- return function ( point, clampToLine ) {
+ this.userData = source.userData;
+ return this;
+ },
+ dispose: function dispose() {
+ this.dispatchEvent({
+ type: 'dispose'
+ });
+ }
+ });
- startP.subVectors( point, this.start );
- startEnd.subVectors( this.end, this.start );
+ var _inverseMatrix = new Matrix4();
- var startEnd2 = startEnd.dot( startEnd );
- var startEnd_startP = startEnd.dot( startP );
+ var _ray = new Ray();
- var t = startEnd_startP / startEnd2;
+ var _sphere = new Sphere();
- if ( clampToLine ) {
+ var _vA = new Vector3();
- t = THREE.Math.clamp( t, 0, 1 );
+ var _vB = new Vector3();
- }
+ var _vC = new Vector3();
- return t;
+ var _tempA = new Vector3();
- };
+ var _tempB = new Vector3();
- }(),
+ var _tempC = new Vector3();
- closestPointToPoint: function ( point, clampToLine, optionalTarget ) {
+ var _morphA = new Vector3();
- var t = this.closestPointToPointParameter( point, clampToLine );
+ var _morphB = new Vector3();
- var result = optionalTarget || new THREE.Vector3();
+ var _morphC = new Vector3();
- return this.delta( result ).multiplyScalar( t ).add( this.start );
+ var _uvA = new Vector2();
- },
+ var _uvB = new Vector2();
- applyMatrix4: function ( matrix ) {
+ var _uvC = new Vector2();
- this.start.applyMatrix4( matrix );
- this.end.applyMatrix4( matrix );
+ var _intersectionPoint = new Vector3();
- return this;
+ var _intersectionPointWorld = new Vector3();
- },
+ function Mesh(geometry, material) {
+ Object3D.call(this);
+ this.type = 'Mesh';
+ this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
+ this.material = material !== undefined ? material : new MeshBasicMaterial();
+ this.updateMorphTargets();
+ }
- equals: function ( line ) {
+ Mesh.prototype = Object.assign(Object.create(Object3D.prototype), {
+ constructor: Mesh,
+ isMesh: true,
+ copy: function copy(source) {
+ Object3D.prototype.copy.call(this, source);
- return line.start.equals( this.start ) && line.end.equals( this.end );
+ if (source.morphTargetInfluences !== undefined) {
+ this.morphTargetInfluences = source.morphTargetInfluences.slice();
+ }
- },
+ if (source.morphTargetDictionary !== undefined) {
+ this.morphTargetDictionary = Object.assign({}, source.morphTargetDictionary);
+ }
- clone: function () {
+ this.material = source.material;
+ this.geometry = source.geometry;
+ return this;
+ },
+ updateMorphTargets: function updateMorphTargets() {
+ var geometry = this.geometry;
- return new THREE.Line3().copy( this );
+ if (geometry.isBufferGeometry) {
+ var morphAttributes = geometry.morphAttributes;
+ var keys = Object.keys(morphAttributes);
- }
+ if (keys.length > 0) {
+ var morphAttribute = morphAttributes[keys[0]];
-};
+ if (morphAttribute !== undefined) {
+ this.morphTargetInfluences = [];
+ this.morphTargetDictionary = {};
-/**
- * @author bhouston / http://exocortex.com
- */
+ for (var m = 0, ml = morphAttribute.length; m < ml; m++) {
+ var name = morphAttribute[m].name || String(m);
+ this.morphTargetInfluences.push(0);
+ this.morphTargetDictionary[name] = m;
+ }
+ }
+ }
+ } else {
+ var morphTargets = geometry.morphTargets;
-THREE.Box2 = function ( min, max ) {
+ if (morphTargets !== undefined && morphTargets.length > 0) {
+ console.error('THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.');
+ }
+ }
+ },
+ raycast: function raycast(raycaster, intersects) {
+ var geometry = this.geometry;
+ var material = this.material;
+ var matrixWorld = this.matrixWorld;
+ if (material === undefined) return; // Checking boundingSphere distance to ray
- this.min = ( min !== undefined ) ? min : new THREE.Vector2( Infinity, Infinity );
- this.max = ( max !== undefined ) ? max : new THREE.Vector2( -Infinity, -Infinity );
+ if (geometry.boundingSphere === null) geometry.computeBoundingSphere();
-};
+ _sphere.copy(geometry.boundingSphere);
-THREE.Box2.prototype = {
+ _sphere.applyMatrix4(matrixWorld);
- constructor: THREE.Box2,
+ if (raycaster.ray.intersectsSphere(_sphere) === false) return; //
- set: function ( min, max ) {
+ _inverseMatrix.getInverse(matrixWorld);
- this.min.copy( min );
- this.max.copy( max );
+ _ray.copy(raycaster.ray).applyMatrix4(_inverseMatrix); // Check boundingBox before continuing
- return this;
- },
+ if (geometry.boundingBox !== null) {
+ if (_ray.intersectsBox(geometry.boundingBox) === false) return;
+ }
- setFromPoints: function ( points ) {
+ var intersection;
- if ( points.length > 0 ) {
+ if (geometry.isBufferGeometry) {
+ var index = geometry.index;
+ var position = geometry.attributes.position;
+ var morphPosition = geometry.morphAttributes.position;
+ var morphTargetsRelative = geometry.morphTargetsRelative;
+ var uv = geometry.attributes.uv;
+ var uv2 = geometry.attributes.uv2;
+ var groups = geometry.groups;
+ var drawRange = geometry.drawRange;
- var point = points[ 0 ];
+ if (index !== null) {
+ // indexed buffer geometry
+ if (Array.isArray(material)) {
+ for (var i = 0, il = groups.length; i < il; i++) {
+ var group = groups[i];
+ var groupMaterial = material[group.materialIndex];
+ var start = Math.max(group.start, drawRange.start);
+ var end = Math.min(group.start + group.count, drawRange.start + drawRange.count);
- this.min.copy( point );
- this.max.copy( point );
+ for (var j = start, jl = end; j < jl; j += 3) {
+ var a = index.getX(j);
+ var b = index.getX(j + 1);
+ var c = index.getX(j + 2);
+ intersection = checkBufferGeometryIntersection(this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c);
- for ( var i = 1, il = points.length; i < il; i ++ ) {
+ if (intersection) {
+ intersection.faceIndex = Math.floor(j / 3); // triangle number in indexed buffer semantics
- point = points[ i ];
+ intersection.face.materialIndex = group.materialIndex;
+ intersects.push(intersection);
+ }
+ }
+ }
+ } else {
+ var _start = Math.max(0, drawRange.start);
- if ( point.x < this.min.x ) {
+ var _end = Math.min(index.count, drawRange.start + drawRange.count);
- this.min.x = point.x;
+ for (var _i = _start, _il = _end; _i < _il; _i += 3) {
+ var _a = index.getX(_i);
- } else if ( point.x > this.max.x ) {
+ var _b = index.getX(_i + 1);
- this.max.x = point.x;
+ var _c = index.getX(_i + 2);
- }
+ intersection = checkBufferGeometryIntersection(this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, _a, _b, _c);
- if ( point.y < this.min.y ) {
+ if (intersection) {
+ intersection.faceIndex = Math.floor(_i / 3); // triangle number in indexed buffer semantics
- this.min.y = point.y;
+ intersects.push(intersection);
+ }
+ }
+ }
+ } else if (position !== undefined) {
+ // non-indexed buffer geometry
+ if (Array.isArray(material)) {
+ for (var _i2 = 0, _il2 = groups.length; _i2 < _il2; _i2++) {
+ var _group = groups[_i2];
+ var _groupMaterial = material[_group.materialIndex];
- } else if ( point.y > this.max.y ) {
+ var _start2 = Math.max(_group.start, drawRange.start);
- this.max.y = point.y;
+ var _end2 = Math.min(_group.start + _group.count, drawRange.start + drawRange.count);
- }
+ for (var _j = _start2, _jl = _end2; _j < _jl; _j += 3) {
+ var _a2 = _j;
- }
+ var _b2 = _j + 1;
- } else {
+ var _c2 = _j + 2;
- this.makeEmpty();
+ intersection = checkBufferGeometryIntersection(this, _groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, _a2, _b2, _c2);
- }
+ if (intersection) {
+ intersection.faceIndex = Math.floor(_j / 3); // triangle number in non-indexed buffer semantics
- return this;
+ intersection.face.materialIndex = _group.materialIndex;
+ intersects.push(intersection);
+ }
+ }
+ }
+ } else {
+ var _start3 = Math.max(0, drawRange.start);
- },
+ var _end3 = Math.min(position.count, drawRange.start + drawRange.count);
- setFromCenterAndSize: function () {
+ for (var _i3 = _start3, _il3 = _end3; _i3 < _il3; _i3 += 3) {
+ var _a3 = _i3;
- var v1 = new THREE.Vector2();
+ var _b3 = _i3 + 1;
- return function ( center, size ) {
+ var _c3 = _i3 + 2;
- var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
- this.min.copy( center ).sub( halfSize );
- this.max.copy( center ).add( halfSize );
+ intersection = checkBufferGeometryIntersection(this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, _a3, _b3, _c3);
- return this;
+ if (intersection) {
+ intersection.faceIndex = Math.floor(_i3 / 3); // triangle number in non-indexed buffer semantics
- };
+ intersects.push(intersection);
+ }
+ }
+ }
+ }
+ } else if (geometry.isGeometry) {
+ var isMultiMaterial = Array.isArray(material);
+ var vertices = geometry.vertices;
+ var faces = geometry.faces;
+ var uvs;
+ var faceVertexUvs = geometry.faceVertexUvs[0];
+ if (faceVertexUvs.length > 0) uvs = faceVertexUvs;
- }(),
+ for (var f = 0, fl = faces.length; f < fl; f++) {
+ var face = faces[f];
+ var faceMaterial = isMultiMaterial ? material[face.materialIndex] : material;
+ if (faceMaterial === undefined) continue;
+ var fvA = vertices[face.a];
+ var fvB = vertices[face.b];
+ var fvC = vertices[face.c];
+ intersection = checkIntersection(this, faceMaterial, raycaster, _ray, fvA, fvB, fvC, _intersectionPoint);
- copy: function ( box ) {
+ if (intersection) {
+ if (uvs && uvs[f]) {
+ var uvs_f = uvs[f];
- this.min.copy( box.min );
- this.max.copy( box.max );
+ _uvA.copy(uvs_f[0]);
- return this;
+ _uvB.copy(uvs_f[1]);
- },
+ _uvC.copy(uvs_f[2]);
- makeEmpty: function () {
+ intersection.uv = Triangle.getUV(_intersectionPoint, fvA, fvB, fvC, _uvA, _uvB, _uvC, new Vector2());
+ }
- this.min.x = this.min.y = Infinity;
- this.max.x = this.max.y = -Infinity;
+ intersection.face = face;
+ intersection.faceIndex = f;
+ intersects.push(intersection);
+ }
+ }
+ }
+ }
+ });
- return this;
+ function checkIntersection(object, material, raycaster, ray, pA, pB, pC, point) {
+ var intersect;
- },
+ if (material.side === BackSide) {
+ intersect = ray.intersectTriangle(pC, pB, pA, true, point);
+ } else {
+ intersect = ray.intersectTriangle(pA, pB, pC, material.side !== DoubleSide, point);
+ }
- empty: function () {
+ if (intersect === null) return null;
- // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+ _intersectionPointWorld.copy(point);
- return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
+ _intersectionPointWorld.applyMatrix4(object.matrixWorld);
- },
+ var distance = raycaster.ray.origin.distanceTo(_intersectionPointWorld);
+ if (distance < raycaster.near || distance > raycaster.far) return null;
+ return {
+ distance: distance,
+ point: _intersectionPointWorld.clone(),
+ object: object
+ };
+ }
- center: function ( optionalTarget ) {
+ function checkBufferGeometryIntersection(object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c) {
+ _vA.fromBufferAttribute(position, a);
- var result = optionalTarget || new THREE.Vector2();
- return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
+ _vB.fromBufferAttribute(position, b);
- },
+ _vC.fromBufferAttribute(position, c);
- size: function ( optionalTarget ) {
+ var morphInfluences = object.morphTargetInfluences;
- var result = optionalTarget || new THREE.Vector2();
- return result.subVectors( this.max, this.min );
+ if (material.morphTargets && morphPosition && morphInfluences) {
+ _morphA.set(0, 0, 0);
- },
+ _morphB.set(0, 0, 0);
- expandByPoint: function ( point ) {
+ _morphC.set(0, 0, 0);
- this.min.min( point );
- this.max.max( point );
+ for (var i = 0, il = morphPosition.length; i < il; i++) {
+ var influence = morphInfluences[i];
+ var morphAttribute = morphPosition[i];
+ if (influence === 0) continue;
- return this;
- },
+ _tempA.fromBufferAttribute(morphAttribute, a);
- expandByVector: function ( vector ) {
+ _tempB.fromBufferAttribute(morphAttribute, b);
- this.min.sub( vector );
- this.max.add( vector );
+ _tempC.fromBufferAttribute(morphAttribute, c);
- return this;
- },
+ if (morphTargetsRelative) {
+ _morphA.addScaledVector(_tempA, influence);
- expandByScalar: function ( scalar ) {
+ _morphB.addScaledVector(_tempB, influence);
- this.min.addScalar( -scalar );
- this.max.addScalar( scalar );
+ _morphC.addScaledVector(_tempC, influence);
+ } else {
+ _morphA.addScaledVector(_tempA.sub(_vA), influence);
- return this;
- },
+ _morphB.addScaledVector(_tempB.sub(_vB), influence);
- containsPoint: function ( point ) {
+ _morphC.addScaledVector(_tempC.sub(_vC), influence);
+ }
+ }
- if ( point.x < this.min.x || point.x > this.max.x ||
- point.y < this.min.y || point.y > this.max.y ) {
+ _vA.add(_morphA);
- return false;
+ _vB.add(_morphB);
+ _vC.add(_morphC);
}
- return true;
-
- },
-
- containsBox: function ( box ) {
+ if (object.isSkinnedMesh) {
+ object.boneTransform(a, _vA);
+ object.boneTransform(b, _vB);
+ object.boneTransform(c, _vC);
+ }
- if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&
- ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {
+ var intersection = checkIntersection(object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint);
- return true;
+ if (intersection) {
+ if (uv) {
+ _uvA.fromBufferAttribute(uv, a);
- }
+ _uvB.fromBufferAttribute(uv, b);
- return false;
+ _uvC.fromBufferAttribute(uv, c);
- },
+ intersection.uv = Triangle.getUV(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2());
+ }
- getParameter: function ( point, optionalTarget ) {
+ if (uv2) {
+ _uvA.fromBufferAttribute(uv2, a);
- // This can potentially have a divide by zero if the box
- // has a size dimension of 0.
+ _uvB.fromBufferAttribute(uv2, b);
- var result = optionalTarget || new THREE.Vector2();
+ _uvC.fromBufferAttribute(uv2, c);
- return result.set(
- ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
- ( point.y - this.min.y ) / ( this.max.y - this.min.y )
- );
+ intersection.uv2 = Triangle.getUV(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2());
+ }
- },
+ var face = new Face3(a, b, c);
+ Triangle.getNormal(_vA, _vB, _vC, face.normal);
+ intersection.face = face;
+ }
- isIntersectionBox: function ( box ) {
+ return intersection;
+ }
- // using 6 splitting planes to rule out intersections.
+ var BoxBufferGeometry = /*#__PURE__*/function (_BufferGeometry) {
+ _inheritsLoose(BoxBufferGeometry, _BufferGeometry);
- if ( box.max.x < this.min.x || box.min.x > this.max.x ||
- box.max.y < this.min.y || box.min.y > this.max.y ) {
+ function BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {
+ var _this;
- return false;
+ if (width === void 0) {
+ width = 1;
+ }
- }
+ if (height === void 0) {
+ height = 1;
+ }
- return true;
+ if (depth === void 0) {
+ depth = 1;
+ }
- },
+ if (widthSegments === void 0) {
+ widthSegments = 1;
+ }
- clampPoint: function ( point, optionalTarget ) {
+ if (heightSegments === void 0) {
+ heightSegments = 1;
+ }
- var result = optionalTarget || new THREE.Vector2();
- return result.copy( point ).clamp( this.min, this.max );
+ if (depthSegments === void 0) {
+ depthSegments = 1;
+ }
- },
+ _this = _BufferGeometry.call(this) || this;
+ _this.type = 'BoxBufferGeometry';
+ _this.parameters = {
+ width: width,
+ height: height,
+ depth: depth,
+ widthSegments: widthSegments,
+ heightSegments: heightSegments,
+ depthSegments: depthSegments
+ };
- distanceToPoint: function () {
+ var scope = _assertThisInitialized(_this); // segments
- var v1 = new THREE.Vector2();
- return function ( point ) {
+ widthSegments = Math.floor(widthSegments);
+ heightSegments = Math.floor(heightSegments);
+ depthSegments = Math.floor(depthSegments); // buffers
- var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
- return clampedPoint.sub( point ).length();
+ var indices = [];
+ var vertices = [];
+ var normals = [];
+ var uvs = []; // helper variables
- };
+ var numberOfVertices = 0;
+ var groupStart = 0; // build each side of the box geometry
- }(),
+ buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px
- intersect: function ( box ) {
+ buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx
- this.min.max( box.min );
- this.max.min( box.max );
+ buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py
- return this;
+ buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny
- },
+ buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz
- union: function ( box ) {
+ buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz
+ // build geometry
- this.min.min( box.min );
- this.max.max( box.max );
+ _this.setIndex(indices);
- return this;
+ _this.setAttribute('position', new Float32BufferAttribute(vertices, 3));
- },
+ _this.setAttribute('normal', new Float32BufferAttribute(normals, 3));
- translate: function ( offset ) {
+ _this.setAttribute('uv', new Float32BufferAttribute(uvs, 2));
- this.min.add( offset );
- this.max.add( offset );
+ function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) {
+ var segmentWidth = width / gridX;
+ var segmentHeight = height / gridY;
+ var widthHalf = width / 2;
+ var heightHalf = height / 2;
+ var depthHalf = depth / 2;
+ var gridX1 = gridX + 1;
+ var gridY1 = gridY + 1;
+ var vertexCounter = 0;
+ var groupCount = 0;
+ var vector = new Vector3(); // generate vertices, normals and uvs
- return this;
+ for (var iy = 0; iy < gridY1; iy++) {
+ var y = iy * segmentHeight - heightHalf;
- },
+ for (var ix = 0; ix < gridX1; ix++) {
+ var x = ix * segmentWidth - widthHalf; // set values to correct vector component
- equals: function ( box ) {
+ vector[u] = x * udir;
+ vector[v] = y * vdir;
+ vector[w] = depthHalf; // now apply vector to vertex buffer
- return box.min.equals( this.min ) && box.max.equals( this.max );
+ vertices.push(vector.x, vector.y, vector.z); // set values to correct vector component
- },
+ vector[u] = 0;
+ vector[v] = 0;
+ vector[w] = depth > 0 ? 1 : -1; // now apply vector to normal buffer
- clone: function () {
+ normals.push(vector.x, vector.y, vector.z); // uvs
- return new THREE.Box2().copy( this );
+ uvs.push(ix / gridX);
+ uvs.push(1 - iy / gridY); // counters
- }
+ vertexCounter += 1;
+ }
+ } // indices
+ // 1. you need three indices to draw a single face
+ // 2. a single segment consists of two faces
+ // 3. so we need to generate six (2*3) indices per segment
-};
-/**
- * @author bhouston / http://exocortex.com
- * @author WestLangley / http://github.com/WestLangley
- */
+ for (var _iy = 0; _iy < gridY; _iy++) {
+ for (var _ix = 0; _ix < gridX; _ix++) {
+ var a = numberOfVertices + _ix + gridX1 * _iy;
+ var b = numberOfVertices + _ix + gridX1 * (_iy + 1);
+ var c = numberOfVertices + (_ix + 1) + gridX1 * (_iy + 1);
+ var d = numberOfVertices + (_ix + 1) + gridX1 * _iy; // faces
-THREE.Box3 = function ( min, max ) {
+ indices.push(a, b, d);
+ indices.push(b, c, d); // increase counter
- this.min = ( min !== undefined ) ? min : new THREE.Vector3( Infinity, Infinity, Infinity );
- this.max = ( max !== undefined ) ? max : new THREE.Vector3( -Infinity, -Infinity, -Infinity );
+ groupCount += 6;
+ }
+ } // add a group to the geometry. this will ensure multi material support
-};
-THREE.Box3.prototype = {
+ scope.addGroup(groupStart, groupCount, materialIndex); // calculate new start value for groups
- constructor: THREE.Box3,
+ groupStart += groupCount; // update total number of vertices
- set: function ( min, max ) {
+ numberOfVertices += vertexCounter;
+ }
- this.min.copy( min );
- this.max.copy( max );
+ return _this;
+ }
- return this;
+ return BoxBufferGeometry;
+ }(BufferGeometry);
- },
+ /**
+ * Uniform Utilities
+ */
+ function cloneUniforms(src) {
+ var dst = {};
- addPoint: function ( point ) {
+ for (var u in src) {
+ dst[u] = {};
- if ( point.x < this.min.x ) {
+ for (var p in src[u]) {
+ var property = src[u][p];
- this.min.x = point.x;
+ if (property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture)) {
+ dst[u][p] = property.clone();
+ } else if (Array.isArray(property)) {
+ dst[u][p] = property.slice();
+ } else {
+ dst[u][p] = property;
+ }
+ }
+ }
- } else if ( point.x > this.max.x ) {
+ return dst;
+ }
+ function mergeUniforms(uniforms) {
+ var merged = {};
- this.max.x = point.x;
+ for (var u = 0; u < uniforms.length; u++) {
+ var tmp = cloneUniforms(uniforms[u]);
+ for (var p in tmp) {
+ merged[p] = tmp[p];
+ }
}
- if ( point.y < this.min.y ) {
-
- this.min.y = point.y;
+ return merged;
+ } // Legacy
- } else if ( point.y > this.max.y ) {
+ var UniformsUtils = {
+ clone: cloneUniforms,
+ merge: mergeUniforms
+ };
- this.max.y = point.y;
+ var default_vertex = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";
- }
+ var default_fragment = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
- if ( point.z < this.min.z ) {
+ /**
+ * parameters = {
+ * defines: { "label" : "value" },
+ * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
+ *
+ * fragmentShader: ,
+ * vertexShader: ,
+ *
+ * wireframe: ,
+ * wireframeLinewidth: ,
+ *
+ * lights: ,
+ *
+ * skinning: ,
+ * morphTargets: ,
+ * morphNormals:
+ * }
+ */
- this.min.z = point.z;
+ function ShaderMaterial(parameters) {
+ Material.call(this);
+ this.type = 'ShaderMaterial';
+ this.defines = {};
+ this.uniforms = {};
+ this.vertexShader = default_vertex;
+ this.fragmentShader = default_fragment;
+ this.linewidth = 1;
+ this.wireframe = false;
+ this.wireframeLinewidth = 1;
+ this.fog = false; // set to use scene fog
- } else if ( point.z > this.max.z ) {
+ this.lights = false; // set to use scene lights
- this.max.z = point.z;
+ this.clipping = false; // set to use user-defined clipping planes
- }
-
- return this;
+ this.skinning = false; // set to use skinning attribute streams
- },
+ this.morphTargets = false; // set to use morph targets
- setFromPoints: function ( points ) {
+ this.morphNormals = false; // set to use morph normals
- if ( points.length > 0 ) {
+ this.extensions = {
+ derivatives: false,
+ // set to use derivatives
+ fragDepth: false,
+ // set to use fragment depth values
+ drawBuffers: false,
+ // set to use draw buffers
+ shaderTextureLOD: false // set to use shader texture LOD
- var point = points[ 0 ];
+ }; // When rendered geometry doesn't include these attributes but the material does,
+ // use these default values in WebGL. This avoids errors when buffer data is missing.
- this.min.copy( point );
- this.max.copy( point );
+ this.defaultAttributeValues = {
+ 'color': [1, 1, 1],
+ 'uv': [0, 0],
+ 'uv2': [0, 0]
+ };
+ this.index0AttributeName = undefined;
+ this.uniformsNeedUpdate = false;
+ this.glslVersion = null;
+
+ if (parameters !== undefined) {
+ if (parameters.attributes !== undefined) {
+ console.error('THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.');
+ }
+
+ this.setValues(parameters);
+ }
+ }
+
+ ShaderMaterial.prototype = Object.create(Material.prototype);
+ ShaderMaterial.prototype.constructor = ShaderMaterial;
+ ShaderMaterial.prototype.isShaderMaterial = true;
+
+ ShaderMaterial.prototype.copy = function (source) {
+ Material.prototype.copy.call(this, source);
+ this.fragmentShader = source.fragmentShader;
+ this.vertexShader = source.vertexShader;
+ this.uniforms = cloneUniforms(source.uniforms);
+ this.defines = Object.assign({}, source.defines);
+ this.wireframe = source.wireframe;
+ this.wireframeLinewidth = source.wireframeLinewidth;
+ this.lights = source.lights;
+ this.clipping = source.clipping;
+ this.skinning = source.skinning;
+ this.morphTargets = source.morphTargets;
+ this.morphNormals = source.morphNormals;
+ this.extensions = Object.assign({}, source.extensions);
+ this.glslVersion = source.glslVersion;
+ return this;
+ };
- for ( var i = 1, il = points.length; i < il; i ++ ) {
+ ShaderMaterial.prototype.toJSON = function (meta) {
+ var data = Material.prototype.toJSON.call(this, meta);
+ data.glslVersion = this.glslVersion;
+ data.uniforms = {};
- this.addPoint( points[ i ] )
+ for (var name in this.uniforms) {
+ var uniform = this.uniforms[name];
+ var value = uniform.value;
+ if (value && value.isTexture) {
+ data.uniforms[name] = {
+ type: 't',
+ value: value.toJSON(meta).uuid
+ };
+ } else if (value && value.isColor) {
+ data.uniforms[name] = {
+ type: 'c',
+ value: value.getHex()
+ };
+ } else if (value && value.isVector2) {
+ data.uniforms[name] = {
+ type: 'v2',
+ value: value.toArray()
+ };
+ } else if (value && value.isVector3) {
+ data.uniforms[name] = {
+ type: 'v3',
+ value: value.toArray()
+ };
+ } else if (value && value.isVector4) {
+ data.uniforms[name] = {
+ type: 'v4',
+ value: value.toArray()
+ };
+ } else if (value && value.isMatrix3) {
+ data.uniforms[name] = {
+ type: 'm3',
+ value: value.toArray()
+ };
+ } else if (value && value.isMatrix4) {
+ data.uniforms[name] = {
+ type: 'm4',
+ value: value.toArray()
+ };
+ } else {
+ data.uniforms[name] = {
+ value: value
+ }; // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far
}
+ }
- } else {
-
- this.makeEmpty();
+ if (Object.keys(this.defines).length > 0) data.defines = this.defines;
+ data.vertexShader = this.vertexShader;
+ data.fragmentShader = this.fragmentShader;
+ var extensions = {};
+ for (var key in this.extensions) {
+ if (this.extensions[key] === true) extensions[key] = true;
}
- return this;
+ if (Object.keys(extensions).length > 0) data.extensions = extensions;
+ return data;
+ };
- },
+ function Camera() {
+ Object3D.call(this);
+ this.type = 'Camera';
+ this.matrixWorldInverse = new Matrix4();
+ this.projectionMatrix = new Matrix4();
+ this.projectionMatrixInverse = new Matrix4();
+ }
+
+ Camera.prototype = Object.assign(Object.create(Object3D.prototype), {
+ constructor: Camera,
+ isCamera: true,
+ copy: function copy(source, recursive) {
+ Object3D.prototype.copy.call(this, source, recursive);
+ this.matrixWorldInverse.copy(source.matrixWorldInverse);
+ this.projectionMatrix.copy(source.projectionMatrix);
+ this.projectionMatrixInverse.copy(source.projectionMatrixInverse);
+ return this;
+ },
+ getWorldDirection: function getWorldDirection(target) {
+ if (target === undefined) {
+ console.warn('THREE.Camera: .getWorldDirection() target is now required');
+ target = new Vector3();
+ }
- setFromCenterAndSize: function() {
+ this.updateWorldMatrix(true, false);
+ var e = this.matrixWorld.elements;
+ return target.set(-e[8], -e[9], -e[10]).normalize();
+ },
+ updateMatrixWorld: function updateMatrixWorld(force) {
+ Object3D.prototype.updateMatrixWorld.call(this, force);
+ this.matrixWorldInverse.getInverse(this.matrixWorld);
+ },
+ updateWorldMatrix: function updateWorldMatrix(updateParents, updateChildren) {
+ Object3D.prototype.updateWorldMatrix.call(this, updateParents, updateChildren);
+ this.matrixWorldInverse.getInverse(this.matrixWorld);
+ },
+ clone: function clone() {
+ return new this.constructor().copy(this);
+ }
+ });
+
+ function PerspectiveCamera(fov, aspect, near, far) {
+ Camera.call(this);
+ this.type = 'PerspectiveCamera';
+ this.fov = fov !== undefined ? fov : 50;
+ this.zoom = 1;
+ this.near = near !== undefined ? near : 0.1;
+ this.far = far !== undefined ? far : 2000;
+ this.focus = 10;
+ this.aspect = aspect !== undefined ? aspect : 1;
+ this.view = null;
+ this.filmGauge = 35; // width of the film (default in millimeters)
+
+ this.filmOffset = 0; // horizontal film offset (same unit as gauge)
+
+ this.updateProjectionMatrix();
+ }
+
+ PerspectiveCamera.prototype = Object.assign(Object.create(Camera.prototype), {
+ constructor: PerspectiveCamera,
+ isPerspectiveCamera: true,
+ copy: function copy(source, recursive) {
+ Camera.prototype.copy.call(this, source, recursive);
+ this.fov = source.fov;
+ this.zoom = source.zoom;
+ this.near = source.near;
+ this.far = source.far;
+ this.focus = source.focus;
+ this.aspect = source.aspect;
+ this.view = source.view === null ? null : Object.assign({}, source.view);
+ this.filmGauge = source.filmGauge;
+ this.filmOffset = source.filmOffset;
+ return this;
+ },
- var v1 = new THREE.Vector3();
+ /**
+ * Sets the FOV by focal length in respect to the current .filmGauge.
+ *
+ * The default film gauge is 35, so that the focal length can be specified for
+ * a 35mm (full frame) camera.
+ *
+ * Values for focal length and film gauge must have the same unit.
+ */
+ setFocalLength: function setFocalLength(focalLength) {
+ // see http://www.bobatkins.com/photography/technical/field_of_view.html
+ var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
+ this.fov = MathUtils.RAD2DEG * 2 * Math.atan(vExtentSlope);
+ this.updateProjectionMatrix();
+ },
- return function ( center, size ) {
+ /**
+ * Calculates the focal length from the current .fov and .filmGauge.
+ */
+ getFocalLength: function getFocalLength() {
+ var vExtentSlope = Math.tan(MathUtils.DEG2RAD * 0.5 * this.fov);
+ return 0.5 * this.getFilmHeight() / vExtentSlope;
+ },
+ getEffectiveFOV: function getEffectiveFOV() {
+ return MathUtils.RAD2DEG * 2 * Math.atan(Math.tan(MathUtils.DEG2RAD * 0.5 * this.fov) / this.zoom);
+ },
+ getFilmWidth: function getFilmWidth() {
+ // film not completely covered in portrait format (aspect < 1)
+ return this.filmGauge * Math.min(this.aspect, 1);
+ },
+ getFilmHeight: function getFilmHeight() {
+ // film not completely covered in landscape format (aspect > 1)
+ return this.filmGauge / Math.max(this.aspect, 1);
+ },
- var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
+ /**
+ * Sets an offset in a larger frustum. This is useful for multi-window or
+ * multi-monitor/multi-machine setups.
+ *
+ * For example, if you have 3x2 monitors and each monitor is 1920x1080 and
+ * the monitors are in grid like this
+ *
+ * +---+---+---+
+ * | A | B | C |
+ * +---+---+---+
+ * | D | E | F |
+ * +---+---+---+
+ *
+ * then for each monitor you would call it like this
+ *
+ * const w = 1920;
+ * const h = 1080;
+ * const fullWidth = w * 3;
+ * const fullHeight = h * 2;
+ *
+ * --A--
+ * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
+ * --B--
+ * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
+ * --C--
+ * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
+ * --D--
+ * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
+ * --E--
+ * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
+ * --F--
+ * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
+ *
+ * Note there is no reason monitors have to be the same size or in a grid.
+ */
+ setViewOffset: function setViewOffset(fullWidth, fullHeight, x, y, width, height) {
+ this.aspect = fullWidth / fullHeight;
+
+ if (this.view === null) {
+ this.view = {
+ enabled: true,
+ fullWidth: 1,
+ fullHeight: 1,
+ offsetX: 0,
+ offsetY: 0,
+ width: 1,
+ height: 1
+ };
+ }
- this.min.copy( center ).sub( halfSize );
- this.max.copy( center ).add( halfSize );
+ this.view.enabled = true;
+ this.view.fullWidth = fullWidth;
+ this.view.fullHeight = fullHeight;
+ this.view.offsetX = x;
+ this.view.offsetY = y;
+ this.view.width = width;
+ this.view.height = height;
+ this.updateProjectionMatrix();
+ },
+ clearViewOffset: function clearViewOffset() {
+ if (this.view !== null) {
+ this.view.enabled = false;
+ }
- return this;
+ this.updateProjectionMatrix();
+ },
+ updateProjectionMatrix: function updateProjectionMatrix() {
+ var near = this.near;
+ var top = near * Math.tan(MathUtils.DEG2RAD * 0.5 * this.fov) / this.zoom;
+ var height = 2 * top;
+ var width = this.aspect * height;
+ var left = -0.5 * width;
+ var view = this.view;
+
+ if (this.view !== null && this.view.enabled) {
+ var fullWidth = view.fullWidth,
+ fullHeight = view.fullHeight;
+ left += view.offsetX * width / fullWidth;
+ top -= view.offsetY * height / fullHeight;
+ width *= view.width / fullWidth;
+ height *= view.height / fullHeight;
+ }
+
+ var skew = this.filmOffset;
+ if (skew !== 0) left += near * skew / this.getFilmWidth();
+ this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far);
+ this.projectionMatrixInverse.getInverse(this.projectionMatrix);
+ },
+ toJSON: function toJSON(meta) {
+ var data = Object3D.prototype.toJSON.call(this, meta);
+ data.object.fov = this.fov;
+ data.object.zoom = this.zoom;
+ data.object.near = this.near;
+ data.object.far = this.far;
+ data.object.focus = this.focus;
+ data.object.aspect = this.aspect;
+ if (this.view !== null) data.object.view = Object.assign({}, this.view);
+ data.object.filmGauge = this.filmGauge;
+ data.object.filmOffset = this.filmOffset;
+ return data;
+ }
+ });
+
+ var fov = 90,
+ aspect = 1;
+
+ function CubeCamera(near, far, renderTarget) {
+ Object3D.call(this);
+ this.type = 'CubeCamera';
+
+ if (renderTarget.isWebGLCubeRenderTarget !== true) {
+ console.error('THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.');
+ return;
+ }
+ this.renderTarget = renderTarget;
+ var cameraPX = new PerspectiveCamera(fov, aspect, near, far);
+ cameraPX.layers = this.layers;
+ cameraPX.up.set(0, -1, 0);
+ cameraPX.lookAt(new Vector3(1, 0, 0));
+ this.add(cameraPX);
+ var cameraNX = new PerspectiveCamera(fov, aspect, near, far);
+ cameraNX.layers = this.layers;
+ cameraNX.up.set(0, -1, 0);
+ cameraNX.lookAt(new Vector3(-1, 0, 0));
+ this.add(cameraNX);
+ var cameraPY = new PerspectiveCamera(fov, aspect, near, far);
+ cameraPY.layers = this.layers;
+ cameraPY.up.set(0, 0, 1);
+ cameraPY.lookAt(new Vector3(0, 1, 0));
+ this.add(cameraPY);
+ var cameraNY = new PerspectiveCamera(fov, aspect, near, far);
+ cameraNY.layers = this.layers;
+ cameraNY.up.set(0, 0, -1);
+ cameraNY.lookAt(new Vector3(0, -1, 0));
+ this.add(cameraNY);
+ var cameraPZ = new PerspectiveCamera(fov, aspect, near, far);
+ cameraPZ.layers = this.layers;
+ cameraPZ.up.set(0, -1, 0);
+ cameraPZ.lookAt(new Vector3(0, 0, 1));
+ this.add(cameraPZ);
+ var cameraNZ = new PerspectiveCamera(fov, aspect, near, far);
+ cameraNZ.layers = this.layers;
+ cameraNZ.up.set(0, -1, 0);
+ cameraNZ.lookAt(new Vector3(0, 0, -1));
+ this.add(cameraNZ);
+
+ this.update = function (renderer, scene) {
+ if (this.parent === null) this.updateMatrixWorld();
+ var currentXrEnabled = renderer.xr.enabled;
+ var currentRenderTarget = renderer.getRenderTarget();
+ renderer.xr.enabled = false;
+ var generateMipmaps = renderTarget.texture.generateMipmaps;
+ renderTarget.texture.generateMipmaps = false;
+ renderer.setRenderTarget(renderTarget, 0);
+ renderer.render(scene, cameraPX);
+ renderer.setRenderTarget(renderTarget, 1);
+ renderer.render(scene, cameraNX);
+ renderer.setRenderTarget(renderTarget, 2);
+ renderer.render(scene, cameraPY);
+ renderer.setRenderTarget(renderTarget, 3);
+ renderer.render(scene, cameraNY);
+ renderer.setRenderTarget(renderTarget, 4);
+ renderer.render(scene, cameraPZ);
+ renderTarget.texture.generateMipmaps = generateMipmaps;
+ renderer.setRenderTarget(renderTarget, 5);
+ renderer.render(scene, cameraNZ);
+ renderer.setRenderTarget(currentRenderTarget);
+ renderer.xr.enabled = currentXrEnabled;
};
+ }
- }(),
-
- setFromObject: function() {
-
- // Computes the world-axis-aligned bounding box of an object (including its children),
- // accounting for both the object's, and childrens', world transforms
+ CubeCamera.prototype = Object.create(Object3D.prototype);
+ CubeCamera.prototype.constructor = CubeCamera;
- var v1 = new THREE.Vector3();
+ function CubeTexture(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
+ images = images !== undefined ? images : [];
+ mapping = mapping !== undefined ? mapping : CubeReflectionMapping;
+ format = format !== undefined ? format : RGBFormat;
+ Texture.call(this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
+ this.flipY = false; // Why CubeTexture._needsFlipEnvMap is necessary:
+ //
+ // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)
+ // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,
+ // in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.
+ // three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped
+ // and the flag _needsFlipEnvMap controls this conversion. The flip is not required (and thus _needsFlipEnvMap is set to false)
+ // when using WebGLCubeRenderTarget.texture as a cube texture.
+
+ this._needsFlipEnvMap = true;
+ }
+
+ CubeTexture.prototype = Object.create(Texture.prototype);
+ CubeTexture.prototype.constructor = CubeTexture;
+ CubeTexture.prototype.isCubeTexture = true;
+ Object.defineProperty(CubeTexture.prototype, 'images', {
+ get: function get() {
+ return this.image;
+ },
+ set: function set(value) {
+ this.image = value;
+ }
+ });
- return function( object ) {
+ function WebGLCubeRenderTarget(size, options, dummy) {
+ if (Number.isInteger(options)) {
+ console.warn('THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )');
+ options = dummy;
+ }
- var scope = this;
+ WebGLRenderTarget.call(this, size, size, options);
+ options = options || {};
+ this.texture = new CubeTexture(undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding);
+ this.texture._needsFlipEnvMap = false;
+ }
- object.updateMatrixWorld( true );
+ WebGLCubeRenderTarget.prototype = Object.create(WebGLRenderTarget.prototype);
+ WebGLCubeRenderTarget.prototype.constructor = WebGLCubeRenderTarget;
+ WebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;
- this.makeEmpty();
+ WebGLCubeRenderTarget.prototype.fromEquirectangularTexture = function (renderer, texture) {
+ this.texture.type = texture.type;
+ this.texture.format = RGBAFormat; // see #18859
- object.traverse( function ( node ) {
+ this.texture.encoding = texture.encoding;
+ this.texture.generateMipmaps = texture.generateMipmaps;
+ this.texture.minFilter = texture.minFilter;
+ this.texture.magFilter = texture.magFilter;
+ var shader = {
+ uniforms: {
+ tEquirect: {
+ value: null
+ }
+ },
+ vertexShader:
+ /* glsl */
+ "\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t#include \n\t\t\t\t#include \n\n\t\t\t}\n\t\t",
+ fragmentShader:
+ /* glsl */
+ "\n\n\t\t\tuniform sampler2D tEquirect;\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t}\n\t\t"
+ };
+ var geometry = new BoxBufferGeometry(5, 5, 5);
+ var material = new ShaderMaterial({
+ name: 'CubemapFromEquirect',
+ uniforms: cloneUniforms(shader.uniforms),
+ vertexShader: shader.vertexShader,
+ fragmentShader: shader.fragmentShader,
+ side: BackSide,
+ blending: NoBlending
+ });
+ material.uniforms.tEquirect.value = texture;
+ var mesh = new Mesh(geometry, material);
+ var currentMinFilter = texture.minFilter; // Avoid blurred poles
+
+ if (texture.minFilter === LinearMipmapLinearFilter) texture.minFilter = LinearFilter;
+ var camera = new CubeCamera(1, 10, this);
+ camera.update(renderer, mesh);
+ texture.minFilter = currentMinFilter;
+ mesh.geometry.dispose();
+ mesh.material.dispose();
+ return this;
+ };
- if ( node.geometry !== undefined && node.geometry.vertices !== undefined ) {
+ WebGLCubeRenderTarget.prototype.clear = function (renderer, color, depth, stencil) {
+ var currentRenderTarget = renderer.getRenderTarget();
- var vertices = node.geometry.vertices;
+ for (var i = 0; i < 6; i++) {
+ renderer.setRenderTarget(this, i);
+ renderer.clear(color, depth, stencil);
+ }
- for ( var i = 0, il = vertices.length; i < il; i++ ) {
+ renderer.setRenderTarget(currentRenderTarget);
+ };
- v1.copy( vertices[ i ] );
+ function DataTexture(data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding) {
+ Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
+ this.image = {
+ data: data || null,
+ width: width || 1,
+ height: height || 1
+ };
+ this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
+ this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
+ this.generateMipmaps = false;
+ this.flipY = false;
+ this.unpackAlignment = 1;
+ this.needsUpdate = true;
+ }
- v1.applyMatrix4( node.matrixWorld );
+ DataTexture.prototype = Object.create(Texture.prototype);
+ DataTexture.prototype.constructor = DataTexture;
+ DataTexture.prototype.isDataTexture = true;
- scope.expandByPoint( v1 );
+ var _sphere$1 = /*@__PURE__*/new Sphere();
- }
+ var _vector$5 = /*@__PURE__*/new Vector3();
- }
+ var Frustum = /*#__PURE__*/function () {
+ function Frustum(p0, p1, p2, p3, p4, p5) {
+ this.planes = [p0 !== undefined ? p0 : new Plane(), p1 !== undefined ? p1 : new Plane(), p2 !== undefined ? p2 : new Plane(), p3 !== undefined ? p3 : new Plane(), p4 !== undefined ? p4 : new Plane(), p5 !== undefined ? p5 : new Plane()];
+ }
- } );
+ var _proto = Frustum.prototype;
+ _proto.set = function set(p0, p1, p2, p3, p4, p5) {
+ var planes = this.planes;
+ planes[0].copy(p0);
+ planes[1].copy(p1);
+ planes[2].copy(p2);
+ planes[3].copy(p3);
+ planes[4].copy(p4);
+ planes[5].copy(p5);
return this;
+ };
+ _proto.clone = function clone() {
+ return new this.constructor().copy(this);
};
- }(),
+ _proto.copy = function copy(frustum) {
+ var planes = this.planes;
- copy: function ( box ) {
+ for (var i = 0; i < 6; i++) {
+ planes[i].copy(frustum.planes[i]);
+ }
- this.min.copy( box.min );
- this.max.copy( box.max );
+ return this;
+ };
- return this;
+ _proto.setFromProjectionMatrix = function setFromProjectionMatrix(m) {
+ var planes = this.planes;
+ var me = m.elements;
+ var me0 = me[0],
+ me1 = me[1],
+ me2 = me[2],
+ me3 = me[3];
+ var me4 = me[4],
+ me5 = me[5],
+ me6 = me[6],
+ me7 = me[7];
+ var me8 = me[8],
+ me9 = me[9],
+ me10 = me[10],
+ me11 = me[11];
+ var me12 = me[12],
+ me13 = me[13],
+ me14 = me[14],
+ me15 = me[15];
+ planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize();
+ planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize();
+ planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize();
+ planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize();
+ planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize();
+ planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize();
+ return this;
+ };
- },
+ _proto.intersectsObject = function intersectsObject(object) {
+ var geometry = object.geometry;
+ if (geometry.boundingSphere === null) geometry.computeBoundingSphere();
- makeEmpty: function () {
+ _sphere$1.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld);
- this.min.x = this.min.y = this.min.z = Infinity;
- this.max.x = this.max.y = this.max.z = -Infinity;
+ return this.intersectsSphere(_sphere$1);
+ };
- return this;
+ _proto.intersectsSprite = function intersectsSprite(sprite) {
+ _sphere$1.center.set(0, 0, 0);
- },
+ _sphere$1.radius = 0.7071067811865476;
- empty: function () {
+ _sphere$1.applyMatrix4(sprite.matrixWorld);
- // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+ return this.intersectsSphere(_sphere$1);
+ };
- return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );
+ _proto.intersectsSphere = function intersectsSphere(sphere) {
+ var planes = this.planes;
+ var center = sphere.center;
+ var negRadius = -sphere.radius;
- },
+ for (var i = 0; i < 6; i++) {
+ var distance = planes[i].distanceToPoint(center);
- center: function ( optionalTarget ) {
+ if (distance < negRadius) {
+ return false;
+ }
+ }
- var result = optionalTarget || new THREE.Vector3();
- return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
+ return true;
+ };
- },
+ _proto.intersectsBox = function intersectsBox(box) {
+ var planes = this.planes;
- size: function ( optionalTarget ) {
+ for (var i = 0; i < 6; i++) {
+ var plane = planes[i]; // corner at max distance
- var result = optionalTarget || new THREE.Vector3();
- return result.subVectors( this.max, this.min );
+ _vector$5.x = plane.normal.x > 0 ? box.max.x : box.min.x;
+ _vector$5.y = plane.normal.y > 0 ? box.max.y : box.min.y;
+ _vector$5.z = plane.normal.z > 0 ? box.max.z : box.min.z;
- },
+ if (plane.distanceToPoint(_vector$5) < 0) {
+ return false;
+ }
+ }
- expandByPoint: function ( point ) {
+ return true;
+ };
- this.min.min( point );
- this.max.max( point );
+ _proto.containsPoint = function containsPoint(point) {
+ var planes = this.planes;
- return this;
+ for (var i = 0; i < 6; i++) {
+ if (planes[i].distanceToPoint(point) < 0) {
+ return false;
+ }
+ }
- },
+ return true;
+ };
- expandByVector: function ( vector ) {
+ return Frustum;
+ }();
- this.min.sub( vector );
- this.max.add( vector );
+ function WebGLAnimation() {
+ var context = null;
+ var isAnimating = false;
+ var animationLoop = null;
+ var requestId = null;
- return this;
+ function onAnimationFrame(time, frame) {
+ animationLoop(time, frame);
+ requestId = context.requestAnimationFrame(onAnimationFrame);
+ }
- },
+ return {
+ start: function start() {
+ if (isAnimating === true) return;
+ if (animationLoop === null) return;
+ requestId = context.requestAnimationFrame(onAnimationFrame);
+ isAnimating = true;
+ },
+ stop: function stop() {
+ context.cancelAnimationFrame(requestId);
+ isAnimating = false;
+ },
+ setAnimationLoop: function setAnimationLoop(callback) {
+ animationLoop = callback;
+ },
+ setContext: function setContext(value) {
+ context = value;
+ }
+ };
+ }
- expandByScalar: function ( scalar ) {
+ function WebGLAttributes(gl, capabilities) {
+ var isWebGL2 = capabilities.isWebGL2;
+ var buffers = new WeakMap();
+
+ function createBuffer(attribute, bufferType) {
+ var array = attribute.array;
+ var usage = attribute.usage;
+ var buffer = gl.createBuffer();
+ gl.bindBuffer(bufferType, buffer);
+ gl.bufferData(bufferType, array, usage);
+ attribute.onUploadCallback();
+ var type = 5126;
+
+ if (array instanceof Float32Array) {
+ type = 5126;
+ } else if (array instanceof Float64Array) {
+ console.warn('THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.');
+ } else if (array instanceof Uint16Array) {
+ type = 5123;
+ } else if (array instanceof Int16Array) {
+ type = 5122;
+ } else if (array instanceof Uint32Array) {
+ type = 5125;
+ } else if (array instanceof Int32Array) {
+ type = 5124;
+ } else if (array instanceof Int8Array) {
+ type = 5120;
+ } else if (array instanceof Uint8Array) {
+ type = 5121;
+ }
+
+ return {
+ buffer: buffer,
+ type: type,
+ bytesPerElement: array.BYTES_PER_ELEMENT,
+ version: attribute.version
+ };
+ }
- this.min.addScalar( -scalar );
- this.max.addScalar( scalar );
+ function updateBuffer(buffer, attribute, bufferType) {
+ var array = attribute.array;
+ var updateRange = attribute.updateRange;
+ gl.bindBuffer(bufferType, buffer);
- return this;
+ if (updateRange.count === -1) {
+ // Not using update ranges
+ gl.bufferSubData(bufferType, 0, array);
+ } else {
+ if (isWebGL2) {
+ gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array, updateRange.offset, updateRange.count);
+ } else {
+ gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray(updateRange.offset, updateRange.offset + updateRange.count));
+ }
- },
+ updateRange.count = -1; // reset range
+ }
+ } //
- containsPoint: function ( point ) {
- if ( point.x < this.min.x || point.x > this.max.x ||
- point.y < this.min.y || point.y > this.max.y ||
- point.z < this.min.z || point.z > this.max.z ) {
+ function get(attribute) {
+ if (attribute.isInterleavedBufferAttribute) attribute = attribute.data;
+ return buffers.get(attribute);
+ }
- return false;
+ function remove(attribute) {
+ if (attribute.isInterleavedBufferAttribute) attribute = attribute.data;
+ var data = buffers.get(attribute);
+ if (data) {
+ gl.deleteBuffer(data.buffer);
+ buffers.delete(attribute);
+ }
}
- return true;
+ function update(attribute, bufferType) {
+ if (attribute.isGLBufferAttribute) {
+ var cached = buffers.get(attribute);
- },
+ if (!cached || cached.version < attribute.version) {
+ buffers.set(attribute, {
+ buffer: attribute.buffer,
+ type: attribute.type,
+ bytesPerElement: attribute.elementSize,
+ version: attribute.version
+ });
+ }
- containsBox: function ( box ) {
+ return;
+ }
- if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&
- ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&
- ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {
-
- return true;
+ if (attribute.isInterleavedBufferAttribute) attribute = attribute.data;
+ var data = buffers.get(attribute);
+ if (data === undefined) {
+ buffers.set(attribute, createBuffer(attribute, bufferType));
+ } else if (data.version < attribute.version) {
+ updateBuffer(data.buffer, attribute, bufferType);
+ data.version = attribute.version;
+ }
}
- return false;
-
- },
+ return {
+ get: get,
+ remove: remove,
+ update: update
+ };
+ }
- getParameter: function ( point, optionalTarget ) {
+ var PlaneBufferGeometry = /*#__PURE__*/function (_BufferGeometry) {
+ _inheritsLoose(PlaneBufferGeometry, _BufferGeometry);
- // This can potentially have a divide by zero if the box
- // has a size dimension of 0.
+ function PlaneBufferGeometry(width, height, widthSegments, heightSegments) {
+ var _this;
- var result = optionalTarget || new THREE.Vector3();
+ _this = _BufferGeometry.call(this) || this;
+ _this.type = 'PlaneBufferGeometry';
+ _this.parameters = {
+ width: width,
+ height: height,
+ widthSegments: widthSegments,
+ heightSegments: heightSegments
+ };
+ width = width || 1;
+ height = height || 1;
+ var width_half = width / 2;
+ var height_half = height / 2;
+ var gridX = Math.floor(widthSegments) || 1;
+ var gridY = Math.floor(heightSegments) || 1;
+ var gridX1 = gridX + 1;
+ var gridY1 = gridY + 1;
+ var segment_width = width / gridX;
+ var segment_height = height / gridY; // buffers
+
+ var indices = [];
+ var vertices = [];
+ var normals = [];
+ var uvs = []; // generate vertices, normals and uvs
+
+ for (var iy = 0; iy < gridY1; iy++) {
+ var y = iy * segment_height - height_half;
+
+ for (var ix = 0; ix < gridX1; ix++) {
+ var x = ix * segment_width - width_half;
+ vertices.push(x, -y, 0);
+ normals.push(0, 0, 1);
+ uvs.push(ix / gridX);
+ uvs.push(1 - iy / gridY);
+ }
+ } // indices
- return result.set(
- ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
- ( point.y - this.min.y ) / ( this.max.y - this.min.y ),
- ( point.z - this.min.z ) / ( this.max.z - this.min.z )
- );
- },
+ for (var _iy = 0; _iy < gridY; _iy++) {
+ for (var _ix = 0; _ix < gridX; _ix++) {
+ var a = _ix + gridX1 * _iy;
+ var b = _ix + gridX1 * (_iy + 1);
+ var c = _ix + 1 + gridX1 * (_iy + 1);
+ var d = _ix + 1 + gridX1 * _iy; // faces
- isIntersectionBox: function ( box ) {
+ indices.push(a, b, d);
+ indices.push(b, c, d);
+ }
+ } // build geometry
- // using 6 splitting planes to rule out intersections.
- if ( box.max.x < this.min.x || box.min.x > this.max.x ||
- box.max.y < this.min.y || box.min.y > this.max.y ||
- box.max.z < this.min.z || box.min.z > this.max.z ) {
+ _this.setIndex(indices);
- return false;
+ _this.setAttribute('position', new Float32BufferAttribute(vertices, 3));
- }
+ _this.setAttribute('normal', new Float32BufferAttribute(normals, 3));
- return true;
+ _this.setAttribute('uv', new Float32BufferAttribute(uvs, 2));
- },
+ return _this;
+ }
- clampPoint: function ( point, optionalTarget ) {
+ return PlaneBufferGeometry;
+ }(BufferGeometry);
- var result = optionalTarget || new THREE.Vector3();
- return result.copy( point ).clamp( this.min, this.max );
+ var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif";
- },
+ var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif";
- distanceToPoint: function() {
+ var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif";
- var v1 = new THREE.Vector3();
+ var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif";
- return function ( point ) {
+ var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
- var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
- return clampedPoint.sub( point ).length();
+ var begin_vertex = "vec3 transformed = vec3( position );";
- };
+ var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif";
- }(),
+ var bsdfs = "vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif";
- getBoundingSphere: function() {
+ var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif";
- var v1 = new THREE.Vector3();
+ var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif";
- return function ( optionalTarget ) {
+ var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif";
- var result = optionalTarget || new THREE.Sphere();
+ var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif";
- result.center = this.center();
- result.radius = this.size( v1 ).length() * 0.5;
+ var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif";
- return result;
+ var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";
- };
+ var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
- }(),
+ var color_pars_vertex = "#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif";
- intersect: function ( box ) {
+ var color_vertex = "#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor.xyz *= color.xyz;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif";
- this.min.max( box.min );
- this.max.min( box.max );
+ var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}";
- return this;
+ var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif";
- },
+ var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif";
- union: function ( box ) {
+ var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif";
- this.min.min( box.min );
- this.max.max( box.max );
+ var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif";
- return this;
+ var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif";
- },
-
- applyMatrix4: function() {
-
- var points = [
- new THREE.Vector3(),
- new THREE.Vector3(),
- new THREE.Vector3(),
- new THREE.Vector3(),
- new THREE.Vector3(),
- new THREE.Vector3(),
- new THREE.Vector3(),
- new THREE.Vector3()
- ];
-
- return function ( matrix ) {
-
- // NOTE: I am using a binary pattern to specify all 2^3 combinations below
- points[0].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000
- points[1].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001
- points[2].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010
- points[3].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011
- points[4].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100
- points[5].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101
- points[6].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110
- points[7].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111
+ var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif";
- this.makeEmpty();
- this.setFromPoints( points );
+ var encodings_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );";
- return this;
+ var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}";
- };
+ var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif";
- }(),
+ var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif";
- translate: function ( offset ) {
+ var envmap_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif";
- this.min.add( offset );
- this.max.add( offset );
+ var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif";
- return this;
+ var envmap_vertex = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif";
- },
+ var fog_vertex = "#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif";
- equals: function ( box ) {
+ var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif";
- return box.min.equals( this.min ) && box.max.equals( this.max );
+ var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif";
- },
+ var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif";
- clone: function () {
+ var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}";
- return new THREE.Box3().copy( this );
+ var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif";
- }
+ var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
-};
+ var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif";
-/**
- * @author alteredq / http://alteredqualia.com/
- * @author WestLangley / http://github.com/WestLangley
- * @author bhouston / http://exocortex.com
- */
+ var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif";
-THREE.Matrix3 = function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
+ var envmap_physical_pars_fragment = "#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif";
- this.elements = new Float32Array( 9 );
+ var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;";
- var te = this.elements;
+ var lights_toon_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)";
- te[0] = ( n11 !== undefined ) ? n11 : 1; te[3] = n12 || 0; te[6] = n13 || 0;
- te[1] = n21 || 0; te[4] = ( n22 !== undefined ) ? n22 : 1; te[7] = n23 || 0;
- te[2] = n31 || 0; te[5] = n32 || 0; te[8] = ( n33 !== undefined ) ? n33 : 1;
+ var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;";
-};
+ var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)";
-THREE.Matrix3.prototype = {
+ var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif";
- constructor: THREE.Matrix3,
+ var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}";
- set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
+ var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif";
- var te = this.elements;
+ var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif";
- te[0] = n11; te[3] = n12; te[6] = n13;
- te[1] = n21; te[4] = n22; te[7] = n23;
- te[2] = n31; te[5] = n32; te[8] = n33;
+ var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif";
- return this;
+ var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";
- },
+ var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif";
- identity: function () {
+ var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif";
- this.set(
+ var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif";
- 1, 0, 0,
- 0, 1, 0,
- 0, 0, 1
+ var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif";
- );
+ var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif";
- return this;
+ var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif";
- },
+ var map_particle_pars_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif";
- copy: function ( m ) {
+ var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif";
- var me = m.elements;
+ var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
- this.set(
+ var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif";
- me[0], me[3], me[6],
- me[1], me[4], me[7],
- me[2], me[5], me[8]
+ var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
- );
+ var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif";
- return this;
+ var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;";
- },
+ var normal_fragment_maps = "#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif";
- multiplyVector3: function ( vector ) {
+ var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif";
- console.warn( 'DEPRECATED: Matrix3\'s .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
- return vector.applyMatrix3( this );
+ var clearcoat_normal_fragment_begin = "#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif";
- },
+ var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif";
- multiplyVector3Array: function ( a ) {
+ var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif";
- console.warn( 'DEPRECATED: Matrix3\'s .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );
- return this.applyToVector3Array( a );
+ var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}";
- },
+ var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif";
- applyToVector3Array: function() {
+ var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;";
- var v1 = new THREE.Vector3();
+ var dithering_fragment = "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif";
- return function ( array, offset, length ) {
+ var dithering_pars_fragment = "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif";
- if ( offset === undefined ) offset = 0;
- if ( length === undefined ) length = array.length;
+ var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif";
- for ( var i = 0, j = offset, il; i < length; i += 3, j += 3 ) {
+ var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
- v1.x = array[ j ];
- v1.y = array[ j + 1 ];
- v1.z = array[ j + 2 ];
+ var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif";
- v1.applyMatrix3( this );
+ var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif";
- array[ j ] = v1.x;
- array[ j + 1 ] = v1.y;
- array[ j + 2 ] = v1.z;
+ var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif";
- }
+ var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}";
- return array;
+ var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
- };
+ var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif";
- }(),
+ var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif";
- multiplyScalar: function ( s ) {
+ var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif";
- var te = this.elements;
+ var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";
- te[0] *= s; te[3] *= s; te[6] *= s;
- te[1] *= s; te[4] *= s; te[7] *= s;
- te[2] *= s; te[5] *= s; te[8] *= s;
+ var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
- return this;
+ var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif";
- },
+ var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }";
- determinant: function () {
+ var transmissionmap_fragment = "#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif";
- var te = this.elements;
+ var transmissionmap_pars_fragment = "#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif";
- var a = te[0], b = te[1], c = te[2],
- d = te[3], e = te[4], f = te[5],
- g = te[6], h = te[7], i = te[8];
+ var uv_pars_fragment = "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif";
- return a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g;
+ var uv_pars_vertex = "#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif";
- },
+ var uv_vertex = "#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif";
- getInverse: function ( matrix, throwOnInvertible ) {
+ var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";
- // input: THREE.Matrix4
- // ( based on http://code.google.com/p/webgl-mjs/ )
+ var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif";
- var me = matrix.elements;
- var te = this.elements;
+ var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif";
- te[ 0 ] = me[10] * me[5] - me[6] * me[9];
- te[ 1 ] = - me[10] * me[1] + me[2] * me[9];
- te[ 2 ] = me[6] * me[1] - me[2] * me[5];
- te[ 3 ] = - me[10] * me[4] + me[6] * me[8];
- te[ 4 ] = me[10] * me[0] - me[2] * me[8];
- te[ 5 ] = - me[6] * me[0] + me[2] * me[4];
- te[ 6 ] = me[9] * me[4] - me[5] * me[8];
- te[ 7 ] = - me[9] * me[0] + me[1] * me[8];
- te[ 8 ] = me[5] * me[0] - me[1] * me[4];
+ var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif";
- var det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 3 ] + me[ 2 ] * te[ 6 ];
+ var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}";
- // no inverse
+ var background_vert = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}";
- if ( det === 0 ) {
+ var cube_frag = "#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}";
- var msg = "Matrix3.getInverse(): can't invert matrix, determinant is 0";
+ var cube_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}";
- if ( throwOnInvertible || false ) {
+ var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}";
- throw new Error( msg );
+ var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}";
- } else {
+ var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}";
- console.warn( msg );
+ var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}";
- }
+ var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}";
- this.identity();
+ var equirect_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}";
- return this;
+ var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}";
- }
+ var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}";
- this.multiplyScalar( 1.0 / det );
+ var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}";
- return this;
+ var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}";
- },
+ var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}";
- transpose: function () {
+ var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include