diff --git a/demo/index.html b/demo/index.html
index d534b94..4c5f9e1 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -159,12 +159,12 @@
geometry.vertices.push( v );
}
- var sprite = THREE.ImageUtils.loadTexture( 'disc.png' );
+ var sprite = new THREE.TextureLoader().load( 'disc.png' );
- var material = new THREE.ParticleSystemMaterial( { size: 3, sizeAttenuation: true, map: sprite, transparent: true } );
+ var material = new THREE.PointsMaterial( { size: 3, sizeAttenuation: true, map: sprite, transparent: true } );
material.color.setHSL( 1.0, 0.3, 0.7 );
- var particles = new THREE.ParticleSystem( geometry, material );
+ var particles = new THREE.Points( geometry, material );
particles.sortParticles = true;
scene.add( particles );
@@ -203,7 +203,15 @@
function onWindowResize() {
var s = 1;
renderer.setSize( s * window.innerWidth, s * window.innerHeight );
- camera.projectionMatrix.makePerspective( fov, window.innerWidth / window.innerHeight, camera.near, camera.far );
+
+ makePerspective();
+}
+
+function makePerspective() {
+ var aspect = window.innerWidth / window.innerHeight;
+ camera.fov = fov;
+ camera.aspect = aspect;
+ camera.updateProjectionMatrix();
}
function onMouseWheel( event ) {
@@ -359,7 +367,7 @@
lat += ( nlat - lat ) * .2;
fov += ( nfov - fov ) * .2;
- camera.projectionMatrix.makePerspective( fov, window.innerWidth / window.innerHeight, camera.near, camera.far );
+ makePerspective();
lat = Math.max( - 85, Math.min( 85, lat ) );
phi = ( 90 - lat ) * Math.PI / 180;
diff --git a/demo/three.min.js b/demo/three.min.js
old mode 100644
new mode 100755
index d7dc873..59669ca
--- a/demo/three.min.js
+++ b/demo/three.min.js
@@ -1,12423 +1,938 @@
-// three.js - http://github.com/mrdoob/three.js
-'use strict';
-var THREE = {
- REVISION: "64"
-};
-self.console = self.console || {
- info: function() {},
- log: function() {},
- debug: function() {},
- warn: function() {},
- error: function() {}
-};
-String.prototype.trim = String.prototype.trim || function() {
- return this.replace(/^\s+|\s+$/g, "")
-};
-THREE.extend = function(a, b) {
- if (Object.keys) for (var c = Object.keys(b), d = 0, e = c.length; d < e; d++) {
- var f = c[d];
- Object.defineProperty(a, f, Object.getOwnPropertyDescriptor(b, f))
- } else for (f in c = {}.hasOwnProperty, b) c.call(b, f) && (a[f] = b[f]);
- return a
-};
-(function() {
- for (var a = 0, b = ["ms", "moz", "webkit", "o"], c = 0; c < b.length && !self.requestAnimationFrame; ++c) self.requestAnimationFrame = self[b[c] + "RequestAnimationFrame"], self.cancelAnimationFrame = self[b[c] + "CancelAnimationFrame"] || self[b[c] + "CancelRequestAnimationFrame"];
- void 0 === self.requestAnimationFrame && void 0 !== self.setTimeout && (self.requestAnimationFrame = function(b) {
- var c = Date.now(),
- f = Math.max(0, 16 - (c - a)),
- h = self.setTimeout(function() {
- b(c + f)
- }, f);
- a = c + f;
- return h
- });
- void 0 === self.cancelAnimationFrame && void 0 !== self.clearTimeout && (self.cancelAnimationFrame = function(a) {
- self.clearTimeout(a)
- })
-})();
-THREE.CullFaceNone = 0;
-THREE.CullFaceBack = 1;
-THREE.CullFaceFront = 2;
-THREE.CullFaceFrontBack = 3;
-THREE.FrontFaceDirectionCW = 0;
-THREE.FrontFaceDirectionCCW = 1;
-THREE.BasicShadowMap = 0;
-THREE.PCFShadowMap = 1;
-THREE.PCFSoftShadowMap = 2;
-THREE.FrontSide = 0;
-THREE.BackSide = 1;
-THREE.DoubleSide = 2;
-THREE.NoShading = 0;
-THREE.FlatShading = 1;
-THREE.SmoothShading = 2;
-THREE.NoColors = 0;
-THREE.FaceColors = 1;
-THREE.VertexColors = 2;
-THREE.NoBlending = 0;
-THREE.NormalBlending = 1;
-THREE.AdditiveBlending = 2;
-THREE.SubtractiveBlending = 3;
-THREE.MultiplyBlending = 4;
-THREE.CustomBlending = 5;
-THREE.AddEquation = 100;
-THREE.SubtractEquation = 101;
-THREE.ReverseSubtractEquation = 102;
-THREE.ZeroFactor = 200;
-THREE.OneFactor = 201;
-THREE.SrcColorFactor = 202;
-THREE.OneMinusSrcColorFactor = 203;
-THREE.SrcAlphaFactor = 204;
-THREE.OneMinusSrcAlphaFactor = 205;
-THREE.DstAlphaFactor = 206;
-THREE.OneMinusDstAlphaFactor = 207;
-THREE.DstColorFactor = 208;
-THREE.OneMinusDstColorFactor = 209;
-THREE.SrcAlphaSaturateFactor = 210;
-THREE.MultiplyOperation = 0;
-THREE.MixOperation = 1;
-THREE.AddOperation = 2;
-THREE.UVMapping = function() {};
-THREE.CubeReflectionMapping = function() {};
-THREE.CubeRefractionMapping = function() {};
-THREE.SphericalReflectionMapping = function() {};
-THREE.SphericalRefractionMapping = function() {};
-THREE.RepeatWrapping = 1E3;
-THREE.ClampToEdgeWrapping = 1001;
-THREE.MirroredRepeatWrapping = 1002;
-THREE.NearestFilter = 1003;
-THREE.NearestMipMapNearestFilter = 1004;
-THREE.NearestMipMapLinearFilter = 1005;
-THREE.LinearFilter = 1006;
-THREE.LinearMipMapNearestFilter = 1007;
-THREE.LinearMipMapLinearFilter = 1008;
-THREE.UnsignedByteType = 1009;
-THREE.ByteType = 1010;
-THREE.ShortType = 1011;
-THREE.UnsignedShortType = 1012;
-THREE.IntType = 1013;
-THREE.UnsignedIntType = 1014;
-THREE.FloatType = 1015;
-THREE.UnsignedShort4444Type = 1016;
-THREE.UnsignedShort5551Type = 1017;
-THREE.UnsignedShort565Type = 1018;
-THREE.AlphaFormat = 1019;
-THREE.RGBFormat = 1020;
-THREE.RGBAFormat = 1021;
-THREE.LuminanceFormat = 1022;
-THREE.LuminanceAlphaFormat = 1023;
-THREE.RGB_S3TC_DXT1_Format = 2001;
-THREE.RGBA_S3TC_DXT1_Format = 2002;
-THREE.RGBA_S3TC_DXT3_Format = 2003;
-THREE.RGBA_S3TC_DXT5_Format = 2004;
-THREE.Color = function(a) {
- void 0 !== a && this.set(a);
- return this
-};
-THREE.Color.prototype = {
- constructor: THREE.Color,
- r: 1,
- g: 1,
- b: 1,
- set: function(a) {
- a instanceof THREE.Color ? this.copy(a) : "number" === typeof a ? this.setHex(a) : "string" === typeof a && this.setStyle(a);
- return this
- },
- setHex: function(a) {
- a = Math.floor(a);
- this.r = (a >> 16 & 255) / 255;
- this.g = (a >> 8 & 255) / 255;
- this.b = (a & 255) / 255;
- return this
- },
- setRGB: function(a, b, c) {
- this.r = a;
- this.g = b;
- this.b = c;
- return this
- },
- setHSL: function(a, b, c) {
- if (0 === b) this.r = this.g = this.b = c;
- else {
- var d = function(a, b, c) {
- 0 > c && (c += 1);
- 1 < c && (c -= 1);
- return c < 1 / 6 ? a + 6 * (b - a) * c : 0.5 > c ? b : c < 2 / 3 ? a + 6 * (b - a) * (2 / 3 - c) : a
- }, b = 0.5 >= c ? c * (1 + b) : c + b - c * b,
- c = 2 * c - b;
- this.r = d(c, b, a + 1 / 3);
- this.g = d(c, b, a);
- this.b = d(c, b, a - 1 / 3)
- }
- return this
- },
- setStyle: function(a) {
- if (/^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.test(a)) return a = /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.exec(a), this.r = Math.min(255, parseInt(a[1], 10)) / 255, this.g = Math.min(255, parseInt(a[2], 10)) / 255, this.b = Math.min(255, parseInt(a[3], 10)) / 255, this;
- if (/^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.test(a)) return a = /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.exec(a), this.r = Math.min(100, parseInt(a[1], 10)) / 100, this.g = Math.min(100, parseInt(a[2], 10)) / 100, this.b = Math.min(100, parseInt(a[3], 10)) / 100, this;
- if (/^\#([0-9a-f]{6})$/i.test(a)) return a = /^\#([0-9a-f]{6})$/i.exec(a), this.setHex(parseInt(a[1], 16)), this;
- if (/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(a)) return a = /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a), this.setHex(parseInt(a[1] + a[1] + a[2] + a[2] + a[3] + a[3], 16)), this;
- if (/^(\w+)$/i.test(a)) return this.setHex(THREE.ColorKeywords[a]), this
- },
- copy: function(a) {
- this.r = a.r;
- this.g = a.g;
- this.b = a.b;
- return this
- },
- copyGammaToLinear: function(a) {
- this.r = a.r * a.r;
- this.g = a.g * a.g;
- this.b = a.b * a.b;
- return this
- },
- copyLinearToGamma: function(a) {
- this.r = Math.sqrt(a.r);
- this.g = Math.sqrt(a.g);
- this.b = Math.sqrt(a.b);
- return this
- },
- convertGammaToLinear: function() {
- var a = this.r,
- b = this.g,
- c = this.b;
- this.r = a * a;
- this.g = b * b;
- this.b = c * c;
- return this
- },
- convertLinearToGamma: function() {
- this.r = Math.sqrt(this.r);
- this.g = Math.sqrt(this.g);
- this.b = Math.sqrt(this.b);
- return this
- },
- getHex: function() {
- return 255 * this.r << 16 ^ 255 * this.g << 8 ^ 255 * this.b << 0
- },
- getHexString: function() {
- return ("000000" + this.getHex().toString(16)).slice(-6)
- },
- getHSL: function(a) {
- var a = a || {
- h: 0,
- s: 0,
- l: 0
- }, b = this.r,
- c = this.g,
- d = this.b,
- e = Math.max(b, c, d),
- f = Math.min(b, c, d),
- h, g = (f + e) / 2;
- if (f === e) f = h = 0;
- else {
- var i = e - f,
- f = 0.5 >= g ? i / (e + f) : i / (2 - e - f);
- switch (e) {
- case b:
- h = (c - d) / i + (c < d ? 6 : 0);
- break;
- case c:
- h = (d - b) / i + 2;
- break;
- case d:
- h = (b - c) / i + 4
- }
- h /= 6
- }
- a.h = h;
- a.s = f;
- a.l = g;
- return a
- },
- getStyle: function() {
- return "rgb(" + (255 * this.r | 0) + "," + (255 * this.g | 0) + "," + (255 * this.b | 0) + ")"
- },
- offsetHSL: function(a,
- b, c) {
- var d = this.getHSL();
- d.h += a;
- d.s += b;
- d.l += c;
- this.setHSL(d.h, d.s, d.l);
- return this
- },
- add: function(a) {
- this.r += a.r;
- this.g += a.g;
- this.b += a.b;
- return this
- },
- addColors: function(a, b) {
- this.r = a.r + b.r;
- this.g = a.g + b.g;
- this.b = a.b + b.b;
- return this
- },
- addScalar: function(a) {
- this.r += a;
- this.g += a;
- this.b += a;
- return this
- },
- multiply: function(a) {
- this.r *= a.r;
- this.g *= a.g;
- this.b *= a.b;
- return this
- },
- multiplyScalar: function(a) {
- this.r *= a;
- this.g *= a;
- this.b *= a;
- return this
- },
- lerp: function(a, b) {
- this.r += (a.r - this.r) * b;
- this.g += (a.g - this.g) * b;
- this.b += (a.b - this.b) * b;
- return this
- },
- equals: function(a) {
- return a.r === this.r && a.g === this.g && a.b === this.b
- },
- fromArray: function(a) {
- this.r = a[0];
- this.g = a[1];
- this.b = a[2];
- return this
- },
- toArray: function() {
- return [this.r, this.g, this.b]
- },
- clone: function() {
- return (new THREE.Color).setRGB(this.r, this.g, this.b)
- }
-};
-THREE.ColorKeywords = {
- aliceblue: 15792383,
- antiquewhite: 16444375,
- aqua: 65535,
- aquamarine: 8388564,
- azure: 15794175,
- beige: 16119260,
- bisque: 16770244,
- black: 0,
- blanchedalmond: 16772045,
- blue: 255,
- blueviolet: 9055202,
- brown: 10824234,
- burlywood: 14596231,
- cadetblue: 6266528,
- chartreuse: 8388352,
- chocolate: 13789470,
- coral: 16744272,
- cornflowerblue: 6591981,
- cornsilk: 16775388,
- crimson: 14423100,
- cyan: 65535,
- darkblue: 139,
- darkcyan: 35723,
- darkgoldenrod: 12092939,
- darkgray: 11119017,
- darkgreen: 25600,
- darkgrey: 11119017,
- darkkhaki: 12433259,
- darkmagenta: 9109643,
- darkolivegreen: 5597999,
- darkorange: 16747520,
- darkorchid: 10040012,
- darkred: 9109504,
- darksalmon: 15308410,
- darkseagreen: 9419919,
- darkslateblue: 4734347,
- darkslategray: 3100495,
- darkslategrey: 3100495,
- darkturquoise: 52945,
- darkviolet: 9699539,
- deeppink: 16716947,
- deepskyblue: 49151,
- dimgray: 6908265,
- dimgrey: 6908265,
- dodgerblue: 2003199,
- firebrick: 11674146,
- floralwhite: 16775920,
- forestgreen: 2263842,
- fuchsia: 16711935,
- gainsboro: 14474460,
- ghostwhite: 16316671,
- gold: 16766720,
- goldenrod: 14329120,
- gray: 8421504,
- green: 32768,
- greenyellow: 11403055,
- grey: 8421504,
- honeydew: 15794160,
- hotpink: 16738740,
- indianred: 13458524,
- indigo: 4915330,
- ivory: 16777200,
- khaki: 15787660,
- lavender: 15132410,
- lavenderblush: 16773365,
- lawngreen: 8190976,
- lemonchiffon: 16775885,
- lightblue: 11393254,
- lightcoral: 15761536,
- lightcyan: 14745599,
- lightgoldenrodyellow: 16448210,
- lightgray: 13882323,
- lightgreen: 9498256,
- lightgrey: 13882323,
- lightpink: 16758465,
- lightsalmon: 16752762,
- lightseagreen: 2142890,
- lightskyblue: 8900346,
- lightslategray: 7833753,
- lightslategrey: 7833753,
- lightsteelblue: 11584734,
- lightyellow: 16777184,
- lime: 65280,
- limegreen: 3329330,
- linen: 16445670,
- magenta: 16711935,
- maroon: 8388608,
- mediumaquamarine: 6737322,
- mediumblue: 205,
- mediumorchid: 12211667,
- mediumpurple: 9662683,
- mediumseagreen: 3978097,
- mediumslateblue: 8087790,
- mediumspringgreen: 64154,
- mediumturquoise: 4772300,
- mediumvioletred: 13047173,
- midnightblue: 1644912,
- mintcream: 16121850,
- mistyrose: 16770273,
- moccasin: 16770229,
- navajowhite: 16768685,
- navy: 128,
- oldlace: 16643558,
- olive: 8421376,
- olivedrab: 7048739,
- orange: 16753920,
- orangered: 16729344,
- orchid: 14315734,
- palegoldenrod: 15657130,
- palegreen: 10025880,
- paleturquoise: 11529966,
- palevioletred: 14381203,
- papayawhip: 16773077,
- peachpuff: 16767673,
- peru: 13468991,
- pink: 16761035,
- plum: 14524637,
- powderblue: 11591910,
- purple: 8388736,
- red: 16711680,
- rosybrown: 12357519,
- royalblue: 4286945,
- saddlebrown: 9127187,
- salmon: 16416882,
- sandybrown: 16032864,
- seagreen: 3050327,
- seashell: 16774638,
- sienna: 10506797,
- silver: 12632256,
- skyblue: 8900331,
- slateblue: 6970061,
- slategray: 7372944,
- slategrey: 7372944,
- snow: 16775930,
- springgreen: 65407,
- steelblue: 4620980,
- tan: 13808780,
- teal: 32896,
- thistle: 14204888,
- tomato: 16737095,
- turquoise: 4251856,
- violet: 15631086,
- wheat: 16113331,
- white: 16777215,
- whitesmoke: 16119285,
- yellow: 16776960,
- yellowgreen: 10145074
-};
-THREE.Quaternion = function(a, b, c, d) {
- this._x = a || 0;
- this._y = b || 0;
- this._z = c || 0;
- this._w = void 0 !== d ? d : 1
-};
-THREE.Quaternion.prototype = {
- constructor: THREE.Quaternion,
- _x: 0,
- _y: 0,
- _z: 0,
- _w: 0,
- _euler: void 0,
- _updateEuler: function() {
- void 0 !== this._euler && this._euler.setFromQuaternion(this, void 0, !1)
- },
- get x() {
- return this._x
- },
- set x(a) {
- this._x = a;
- this._updateEuler()
- },
- get y() {
- return this._y
- },
- set y(a) {
- this._y = a;
- this._updateEuler()
- },
- get z() {
- return this._z
- },
- set z(a) {
- this._z = a;
- this._updateEuler()
- },
- get w() {
- return this._w
- },
- set w(a) {
- this._w = a;
- this._updateEuler()
- },
- set: function(a, b, c, d) {
- this._x = a;
- this._y = b;
- this._z = c;
- this._w = d;
- this._updateEuler();
- return this
- },
- copy: function(a) {
- this._x = a._x;
- this._y = a._y;
- this._z = a._z;
- this._w = a._w;
- this._updateEuler();
- return this
- },
- setFromEuler: function(a, b) {
- if (!1 === a instanceof THREE.Euler) throw Error("ERROR: Quaternion's .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.");
- var c = Math.cos(a._x / 2),
- d = Math.cos(a._y / 2),
- e = Math.cos(a._z / 2),
- f = Math.sin(a._x / 2),
- h = Math.sin(a._y / 2),
- g = Math.sin(a._z / 2);
- "XYZ" === a.order ? (this._x = f * d * e + c * h * g, this._y = c * h * e - f * d * g, this._z = c * d * g + f * h * e, this._w = c * d * e - f * h * g) : "YXZ" === a.order ? (this._x = f * d * e + c * h * g, this._y = c * h * e - f * d * g, this._z = c * d * g - f * h * e, this._w = c * d * e + f * h * g) : "ZXY" === a.order ? (this._x = f * d * e - c * h * g, this._y = c * h * e + f * d * g, this._z = c * d * g + f * h * e, this._w = c * d * e - f * h * g) : "ZYX" === a.order ? (this._x = f * d * e - c * h * g, this._y = c * h * e + f * d * g, this._z = c * d * g - f * h * e, this._w = c * d * e + f * h * g) : "YZX" === a.order ? (this._x = f * d * e + c * h * g, this._y = c * h * e + f * d * g, this._z = c * d * g - f * h * e, this._w = c * d * e - f * h * g) : "XZY" === a.order && (this._x = f * d * e - c * h * g, this._y = c * h * e - f * d * g, this._z = c * d * g + f * h * e, this._w = c * d * e + f * h * g);
- !1 !== b && this._updateEuler();
- return this
- },
- setFromAxisAngle: function(a, b) {
- var c = b / 2,
- d = Math.sin(c);
- this._x = a.x * d;
- this._y = a.y * d;
- this._z = a.z * d;
- this._w = Math.cos(c);
- this._updateEuler();
- return this
- },
- setFromRotationMatrix: function(a) {
- var b = a.elements,
- c = b[0],
- a = b[4],
- d = b[8],
- e = b[1],
- f = b[5],
- h = b[9],
- g = b[2],
- i = b[6],
- b = b[10],
- k = c + f + b;
- 0 < k ? (c = 0.5 / Math.sqrt(k + 1), this._w = 0.25 / c, this._x = (i - h) * c, this._y = (d - g) * c, this._z = (e - a) * c) : c > f && c > b ? (c = 2 * Math.sqrt(1 + c - f - b), this._w = (i - h) / c, this._x = 0.25 * c,
- this._y = (a + e) / c, this._z = (d + g) / c) : f > b ? (c = 2 * Math.sqrt(1 + f - c - b), this._w = (d - g) / c, this._x = (a + e) / c, this._y = 0.25 * c, this._z = (h + i) / c) : (c = 2 * Math.sqrt(1 + b - c - f), this._w = (e - a) / c, this._x = (d + g) / c, this._y = (h + i) / c, this._z = 0.25 * c);
- this._updateEuler();
- return this
- },
- inverse: function() {
- this.conjugate().normalize();
- return this
- },
- conjugate: function() {
- this._x *= -1;
- this._y *= -1;
- this._z *= -1;
- this._updateEuler();
- return this
- },
- lengthSq: function() {
- return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w
- },
- length: function() {
- return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w)
- },
- normalize: function() {
- var a = this.length();
- 0 === a ? (this._z = this._y = this._x = 0, this._w = 1) : (a = 1 / a, this._x *= a, this._y *= a, this._z *= a, this._w *= a);
- return this
- },
- multiply: function(a, b) {
- return void 0 !== b ? (console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), this.multiplyQuaternions(a, b)) : this.multiplyQuaternions(this, a)
- },
- multiplyQuaternions: function(a, b) {
- var c = a._x,
- d = a._y,
- e = a._z,
- f = a._w,
- h = b._x,
- g = b._y,
- i = b._z,
- k = b._w;
- this._x = c * k + f * h + d * i - e * g;
- this._y = d * k + f * g + e * h - c * i;
- this._z = e * k + f * i + c * g - d * h;
- this._w = f * k - c * h - d * g - e * i;
- this._updateEuler();
- return this
- },
- multiplyVector3: function(a) {
- console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");
- return a.applyQuaternion(this)
- },
- slerp: function(a, b) {
- var c = this._x,
- d = this._y,
- e = this._z,
- f = this._w,
- h = f * a._w + c * a._x + d * a._y + e * a._z;
- 0 > h ? (this._w = -a._w, this._x = -a._x, this._y = -a._y, this._z = -a._z, h = -h) : this.copy(a);
- if (1 <= h) return this._w = f, this._x = c, this._y = d, this._z = e, this;
- var g = Math.acos(h),
- i = Math.sqrt(1 - h * h);
- if (0.001 > Math.abs(i)) return this._w = 0.5 * (f + this._w), this._x = 0.5 * (c + this._x), this._y = 0.5 * (d + this._y), this._z = 0.5 * (e + this._z), this;
- h = Math.sin((1 - b) * g) / i;
- g = Math.sin(b * g) / i;
- this._w = f * h + this._w * g;
- this._x = c * h + this._x * g;
- this._y = d * h + this._y * g;
- this._z = e * h + this._z * g;
- this._updateEuler();
- return this
- },
- equals: function(a) {
- return a._x === this._x && a._y === this._y && a._z === this._z && a._w === this._w
- },
- fromArray: function(a) {
- this._x = a[0];
- this._y = a[1];
- this._z = a[2];
- this._w = a[3];
- this._updateEuler();
- return this
- },
- toArray: function() {
- return [this._x, this._y, this._z, this._w]
- },
- clone: function() {
- return new THREE.Quaternion(this._x, this._y, this._z, this._w)
- }
-};
-THREE.Quaternion.slerp = function(a, b, c, d) {
- return c.copy(a).slerp(b, d)
-};
-THREE.Vector2 = function(a, b) {
- this.x = a || 0;
- this.y = b || 0
-};
-THREE.Vector2.prototype = {
- constructor: THREE.Vector2,
- set: function(a, b) {
- this.x = a;
- this.y = b;
- return this
- },
- setX: function(a) {
- this.x = a;
- return this
- },
- setY: function(a) {
- this.y = a;
- return this
- },
- setComponent: function(a, b) {
- switch (a) {
- case 0:
- this.x = b;
- break;
- case 1:
- this.y = b;
- break;
- default:
- throw Error("index is out of range: " + a);
- }
- },
- getComponent: function(a) {
- switch (a) {
- case 0:
- return this.x;
- case 1:
- return this.y;
- default:
- throw Error("index is out of range: " + a);
- }
- },
- copy: function(a) {
- this.x = a.x;
- this.y = a.y;
- return this
- },
- add: function(a,
- b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector2's .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b);
- this.x += a.x;
- this.y += a.y;
- return this
- },
- addVectors: function(a, b) {
- this.x = a.x + b.x;
- this.y = a.y + b.y;
- return this
- },
- addScalar: function(a) {
- this.x += a;
- this.y += a;
- return this
- },
- sub: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector2's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b);
- this.x -= a.x;
- this.y -= a.y;
- return this
- },
- subVectors: function(a, b) {
- this.x = a.x - b.x;
- this.y = a.y - b.y;
- return this
- },
- multiplyScalar: function(a) {
- this.x *= a;
- this.y *= a;
- return this
- },
- divideScalar: function(a) {
- 0 !== a ? (a = 1 / a, this.x *= a, this.y *= a) : this.y = this.x = 0;
- return this
- },
- min: function(a) {
- this.x > a.x && (this.x = a.x);
- this.y > a.y && (this.y = a.y);
- return this
- },
- max: function(a) {
- this.x < a.x && (this.x = a.x);
- this.y < a.y && (this.y = a.y);
- return this
- },
- clamp: function(a, b) {
- this.x < a.x ? this.x = a.x : this.x > b.x && (this.x = b.x);
- this.y < a.y ? this.y = a.y : this.y > b.y && (this.y = b.y);
- return this
- },
- negate: function() {
- return this.multiplyScalar(-1)
- },
- dot: function(a) {
- return this.x * a.x + this.y * a.y
- },
- lengthSq: function() {
- return this.x * this.x + this.y * this.y
- },
- length: function() {
- return Math.sqrt(this.x * this.x + this.y * this.y)
- },
- normalize: function() {
- return this.divideScalar(this.length())
- },
- distanceTo: function(a) {
- return Math.sqrt(this.distanceToSquared(a))
- },
- distanceToSquared: function(a) {
- var b = this.x - a.x,
- a = this.y - a.y;
- return b * b + a * a
- },
- setLength: function(a) {
- var b = this.length();
- 0 !== b && a !== b && this.multiplyScalar(a / b);
- return this
- },
- lerp: function(a, b) {
- this.x += (a.x - this.x) * b;
- this.y += (a.y - this.y) * b;
- return this
- },
- equals: function(a) {
- return a.x === this.x && a.y === this.y
- },
- fromArray: function(a) {
- this.x = a[0];
- this.y = a[1];
- return this
- },
- toArray: function() {
- return [this.x, this.y]
- },
- clone: function() {
- return new THREE.Vector2(this.x, this.y)
- }
-};
-THREE.Vector3 = function(a, b, c) {
- this.x = a || 0;
- this.y = b || 0;
- this.z = c || 0
-};
-THREE.Vector3.prototype = {
- constructor: THREE.Vector3,
- set: function(a, b, c) {
- this.x = a;
- this.y = b;
- this.z = c;
- return this
- },
- setX: function(a) {
- this.x = a;
- return this
- },
- setY: function(a) {
- this.y = a;
- return this
- },
- setZ: function(a) {
- this.z = a;
- return this
- },
- setComponent: function(a, b) {
- switch (a) {
- case 0:
- this.x = b;
- break;
- case 1:
- this.y = b;
- break;
- case 2:
- this.z = b;
- break;
- default:
- throw Error("index is out of range: " + a);
- }
- },
- getComponent: function(a) {
- switch (a) {
- case 0:
- return this.x;
- case 1:
- return this.y;
- case 2:
- return this.z;
- default:
- throw Error("index is out of range: " + a);
- }
- },
- copy: function(a) {
- this.x = a.x;
- this.y = a.y;
- this.z = a.z;
- return this
- },
- add: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b);
- this.x += a.x;
- this.y += a.y;
- this.z += a.z;
- return this
- },
- addScalar: function(a) {
- this.x += a;
- this.y += a;
- this.z += a;
- return this
- },
- addVectors: function(a, b) {
- this.x = a.x + b.x;
- this.y = a.y + b.y;
- this.z = a.z + b.z;
- return this
- },
- sub: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
- this.subVectors(a, b);
- this.x -= a.x;
- this.y -= a.y;
- this.z -= a.z;
- return this
- },
- subVectors: function(a, b) {
- this.x = a.x - b.x;
- this.y = a.y - b.y;
- this.z = a.z - b.z;
- return this
- },
- multiply: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."), this.multiplyVectors(a, b);
- this.x *= a.x;
- this.y *= a.y;
- this.z *= a.z;
- return this
- },
- multiplyScalar: function(a) {
- this.x *= a;
- this.y *= a;
- this.z *= a;
- return this
- },
- multiplyVectors: function(a, b) {
- this.x = a.x * b.x;
- this.y = a.y * b.y;
- this.z = a.z * b.z;
- return this
- },
- applyMatrix3: function(a) {
- var b = this.x,
- c = this.y,
- d = this.z,
- a = a.elements;
- this.x = a[0] * b + a[3] * c + a[6] * d;
- this.y = a[1] * b + a[4] * c + a[7] * d;
- this.z = a[2] * b + a[5] * c + a[8] * d;
- return this
- },
- applyMatrix4: function(a) {
- var b = this.x,
- c = this.y,
- d = this.z,
- a = a.elements;
- this.x = a[0] * b + a[4] * c + a[8] * d + a[12];
- this.y = a[1] * b + a[5] * c + a[9] * d + a[13];
- this.z = a[2] * b + a[6] * c + a[10] * d + a[14];
- return this
- },
- applyProjection: function(a) {
- var b = this.x,
- c = this.y,
- d = this.z,
- a = a.elements,
- e = 1 / (a[3] * b + a[7] * c + a[11] * d + a[15]);
- this.x = (a[0] * b + a[4] * c + a[8] * d + a[12]) * e;
- this.y = (a[1] * b + a[5] * c + a[9] * d + a[13]) * e;
- this.z = (a[2] * b + a[6] * c + a[10] * d + a[14]) * e;
- return this
- },
- applyQuaternion: function(a) {
- var b = this.x,
- c = this.y,
- d = this.z,
- e = a.x,
- f = a.y,
- h = a.z,
- a = a.w,
- g = a * b + f * d - h * c,
- i = a * c + h * b - e * d,
- k = a * d + e * c - f * b,
- b = -e * b - f * c - h * d;
- this.x = g * a + b * -e + i * -h - k * -f;
- this.y = i * a + b * -f + k * -e - g * -h;
- this.z = k * a + b * -h + g * -f - i * -e;
- return this
- },
- transformDirection: function(a) {
- var b = this.x,
- c = this.y,
- d = this.z,
- a = a.elements;
- this.x = a[0] * b + a[4] * c + a[8] * d;
- this.y = a[1] * b + a[5] * c + a[9] * d;
- this.z = a[2] * b + a[6] * c + a[10] * d;
- this.normalize();
- return this
- },
- divide: function(a) {
- this.x /= a.x;
- this.y /= a.y;
- this.z /= a.z;
- return this
- },
- divideScalar: function(a) {
- 0 !== a ? (a = 1 / a, this.x *= a, this.y *= a, this.z *= a) : this.z = this.y = this.x = 0;
- return this
- },
- min: function(a) {
- this.x > a.x && (this.x = a.x);
- this.y > a.y && (this.y = a.y);
- this.z > a.z && (this.z = a.z);
- return this
- },
- max: function(a) {
- this.x < a.x && (this.x = a.x);
- this.y < a.y && (this.y = a.y);
- this.z < a.z && (this.z = a.z);
- return this
- },
- clamp: function(a, b) {
- this.x < a.x ? this.x = a.x : this.x > b.x && (this.x = b.x);
- this.y < a.y ? this.y = a.y : this.y > b.y && (this.y = b.y);
- this.z < a.z ? this.z = a.z : this.z > b.z && (this.z = b.z);
- return this
- },
- negate: function() {
- return this.multiplyScalar(-1)
- },
- dot: function(a) {
- return this.x * a.x + this.y * a.y + this.z * a.z
- },
- lengthSq: function() {
- return this.x * this.x + this.y * this.y + this.z * this.z
- },
- length: function() {
- return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z)
- },
- lengthManhattan: function() {
- return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z)
- },
- normalize: function() {
- return this.divideScalar(this.length())
- },
- setLength: function(a) {
- var b = this.length();
- 0 !== b && a !== b && this.multiplyScalar(a / b);
- return this
- },
- lerp: function(a, b) {
- this.x += (a.x - this.x) * b;
- this.y += (a.y - this.y) * b;
- this.z += (a.z - this.z) * b;
- return this
- },
- cross: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), this.crossVectors(a, b);
- var c = this.x,
- d = this.y,
- e = this.z;
- this.x = d * a.z - e * a.y;
- this.y = e * a.x - c * a.z;
- this.z = c * a.y - d * a.x;
- return this
- },
- crossVectors: function(a, b) {
- var c = a.x,
- d = a.y,
- e = a.z,
- f = b.x,
- h = b.y,
- g = b.z;
- this.x = d * g - e * h;
- this.y = e * f - c * g;
- this.z = c * h - d * f;
- return this
- },
- angleTo: function(a) {
- a = this.dot(a) / (this.length() * a.length());
- return Math.acos(THREE.Math.clamp(a, - 1, 1))
- },
- distanceTo: function(a) {
- return Math.sqrt(this.distanceToSquared(a))
- },
- distanceToSquared: function(a) {
- var b = this.x - a.x,
- c = this.y - a.y,
- a = this.z - a.z;
- return b * b + c * c + a * a
- },
- setEulerFromRotationMatrix: function() {
- console.error("REMOVED: Vector3's setEulerFromRotationMatrix has been removed in favor of Euler.setFromRotationMatrix(), please update your code.")
- },
- setEulerFromQuaternion: function() {
- console.error("REMOVED: Vector3's setEulerFromQuaternion: has been removed in favor of Euler.setFromQuaternion(), please update your code.")
- },
- getPositionFromMatrix: function(a) {
- console.warn("DEPRECATED: Vector3's .getPositionFromMatrix() has been renamed to .setFromMatrixPosition(). Please update your code.");
- return this.setFromMatrixPosition(a)
- },
- getScaleFromMatrix: function(a) {
- console.warn("DEPRECATED: Vector3's .getScaleFromMatrix() has been renamed to .setFromMatrixScale(). Please update your code.");
- return this.setFromMatrixScale(a)
- },
- getColumnFromMatrix: function(a, b) {
- console.warn("DEPRECATED: Vector3's .getColumnFromMatrix() has been renamed to .setFromMatrixColumn(). Please update your code.");
- return this.setFromMatrixColumn(a, b)
- },
- setFromMatrixPosition: function(a) {
- this.x = a.elements[12];
- this.y = a.elements[13];
- this.z = a.elements[14];
- return this
- },
- setFromMatrixScale: function(a) {
- var b = this.set(a.elements[0], a.elements[1], a.elements[2]).length(),
- c = this.set(a.elements[4], a.elements[5], a.elements[6]).length(),
- a = this.set(a.elements[8], a.elements[9], a.elements[10]).length();
- this.x = b;
- this.y = c;
- this.z = a;
- return this
- },
- setFromMatrixColumn: function(a, b) {
- var c = 4 * a,
- d = b.elements;
- this.x = d[c];
- this.y = d[c + 1];
- this.z = d[c + 2];
- return this
- },
- equals: function(a) {
- return a.x === this.x && a.y === this.y && a.z === this.z
- },
- fromArray: function(a) {
- this.x = a[0];
- this.y = a[1];
- this.z = a[2];
- return this
- },
- toArray: function() {
- return [this.x, this.y, this.z]
- },
- clone: function() {
- return new THREE.Vector3(this.x, this.y, this.z)
- }
-};
-THREE.extend(THREE.Vector3.prototype, {
- applyEuler: function() {
- var a = new THREE.Quaternion;
- return function(b) {
- !1 === b instanceof THREE.Euler && console.error("ERROR: Vector3's .applyEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.");
- this.applyQuaternion(a.setFromEuler(b));
- return this
- }
- }(),
- applyAxisAngle: function() {
- var a = new THREE.Quaternion;
- return function(b, c) {
- this.applyQuaternion(a.setFromAxisAngle(b, c));
- return this
- }
- }(),
- projectOnVector: function() {
- var a = new THREE.Vector3;
- return function(b) {
- a.copy(b).normalize();
- b = this.dot(a);
- return this.copy(a).multiplyScalar(b)
- }
- }(),
- projectOnPlane: function() {
- var a = new THREE.Vector3;
- return function(b) {
- a.copy(this).projectOnVector(b);
- return this.sub(a)
- }
- }(),
- reflect: function() {
- var a = new THREE.Vector3;
- return function(b) {
- a.copy(this).projectOnVector(b).multiplyScalar(2);
- return this.subVectors(a, this)
- }
- }()
-});
-THREE.Vector4 = function(a, b, c, d) {
- this.x = a || 0;
- this.y = b || 0;
- this.z = c || 0;
- this.w = void 0 !== d ? d : 1
-};
-THREE.Vector4.prototype = {
- constructor: THREE.Vector4,
- set: function(a, b, c, d) {
- this.x = a;
- this.y = b;
- this.z = c;
- this.w = d;
- return this
- },
- setX: function(a) {
- this.x = a;
- return this
- },
- setY: function(a) {
- this.y = a;
- return this
- },
- setZ: function(a) {
- this.z = a;
- return this
- },
- setW: function(a) {
- this.w = a;
- return this
- },
- setComponent: function(a, b) {
- switch (a) {
- case 0:
- this.x = b;
- break;
- case 1:
- this.y = b;
- break;
- case 2:
- this.z = b;
- break;
- case 3:
- this.w = b;
- break;
- default:
- throw Error("index is out of range: " + a);
- }
- },
- getComponent: function(a) {
- switch (a) {
- case 0:
- return this.x;
- case 1:
- return this.y;
- case 2:
- return this.z;
- case 3:
- return this.w;
- default:
- throw Error("index is out of range: " + a);
- }
- },
- copy: function(a) {
- this.x = a.x;
- this.y = a.y;
- this.z = a.z;
- this.w = void 0 !== a.w ? a.w : 1;
- return this
- },
- add: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b);
- this.x += a.x;
- this.y += a.y;
- this.z += a.z;
- this.w += a.w;
- return this
- },
- addScalar: function(a) {
- this.x += a;
- this.y += a;
- this.z += a;
- this.w += a;
- return this
- },
- addVectors: function(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
- },
- sub: function(a, b) {
- if (void 0 !== b) return console.warn("DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b);
- this.x -= a.x;
- this.y -= a.y;
- this.z -= a.z;
- this.w -= a.w;
- return this
- },
- subVectors: function(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
- },
- multiplyScalar: function(a) {
- this.x *= a;
- this.y *= a;
- this.z *= a;
- this.w *= a;
- return this
- },
- applyMatrix4: function(a) {
- var b = this.x,
- c = this.y,
- d = this.z,
- e = this.w,
- a = a.elements;
- this.x = a[0] * b + a[4] * c + a[8] * d + a[12] * e;
- this.y = a[1] * b + a[5] * c + a[9] * d + a[13] * e;
- this.z = a[2] * b + a[6] * c + a[10] * d + a[14] * e;
- this.w = a[3] * b + a[7] * c + a[11] * d + a[15] * e;
- return this
- },
- divideScalar: function(a) {
- 0 !== a ? (a = 1 / a, this.x *= a, this.y *= a, this.z *= a, this.w *= a) : (this.z = this.y = this.x = 0, this.w = 1);
- return this
- },
- setAxisAngleFromQuaternion: function(a) {
- this.w = 2 * Math.acos(a.w);
- var b = Math.sqrt(1 - a.w * a.w);
- 1E-4 > b ? (this.x = 1, this.z = this.y = 0) : (this.x = a.x / b,
- this.y = a.y / b, this.z = a.z / b);
- return this
- },
- setAxisAngleFromRotationMatrix: function(a) {
- var b, c, d, a = a.elements,
- e = a[0];
- d = a[4];
- var f = a[8],
- h = a[1],
- g = a[5],
- i = a[9];
- c = a[2];
- b = a[6];
- var k = a[10];
- if (0.01 > Math.abs(d - h) && 0.01 > Math.abs(f - c) && 0.01 > Math.abs(i - b)) {
- if (0.1 > Math.abs(d + h) && 0.1 > Math.abs(f + c) && 0.1 > Math.abs(i + b) && 0.1 > Math.abs(e + g + k - 3)) return this.set(1, 0, 0, 0), this;
- a = Math.PI;
- e = (e + 1) / 2;
- g = (g + 1) / 2;
- k = (k + 1) / 2;
- d = (d + h) / 4;
- f = (f + c) / 4;
- i = (i + b) / 4;
- e > g && e > k ? 0.01 > e ? (b = 0, d = c = 0.707106781) : (b = Math.sqrt(e), c = d / b, d = f / b) : g > k ? 0.01 > g ? (b = 0.707106781, c = 0, d = 0.707106781) : (c = Math.sqrt(g), b = d / c, d = i / c) : 0.01 > k ? (c = b = 0.707106781, d = 0) : (d = Math.sqrt(k), b = f / d, c = i / d);
- this.set(b, c, d, a);
- return this
- }
- a = Math.sqrt((b - i) * (b - i) + (f - c) * (f - c) + (h - d) * (h - d));
- 0.001 > Math.abs(a) && (a = 1);
- this.x = (b - i) / a;
- this.y = (f - c) / a;
- this.z = (h - d) / a;
- this.w = Math.acos((e + g + k - 1) / 2);
- return this
- },
- min: function(a) {
- this.x > a.x && (this.x = a.x);
- this.y > a.y && (this.y = a.y);
- this.z > a.z && (this.z = a.z);
- this.w > a.w && (this.w = a.w);
- return this
- },
- max: function(a) {
- this.x < a.x && (this.x = a.x);
- this.y < a.y && (this.y = a.y);
- this.z < a.z && (this.z = a.z);
- this.w < a.w && (this.w = a.w);
- return this
- },
- clamp: function(a, b) {
- this.x < a.x ? this.x = a.x : this.x > b.x && (this.x = b.x);
- this.y < a.y ? this.y = a.y : this.y > b.y && (this.y = b.y);
- this.z < a.z ? this.z = a.z : this.z > b.z && (this.z = b.z);
- this.w < a.w ? this.w = a.w : this.w > b.w && (this.w = b.w);
- return this
- },
- negate: function() {
- return this.multiplyScalar(-1)
- },
- dot: function(a) {
- return this.x * a.x + this.y * a.y + this.z * a.z + this.w * a.w
- },
- lengthSq: function() {
- return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w
- },
- length: function() {
- return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
- },
- lengthManhattan: function() {
- return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w)
- },
- normalize: function() {
- return this.divideScalar(this.length())
- },
- setLength: function(a) {
- var b = this.length();
- 0 !== b && a !== b && this.multiplyScalar(a / b);
- return this
- },
- lerp: function(a, b) {
- this.x += (a.x - this.x) * b;
- this.y += (a.y - this.y) * b;
- this.z += (a.z - this.z) * b;
- this.w += (a.w - this.w) * b;
- return this
- },
- equals: function(a) {
- return a.x === this.x && a.y === this.y && a.z === this.z && a.w === this.w
- },
- fromArray: function(a) {
- this.x = a[0];
- this.y = a[1];
- this.z = a[2];
- this.w = a[3];
- return this
- },
- toArray: function() {
- return [this.x, this.y, this.z, this.w]
- },
- clone: function() {
- return new THREE.Vector4(this.x, this.y, this.z, this.w)
- }
-};
-THREE.Euler = function(a, b, c, d) {
- this._x = a || 0;
- this._y = b || 0;
- this._z = c || 0;
- this._order = d || THREE.Euler.DefaultOrder
-};
-THREE.Euler.RotationOrders = "XYZ YZX ZXY XZY YXZ ZYX".split(" ");
-THREE.Euler.DefaultOrder = "XYZ";
-THREE.Euler.prototype = {
- constructor: THREE.Euler,
- _x: 0,
- _y: 0,
- _z: 0,
- _order: THREE.Euler.DefaultOrder,
- _quaternion: void 0,
- _updateQuaternion: function() {
- void 0 !== this._quaternion && this._quaternion.setFromEuler(this, !1)
- },
- get x() {
- return this._x
- },
- set x(a) {
- this._x = a;
- this._updateQuaternion()
- },
- get y() {
- return this._y
- },
- set y(a) {
- this._y = a;
- this._updateQuaternion()
- },
- get z() {
- return this._z
- },
- set z(a) {
- this._z = a;
- this._updateQuaternion()
- },
- get order() {
- return this._order
- },
- set order(a) {
- this._order = a;
- this._updateQuaternion()
- },
- set: function(a, b, c, d) {
- this._x = a;
- this._y = b;
- this._z = c;
- this._order = d || this._order;
- this._updateQuaternion();
- return this
- },
- copy: function(a) {
- this._x = a._x;
- this._y = a._y;
- this._z = a._z;
- this._order = a._order;
- this._updateQuaternion();
- return this
- },
- setFromRotationMatrix: function(a, b) {
- function c(a) {
- return Math.min(Math.max(a, - 1), 1)
- }
- var d = a.elements,
- e = d[0],
- f = d[4],
- h = d[8],
- g = d[1],
- i = d[5],
- k = d[9],
- m = d[2],
- l = d[6],
- d = d[10],
- b = b || this._order;
- "XYZ" === b ? (this._y = Math.asin(c(h)), 0.99999 > Math.abs(h) ? (this._x = Math.atan2(-k, d), this._z = Math.atan2(-f, e)) : (this._x = Math.atan2(l, i), this._z = 0)) : "YXZ" === b ? (this._x = Math.asin(-c(k)), 0.99999 > Math.abs(k) ? (this._y = Math.atan2(h, d), this._z = Math.atan2(g, i)) : (this._y = Math.atan2(-m, e), this._z = 0)) : "ZXY" === b ? (this._x = Math.asin(c(l)), 0.99999 > Math.abs(l) ? (this._y = Math.atan2(-m, d), this._z = Math.atan2(-f, i)) : (this._y = 0, this._z = Math.atan2(g, e))) : "ZYX" === b ? (this._y = Math.asin(-c(m)), 0.99999 > Math.abs(m) ? (this._x = Math.atan2(l, d), this._z = Math.atan2(g, e)) : (this._x = 0, this._z = Math.atan2(-f, i))) : "YZX" === b ? (this._z = Math.asin(c(g)), 0.99999 > Math.abs(g) ? (this._x = Math.atan2(-k, i), this._y = Math.atan2(-m, e)) : (this._x = 0, this._y = Math.atan2(h, d))) : "XZY" === b ? (this._z = Math.asin(-c(f)), 0.99999 > Math.abs(f) ? (this._x = Math.atan2(l, i), this._y = Math.atan2(h, e)) : (this._x = Math.atan2(-k, d), this._y = 0)) : console.warn("WARNING: Euler.setFromRotationMatrix() given unsupported order: " + b);
- this._order = b;
- this._updateQuaternion();
- return this
- },
- setFromQuaternion: function(a, b, c) {
- function d(a) {
- return Math.min(Math.max(a, - 1), 1)
- }
- var e = a.x * a.x,
- f = a.y * a.y,
- h = a.z * a.z,
- g = a.w * a.w,
- b = b || this._order;
- "XYZ" === b ? (this._x = Math.atan2(2 * (a.x * a.w - a.y * a.z), g - e - f + h), this._y = Math.asin(d(2 * (a.x * a.z + a.y * a.w))), this._z = Math.atan2(2 * (a.z * a.w - a.x * a.y), g + e - f - h)) : "YXZ" === b ? (this._x = Math.asin(d(2 * (a.x * a.w - a.y * a.z))), this._y = Math.atan2(2 * (a.x * a.z + a.y * a.w), g - e - f + h), this._z = Math.atan2(2 * (a.x * a.y + a.z * a.w), g - e + f - h)) : "ZXY" === b ? (this._x = Math.asin(d(2 * (a.x * a.w + a.y * a.z))), this._y = Math.atan2(2 * (a.y * a.w - a.z * a.x), g - e - f + h), this._z = Math.atan2(2 * (a.z * a.w - a.x * a.y), g - e + f - h)) : "ZYX" === b ? (this._x = Math.atan2(2 * (a.x * a.w + a.z * a.y), g - e - f + h), this._y = Math.asin(d(2 * (a.y * a.w - a.x * a.z))), this._z = Math.atan2(2 * (a.x * a.y + a.z * a.w), g + e - f - h)) : "YZX" === b ? (this._x = Math.atan2(2 * (a.x * a.w - a.z * a.y), g - e + f - h), this._y = Math.atan2(2 * (a.y * a.w - a.x * a.z), g + e - f - h), this._z = Math.asin(d(2 * (a.x * a.y + a.z * a.w)))) : "XZY" === b ? (this._x = Math.atan2(2 * (a.x * a.w + a.y * a.z), g - e + f - h), this._y = Math.atan2(2 * (a.x * a.z + a.y * a.w), g + e - f - h), this._z = Math.asin(d(2 * (a.z * a.w - a.x * a.y)))) : console.warn("WARNING: Euler.setFromQuaternion() given unsupported order: " + b);
- this._order = b;
- !1 !== c && this._updateQuaternion();
- return this
- },
- reorder: function() {
- var a = new THREE.Quaternion;
- return function(b) {
- a.setFromEuler(this);
- this.setFromQuaternion(a, b)
- }
- }(),
- fromArray: function(a) {
- this._x = a[0];
- this._y = a[1];
- this._z = a[2];
- void 0 !== a[3] && (this._order = a[3]);
- this._updateQuaternion();
- return this
- },
- toArray: function() {
- return [this._x, this._y, this._z, this._order]
- },
- equals: function(a) {
- return a._x === this._x && a._y === this._y && a._z === this._z && a._order === this._order
- },
- clone: function() {
- return new THREE.Euler(this._x,
- this._y, this._z, this._order)
- }
-};
-THREE.Line3 = function(a, b) {
- this.start = void 0 !== a ? a : new THREE.Vector3;
- this.end = void 0 !== b ? b : new THREE.Vector3
-};
-THREE.Line3.prototype = {
- constructor: THREE.Line3,
- set: function(a, b) {
- this.start.copy(a);
- this.end.copy(b);
- return this
- },
- copy: function(a) {
- this.start.copy(a.start);
- this.end.copy(a.end);
- return this
- },
- center: function(a) {
- return (a || new THREE.Vector3).addVectors(this.start, this.end).multiplyScalar(0.5)
- },
- delta: function(a) {
- return (a || new THREE.Vector3).subVectors(this.end, this.start)
- },
- distanceSq: function() {
- return this.start.distanceToSquared(this.end)
- },
- distance: function() {
- return this.start.distanceTo(this.end)
- },
- at: function(a,
- b) {
- var c = b || new THREE.Vector3;
- return this.delta(c).multiplyScalar(a).add(this.start)
- },
- closestPointToPointParameter: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function(c, d) {
- a.subVectors(c, this.start);
- b.subVectors(this.end, this.start);
- var e = b.dot(b),
- e = b.dot(a) / e;
- d && (e = THREE.Math.clamp(e, 0, 1));
- return e
- }
- }(),
- closestPointToPoint: function(a, b, c) {
- a = this.closestPointToPointParameter(a, b);
- c = c || new THREE.Vector3;
- return this.delta(c).multiplyScalar(a).add(this.start)
- },
- applyMatrix4: function(a) {
- this.start.applyMatrix4(a);
- this.end.applyMatrix4(a);
- return this
- },
- equals: function(a) {
- return a.start.equals(this.start) && a.end.equals(this.end)
- },
- clone: function() {
- return (new THREE.Line3).copy(this)
- }
-};
-THREE.Box2 = function(a, b) {
- this.min = void 0 !== a ? a : new THREE.Vector2(Infinity, Infinity);
- this.max = void 0 !== b ? b : new THREE.Vector2(-Infinity, - Infinity)
-};
-THREE.Box2.prototype = {
- constructor: THREE.Box2,
- set: function(a, b) {
- this.min.copy(a);
- this.max.copy(b);
- return this
- },
- setFromPoints: function(a) {
- if (0 < a.length) {
- var b = a[0];
- this.min.copy(b);
- this.max.copy(b);
- for (var c = 1, d = a.length; c < d; c++) b = a[c], b.x < this.min.x ? this.min.x = b.x : b.x > this.max.x && (this.max.x = b.x), b.y < this.min.y ? this.min.y = b.y : b.y > this.max.y && (this.max.y = b.y)
- } else this.makeEmpty();
- return this
- },
- setFromCenterAndSize: function() {
- var a = new THREE.Vector2;
- return function(b, c) {
- var d = a.copy(c).multiplyScalar(0.5);
- this.min.copy(b).sub(d);
- this.max.copy(b).add(d);
- return this
- }
- }(),
- copy: function(a) {
- this.min.copy(a.min);
- this.max.copy(a.max);
- return this
- },
- makeEmpty: function() {
- this.min.x = this.min.y = Infinity;
- this.max.x = this.max.y = -Infinity;
- return this
- },
- empty: function() {
- return this.max.x < this.min.x || this.max.y < this.min.y
- },
- center: function(a) {
- return (a || new THREE.Vector2).addVectors(this.min, this.max).multiplyScalar(0.5)
- },
- size: function(a) {
- return (a || new THREE.Vector2).subVectors(this.max, this.min)
- },
- expandByPoint: function(a) {
- this.min.min(a);
- this.max.max(a);
- return this
- },
- expandByVector: function(a) {
- this.min.sub(a);
- this.max.add(a);
- return this
- },
- expandByScalar: function(a) {
- this.min.addScalar(-a);
- this.max.addScalar(a);
- return this
- },
- containsPoint: function(a) {
- return a.x < this.min.x || a.x > this.max.x || a.y < this.min.y || a.y > this.max.y ? !1 : !0
- },
- containsBox: function(a) {
- return this.min.x <= a.min.x && a.max.x <= this.max.x && this.min.y <= a.min.y && a.max.y <= this.max.y ? !0 : !1
- },
- getParameter: function(a, b) {
- return (b || new THREE.Vector2).set((a.x - this.min.x) / (this.max.x - this.min.x), (a.y - this.min.y) / (this.max.y - this.min.y))
- },
- isIntersectionBox: function(a) {
- return a.max.x < this.min.x || a.min.x > this.max.x || a.max.y < this.min.y || a.min.y > this.max.y ? !1 : !0
- },
- clampPoint: function(a, b) {
- return (b || new THREE.Vector2).copy(a).clamp(this.min, this.max)
- },
- distanceToPoint: function() {
- var a = new THREE.Vector2;
- return function(b) {
- return a.copy(b).clamp(this.min, this.max).sub(b).length()
- }
- }(),
- intersect: function(a) {
- this.min.max(a.min);
- this.max.min(a.max);
- return this
- },
- union: function(a) {
- this.min.min(a.min);
- this.max.max(a.max);
- return this
- },
- translate: function(a) {
- this.min.add(a);
- this.max.add(a);
- return this
- },
- equals: function(a) {
- return a.min.equals(this.min) && a.max.equals(this.max)
- },
- clone: function() {
- return (new THREE.Box2).copy(this)
- }
-};
-THREE.Box3 = function(a, b) {
- this.min = void 0 !== a ? a : new THREE.Vector3(Infinity, Infinity, Infinity);
- this.max = void 0 !== b ? b : new THREE.Vector3(-Infinity, - Infinity, - Infinity)
-};
-THREE.Box3.prototype = {
- constructor: THREE.Box3,
- set: function(a, b) {
- this.min.copy(a);
- this.max.copy(b);
- return this
- },
- addPoint: function(a) {
- a.x < this.min.x ? this.min.x = a.x : a.x > this.max.x && (this.max.x = a.x);
- a.y < this.min.y ? this.min.y = a.y : a.y > this.max.y && (this.max.y = a.y);
- a.z < this.min.z ? this.min.z = a.z : a.z > this.max.z && (this.max.z = a.z)
- },
- setFromPoints: function(a) {
- if (0 < a.length) {
- var b = a[0];
- this.min.copy(b);
- this.max.copy(b);
- for (var b = 1, c = a.length; b < c; b++) this.addPoint(a[b])
- } else this.makeEmpty();
- return this
- },
- setFromCenterAndSize: function() {
- var a = new THREE.Vector3;
- return function(b, c) {
- var d = a.copy(c).multiplyScalar(0.5);
- this.min.copy(b).sub(d);
- this.max.copy(b).add(d);
- return this
- }
- }(),
- setFromObject: function() {
- var a = new THREE.Vector3;
- return function(b) {
- var c = this;
- b.updateMatrixWorld(!0);
- this.makeEmpty();
- b.traverse(function(b) {
- if (void 0 !== b.geometry && void 0 !== b.geometry.vertices) for (var e = b.geometry.vertices, f = 0, h = e.length; f < h; f++) a.copy(e[f]), a.applyMatrix4(b.matrixWorld), c.expandByPoint(a)
- });
- return this
- }
- }(),
- copy: function(a) {
- this.min.copy(a.min);
- this.max.copy(a.max);
- return this
- },
- makeEmpty: function() {
- this.min.x = this.min.y = this.min.z = Infinity;
- this.max.x = this.max.y = this.max.z = -Infinity;
- return this
- },
- empty: function() {
- return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z
- },
- center: function(a) {
- return (a || new THREE.Vector3).addVectors(this.min, this.max).multiplyScalar(0.5)
- },
- size: function(a) {
- return (a || new THREE.Vector3).subVectors(this.max, this.min)
- },
- expandByPoint: function(a) {
- this.min.min(a);
- this.max.max(a);
- return this
- },
- expandByVector: function(a) {
- this.min.sub(a);
- this.max.add(a);
- return this
- },
- expandByScalar: function(a) {
- this.min.addScalar(-a);
- this.max.addScalar(a);
- return this
- },
- containsPoint: function(a) {
- return a.x < this.min.x || a.x > this.max.x || a.y < this.min.y || a.y > this.max.y || a.z < this.min.z || a.z > this.max.z ? !1 : !0
- },
- containsBox: function(a) {
- return this.min.x <= a.min.x && a.max.x <= this.max.x && this.min.y <= a.min.y && a.max.y <= this.max.y && this.min.z <= a.min.z && a.max.z <= this.max.z ? !0 : !1
- },
- getParameter: function(a, b) {
- return (b || new THREE.Vector3).set((a.x - this.min.x) / (this.max.x - this.min.x), (a.y - this.min.y) / (this.max.y - this.min.y), (a.z - this.min.z) / (this.max.z - this.min.z))
- },
- isIntersectionBox: function(a) {
- return a.max.x < this.min.x || a.min.x > this.max.x || a.max.y < this.min.y || a.min.y > this.max.y || a.max.z < this.min.z || a.min.z > this.max.z ? !1 : !0
- },
- clampPoint: function(a, b) {
- return (b || new THREE.Vector3).copy(a).clamp(this.min, this.max)
- },
- distanceToPoint: function() {
- var a = new THREE.Vector3;
- return function(b) {
- return a.copy(b).clamp(this.min, this.max).sub(b).length()
- }
- }(),
- getBoundingSphere: function() {
- var a = new THREE.Vector3;
- return function(b) {
- b = b || new THREE.Sphere;
- b.center = this.center();
- b.radius = 0.5 * this.size(a).length();
- return b
- }
- }(),
- intersect: function(a) {
- this.min.max(a.min);
- this.max.min(a.max);
- return this
- },
- union: function(a) {
- this.min.min(a.min);
- this.max.max(a.max);
- return this
- },
- applyMatrix4: function() {
- var a = [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(b) {
- a[0].set(this.min.x, this.min.y,
- this.min.z).applyMatrix4(b);
- a[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(b);
- a[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(b);
- a[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(b);
- a[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(b);
- a[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(b);
- a[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(b);
- a[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(b);
- this.makeEmpty();
- this.setFromPoints(a);
- return this
- }
- }(),
- translate: function(a) {
- this.min.add(a);
- this.max.add(a);
- return this
- },
- equals: function(a) {
- return a.min.equals(this.min) && a.max.equals(this.max)
- },
- clone: function() {
- return (new THREE.Box3).copy(this)
- }
-};
-THREE.Matrix3 = function(a, b, c, d, e, f, h, g, i) {
- this.elements = new Float32Array(9);
- this.set(void 0 !== a ? a : 1, b || 0, c || 0, d || 0, void 0 !== e ? e : 1, f || 0, h || 0, g || 0, void 0 !== i ? i : 1)
-};
-THREE.Matrix3.prototype = {
- constructor: THREE.Matrix3,
- set: function(a, b, c, d, e, f, h, g, i) {
- var k = this.elements;
- k[0] = a;
- k[3] = b;
- k[6] = c;
- k[1] = d;
- k[4] = e;
- k[7] = f;
- k[2] = h;
- k[5] = g;
- k[8] = i;
- return this
- },
- identity: function() {
- this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);
- return this
- },
- copy: function(a) {
- a = a.elements;
- this.set(a[0], a[3], a[6], a[1], a[4], a[7], a[2], a[5], a[8]);
- return this
- },
- multiplyVector3: function(a) {
- console.warn("DEPRECATED: Matrix3's .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");
- return a.applyMatrix3(this)
- },
- multiplyVector3Array: function() {
- var a = new THREE.Vector3;
- return function(b) {
- for (var c = 0, d = b.length; c < d; c += 3) a.x = b[c], a.y = b[c + 1], a.z = b[c + 2], a.applyMatrix3(this), b[c] = a.x, b[c + 1] = a.y, b[c + 2] = a.z;
- return b
- }
- }(),
- multiplyScalar: function(a) {
- var b = this.elements;
- b[0] *= a;
- b[3] *= a;
- b[6] *= a;
- b[1] *= a;
- b[4] *= a;
- b[7] *= a;
- b[2] *= a;
- b[5] *= a;
- b[8] *= a;
- return this
- },
- determinant: function() {
- var a = this.elements,
- b = a[0],
- c = a[1],
- d = a[2],
- e = a[3],
- f = a[4],
- h = a[5],
- g = a[6],
- i = a[7],
- a = a[8];
- return b * f * a - b * h * i - c * e * a + c * h * g + d * e * i - d * f * g
- },
- getInverse: function(a,
- b) {
- var c = a.elements,
- d = this.elements;
- d[0] = c[10] * c[5] - c[6] * c[9];
- d[1] = -c[10] * c[1] + c[2] * c[9];
- d[2] = c[6] * c[1] - c[2] * c[5];
- d[3] = -c[10] * c[4] + c[6] * c[8];
- d[4] = c[10] * c[0] - c[2] * c[8];
- d[5] = -c[6] * c[0] + c[2] * c[4];
- d[6] = c[9] * c[4] - c[5] * c[8];
- d[7] = -c[9] * c[0] + c[1] * c[8];
- d[8] = c[5] * c[0] - c[1] * c[4];
- c = c[0] * d[0] + c[1] * d[3] + c[2] * d[6];
- if (0 === c) {
- if (b) throw Error("Matrix3.getInverse(): can't invert matrix, determinant is 0");
- console.warn("Matrix3.getInverse(): can't invert matrix, determinant is 0");
- this.identity();
- return this
- }
- this.multiplyScalar(1 / c);
- return this
- },
- transpose: function() {
- var a, b = this.elements;
- a = b[1];
- b[1] = b[3];
- b[3] = a;
- a = b[2];
- b[2] = b[6];
- b[6] = a;
- a = b[5];
- b[5] = b[7];
- b[7] = a;
- return this
- },
- getNormalMatrix: function(a) {
- this.getInverse(a).transpose();
- return this
- },
- transposeIntoArray: function(a) {
- var b = this.elements;
- a[0] = b[0];
- a[1] = b[3];
- a[2] = b[6];
- a[3] = b[1];
- a[4] = b[4];
- a[5] = b[7];
- a[6] = b[2];
- a[7] = b[5];
- a[8] = b[8];
- return this
- },
- clone: function() {
- var a = this.elements;
- return new THREE.Matrix3(a[0], a[3], a[6], a[1], a[4], a[7], a[2], a[5], a[8])
- }
-};
-THREE.Matrix4 = function(a, b, c, d, e, f, h, g, i, k, m, l, p, t, s, q) {
- var n = this.elements = new Float32Array(16);
- n[0] = void 0 !== a ? a : 1;
- n[4] = b || 0;
- n[8] = c || 0;
- n[12] = d || 0;
- n[1] = e || 0;
- n[5] = void 0 !== f ? f : 1;
- n[9] = h || 0;
- n[13] = g || 0;
- n[2] = i || 0;
- n[6] = k || 0;
- n[10] = void 0 !== m ? m : 1;
- n[14] = l || 0;
- n[3] = p || 0;
- n[7] = t || 0;
- n[11] = s || 0;
- n[15] = void 0 !== q ? q : 1
-};
-THREE.Matrix4.prototype = {
- constructor: THREE.Matrix4,
- set: function(a, b, c, d, e, f, h, g, i, k, m, l, p, t, s, q) {
- var n = this.elements;
- n[0] = a;
- n[4] = b;
- n[8] = c;
- n[12] = d;
- n[1] = e;
- n[5] = f;
- n[9] = h;
- n[13] = g;
- n[2] = i;
- n[6] = k;
- n[10] = m;
- n[14] = l;
- n[3] = p;
- n[7] = t;
- n[11] = s;
- n[15] = q;
- return this
- },
- identity: function() {
- this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
- return this
- },
- copy: function(a) {
- this.elements.set(a.elements);
- return this
- },
- extractPosition: function(a) {
- console.warn("DEPRECATED: Matrix4's .extractPosition() has been renamed to .copyPosition().");
- return this.copyPosition(a)
- },
- copyPosition: function(a) {
- var b = this.elements,
- a = a.elements;
- b[12] = a[12];
- b[13] = a[13];
- b[14] = a[14];
- return this
- },
- extractRotation: function() {
- var a = new THREE.Vector3;
- return function(b) {
- var c = this.elements,
- b = b.elements,
- d = 1 / a.set(b[0], b[1], b[2]).length(),
- e = 1 / a.set(b[4], b[5], b[6]).length(),
- f = 1 / a.set(b[8], b[9], b[10]).length();
- c[0] = b[0] * d;
- c[1] = b[1] * d;
- c[2] = b[2] * d;
- c[4] = b[4] * e;
- c[5] = b[5] * e;
- c[6] = b[6] * e;
- c[8] = b[8] * f;
- c[9] = b[9] * f;
- c[10] = b[10] * f;
- return this
- }
- }(),
- makeRotationFromEuler: function(a) {
- !1 === a instanceof THREE.Euler && console.error("ERROR: Matrix's .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.");
- var b = this.elements,
- c = a.x,
- d = a.y,
- e = a.z,
- f = Math.cos(c),
- c = Math.sin(c),
- h = Math.cos(d),
- d = Math.sin(d),
- g = Math.cos(e),
- e = Math.sin(e);
- if ("XYZ" === a.order) {
- var a = f * g,
- i = f * e,
- k = c * g,
- m = c * e;
- b[0] = h * g;
- b[4] = -h * e;
- b[8] = d;
- b[1] = i + k * d;
- b[5] = a - m * d;
- b[9] = -c * h;
- b[2] = m - a * d;
- b[6] = k + i * d;
- b[10] = f * h
- } else "YXZ" === a.order ? (a = h * g, i = h * e, k = d * g, m = d * e, b[0] = a + m * c, b[4] = k * c - i, b[8] = f * d, b[1] = f * e, b[5] = f * g, b[9] = -c, b[2] = i * c - k, b[6] = m + a * c, b[10] = f * h) : "ZXY" === a.order ? (a = h * g, i = h * e, k = d * g, m = d * e, b[0] = a - m * c, b[4] = -f * e, b[8] = k + i * c, b[1] = i + k * c, b[5] = f * g, b[9] = m - a * c, b[2] = -f * d, b[6] = c, b[10] = f * h) : "ZYX" === a.order ? (a = f * g, i = f * e, k = c * g, m = c * e, b[0] = h * g, b[4] = k * d - i, b[8] = a * d + m, b[1] = h * e, b[5] = m * d + a, b[9] = i * d - k, b[2] = -d, b[6] = c * h, b[10] = f * h) : "YZX" === a.order ? (a = f * h, i = f * d, k = c * h, m = c * d, b[0] = h * g, b[4] = m - a * e, b[8] = k * e + i, b[1] = e, b[5] = f * g, b[9] = -c * g, b[2] = -d * g, b[6] = i * e + k, b[10] = a - m * e) : "XZY" === a.order && (a = f * h, i = f * d, k = c * h, m = c * d, b[0] = h * g, b[4] = -e, b[8] = d * g, b[1] = a * e + m, b[5] = f * g, b[9] = i * e - k, b[2] = k * e - i, b[6] = c * g, b[10] = m * e + a);
- b[3] = 0;
- b[7] = 0;
- b[11] = 0;
- b[12] = 0;
- b[13] = 0;
- b[14] = 0;
- b[15] = 1;
- return this
- },
- setRotationFromQuaternion: function(a) {
- console.warn("DEPRECATED: Matrix4's .setRotationFromQuaternion() has been deprecated in favor of makeRotationFromQuaternion. Please update your code.");
- return this.makeRotationFromQuaternion(a)
- },
- makeRotationFromQuaternion: function(a) {
- var b = this.elements,
- c = a.x,
- d = a.y,
- e = a.z,
- f = a.w,
- h = c + c,
- g = d + d,
- i = e + e,
- a = c * h,
- k = c * g,
- c = c * i,
- m = d * g,
- d = d * i,
- e = e * i,
- h = f * h,
- g = f * g,
- f = f * i;
- b[0] = 1 - (m + e);
- b[4] = k - f;
- b[8] = c + g;
- b[1] = k + f;
- b[5] = 1 - (a + e);
- b[9] = d - h;
- b[2] = c - g;
- b[6] = d + h;
- b[10] = 1 - (a + m);
- b[3] = 0;
- b[7] = 0;
- b[11] = 0;
- b[12] = 0;
- b[13] = 0;
- b[14] = 0;
- b[15] = 1;
- return this
- },
- lookAt: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3,
- c = new THREE.Vector3;
- return function(d, e, f) {
- var h = this.elements;
- c.subVectors(d, e).normalize();
- 0 === c.length() && (c.z = 1);
- a.crossVectors(f, c).normalize();
- 0 === a.length() && (c.x += 1E-4, a.crossVectors(f, c).normalize());
- b.crossVectors(c, a);
- h[0] = a.x;
- h[4] = b.x;
- h[8] = c.x;
- h[1] = a.y;
- h[5] = b.y;
- h[9] = c.y;
- h[2] = a.z;
- h[6] = b.z;
- h[10] = c.z;
- return this
- }
- }(),
- multiply: function(a, b) {
- return void 0 !== b ? (console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."), this.multiplyMatrices(a, b)) : this.multiplyMatrices(this, a)
- },
- multiplyMatrices: function(a, b) {
- var c = a.elements,
- d = b.elements,
- e = this.elements,
- f = c[0],
- h = c[4],
- g = c[8],
- i = c[12],
- k = c[1],
- m = c[5],
- l = c[9],
- p = c[13],
- t = c[2],
- s = c[6],
- q = c[10],
- n = c[14],
- u = c[3],
- r = c[7],
- v = c[11],
- c = c[15],
- z = d[0],
- G = d[4],
- w = d[8],
- y = d[12],
- E = d[1],
- A = d[5],
- K = d[9],
- D = d[13],
- F = d[2],
- O = d[6],
- x = d[10],
- I = d[14],
- B = d[3],
- M = d[7],
- J = d[11],
- d = d[15];
- e[0] = f * z + h * E + g * F + i * B;
- e[4] = f * G + h * A + g * O + i * M;
- e[8] = f * w + h * K + g * x + i * J;
- e[12] = f * y + h * D + g * I + i * d;
- e[1] = k * z + m * E + l * F + p * B;
- e[5] = k * G + m * A + l * O + p * M;
- e[9] = k * w + m * K + l * x + p * J;
- e[13] = k * y + m * D + l * I + p * d;
- e[2] = t * z + s * E + q * F + n * B;
- e[6] = t * G + s * A + q * O + n * M;
- e[10] = t * w + s * K + q * x + n * J;
- e[14] = t * y + s * D + q * I + n * d;
- e[3] = u * z + r * E + v * F + c * B;
- e[7] = u * G + r * A + v * O + c * M;
- e[11] = u * w + r * K + v * x + c * J;
- e[15] = u * y + r * D + v * I + c * d;
- return this
- },
- multiplyToArray: function(a, b,
- c) {
- var d = this.elements;
- this.multiplyMatrices(a, b);
- c[0] = d[0];
- c[1] = d[1];
- c[2] = d[2];
- c[3] = d[3];
- c[4] = d[4];
- c[5] = d[5];
- c[6] = d[6];
- c[7] = d[7];
- c[8] = d[8];
- c[9] = d[9];
- c[10] = d[10];
- c[11] = d[11];
- c[12] = d[12];
- c[13] = d[13];
- c[14] = d[14];
- c[15] = d[15];
- return this
- },
- multiplyScalar: function(a) {
- var b = this.elements;
- b[0] *= a;
- b[4] *= a;
- b[8] *= a;
- b[12] *= a;
- b[1] *= a;
- b[5] *= a;
- b[9] *= a;
- b[13] *= a;
- b[2] *= a;
- b[6] *= a;
- b[10] *= a;
- b[14] *= a;
- b[3] *= a;
- b[7] *= a;
- b[11] *= a;
- b[15] *= a;
- return this
- },
- multiplyVector3: function(a) {
- console.warn("DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");
- return a.applyProjection(this)
- },
- multiplyVector4: function(a) {
- console.warn("DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
- return a.applyMatrix4(this)
- },
- multiplyVector3Array: function() {
- var a = new THREE.Vector3;
- return function(b) {
- for (var c = 0, d = b.length; c < d; c += 3) a.x = b[c], a.y = b[c + 1], a.z = b[c + 2], a.applyProjection(this), b[c] = a.x, b[c + 1] = a.y, b[c + 2] = a.z;
- return b
- }
- }(),
- rotateAxis: function(a) {
- console.warn("DEPRECATED: Matrix4's .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");
- a.transformDirection(this)
- },
- crossVector: function(a) {
- console.warn("DEPRECATED: Matrix4's .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");
- return a.applyMatrix4(this)
- },
- determinant: function() {
- var a = this.elements,
- b = a[0],
- c = a[4],
- d = a[8],
- e = a[12],
- f = a[1],
- h = a[5],
- g = a[9],
- i = a[13],
- k = a[2],
- m = a[6],
- l = a[10],
- p = a[14];
- return a[3] * (+e * g * m - d * i * m - e * h * l + c * i * l + d * h * p - c * g * p) + a[7] * (+b * g * p - b * i * l + e * f * l - d * f * p + d * i * k - e * g * k) + a[11] * (+b * i * m - b * h * p - e * f * m + c * f * p + e * h * k - c * i * k) + a[15] * (-d * h * k - b * g * m + b * h * l + d * f * m - c * f * l + c * g * k)
- },
- transpose: function() {
- var a = this.elements,
- b;
- b = a[1];
- a[1] = a[4];
- a[4] = b;
- b = a[2];
- a[2] = a[8];
- a[8] = b;
- b = a[6];
- a[6] = a[9];
- a[9] = b;
- b = a[3];
- a[3] = a[12];
- a[12] = b;
- b = a[7];
- a[7] = a[13];
- a[13] = b;
- b = a[11];
- a[11] = a[14];
- a[14] = b;
- return this
- },
- flattenToArray: function(a) {
- var b = this.elements;
- a[0] = b[0];
- a[1] = b[1];
- a[2] = b[2];
- a[3] = b[3];
- a[4] = b[4];
- a[5] = b[5];
- a[6] = b[6];
- a[7] = b[7];
- a[8] = b[8];
- a[9] = b[9];
- a[10] = b[10];
- a[11] = b[11];
- a[12] = b[12];
- a[13] = b[13];
- a[14] = b[14];
- a[15] = b[15];
- return a
- },
- flattenToArrayOffset: function(a, b) {
- var c = this.elements;
- a[b] = c[0];
- a[b + 1] = c[1];
- a[b + 2] = c[2];
- a[b + 3] = c[3];
- a[b + 4] = c[4];
- a[b + 5] = c[5];
- a[b + 6] = c[6];
- a[b + 7] = c[7];
- a[b + 8] = c[8];
- a[b + 9] = c[9];
- a[b + 10] = c[10];
- a[b + 11] = c[11];
- a[b + 12] = c[12];
- a[b + 13] = c[13];
- a[b + 14] = c[14];
- a[b + 15] = c[15];
- return a
- },
- getPosition: function() {
- var a = new THREE.Vector3;
- return function() {
- console.warn("DEPRECATED: Matrix4's .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");
- var b = this.elements;
- return a.set(b[12], b[13], b[14])
- }
- }(),
- setPosition: function(a) {
- var b = this.elements;
- b[12] = a.x;
- b[13] = a.y;
- b[14] = a.z;
- return this
- },
- getInverse: function(a, b) {
- var c = this.elements,
- d = a.elements,
- e = d[0],
- f = d[4],
- h = d[8],
- g = d[12],
- i = d[1],
- k = d[5],
- m = d[9],
- l = d[13],
- p = d[2],
- t = d[6],
- s = d[10],
- q = d[14],
- n = d[3],
- u = d[7],
- r = d[11],
- d = d[15];
- c[0] = m * q * u - l * s * u + l * t * r - k * q * r - m * t * d + k * s * d;
- c[4] = g * s * u - h * q * u - g * t * r + f * q * r + h * t * d - f * s * d;
- c[8] = h * l * u - g * m * u + g * k * r - f * l * r - h * k * d + f * m * d;
- c[12] = g * m * t - h * l * t - g * k * s + f * l * s + h * k * q - f * m * q;
- c[1] = l * s * n - m * q * n - l * p * r + i * q * r + m * p * d - i * s * d;
- c[5] = h * q * n - g * s * n + g * p * r - e * q * r - h * p * d + e * s * d;
- c[9] = g * m * n - h * l * n - g * i * r + e * l * r + h * i * d - e * m * d;
- c[13] = h * l * p - g * m * p + g * i * s - e * l * s - h * i * q + e * m * q;
- c[2] = k * q * n - l * t * n + l * p * u - i * q * u - k * p * d + i * t * d;
- c[6] = g * t * n - f * q * n - g * p * u + e * q * u + f * p * d - e * t * d;
- c[10] = f * l * n - g * k * n + g * i * u - e * l * u - f * i * d + e * k * d;
- c[14] = g * k * p - f * l * p - g * i * t + e * l * t + f * i * q - e * k * q;
- c[3] = m * t * n - k * s * n - m * p * u + i * s * u + k * p * r - i * t * r;
- c[7] = f * s * n - h * t * n + h * p * u - e * s * u - f * p * r + e * t * r;
- c[11] = h * k * n - f * m * n - h * i * u + e * m * u + f * i * r - e * k * r;
- c[15] = f * m * p - h * k * p + h * i * t - e * m * t - f * i * s + e * k * s;
- c = e * c[0] + i * c[4] + p * c[8] + n * c[12];
- if (0 == c) {
- if (b) throw Error("Matrix4.getInverse(): can't invert matrix, determinant is 0");
- console.warn("Matrix4.getInverse(): can't invert matrix, determinant is 0");
- this.identity();
- return this
- }
- this.multiplyScalar(1 / c);
- return this
- },
- translate: function() {
- console.warn("DEPRECATED: Matrix4's .translate() has been removed.")
- },
- rotateX: function() {
- console.warn("DEPRECATED: Matrix4's .rotateX() has been removed.")
- },
- rotateY: function() {
- console.warn("DEPRECATED: Matrix4's .rotateY() has been removed.")
- },
- rotateZ: function() {
- console.warn("DEPRECATED: Matrix4's .rotateZ() has been removed.")
- },
- rotateByAxis: function() {
- console.warn("DEPRECATED: Matrix4's .rotateByAxis() has been removed.")
- },
- scale: function(a) {
- var b = this.elements,
- c = a.x,
- d = a.y,
- a = a.z;
- b[0] *= c;
- b[4] *= d;
- b[8] *= a;
- b[1] *= c;
- b[5] *= d;
- b[9] *= a;
- b[2] *= c;
- b[6] *= d;
- b[10] *= a;
- b[3] *= c;
- b[7] *= d;
- b[11] *= a;
- return this
- },
- getMaxScaleOnAxis: function() {
- var a = this.elements;
- return Math.sqrt(Math.max(a[0] * a[0] + a[1] * a[1] + a[2] * a[2], Math.max(a[4] * a[4] + a[5] * a[5] + a[6] * a[6], a[8] * a[8] + a[9] * a[9] + a[10] * a[10])))
- },
- makeTranslation: function(a, b, c) {
- this.set(1, 0, 0, a, 0, 1, 0, b, 0, 0, 1, c, 0, 0, 0, 1);
- return this
- },
- makeRotationX: function(a) {
- var b = Math.cos(a),
- a = Math.sin(a);
- this.set(1,
- 0, 0, 0, 0, b, - a, 0, 0, a, b, 0, 0, 0, 0, 1);
- return this
- },
- makeRotationY: function(a) {
- var b = Math.cos(a),
- a = Math.sin(a);
- this.set(b, 0, a, 0, 0, 1, 0, 0, - a, 0, b, 0, 0, 0, 0, 1);
- return this
- },
- makeRotationZ: function(a) {
- var b = Math.cos(a),
- a = Math.sin(a);
- this.set(b, - a, 0, 0, a, b, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
- return this
- },
- makeRotationAxis: function(a, b) {
- var c = Math.cos(b),
- d = Math.sin(b),
- e = 1 - c,
- f = a.x,
- h = a.y,
- g = a.z,
- i = e * f,
- k = e * h;
- this.set(i * f + c, i * h - d * g, i * g + d * h, 0, i * h + d * g, k * h + c, k * g - d * f, 0, i * g - d * h, k * g + d * f, e * g * g + c, 0, 0, 0, 0, 1);
- return this
- },
- makeScale: function(a, b, c) {
- this.set(a,
- 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, 0, 1);
- return this
- },
- compose: function(a, b, c) {
- this.makeRotationFromQuaternion(b);
- this.scale(c);
- this.setPosition(a);
- return this
- },
- decompose: function() {
- var a = new THREE.Vector3,
- b = new THREE.Matrix4;
- return function(c, d, e) {
- var f = this.elements,
- h = a.set(f[0], f[1], f[2]).length(),
- g = a.set(f[4], f[5], f[6]).length(),
- i = a.set(f[8], f[9], f[10]).length();
- c.x = f[12];
- c.y = f[13];
- c.z = f[14];
- b.elements.set(this.elements);
- var c = 1 / h,
- f = 1 / g,
- k = 1 / i;
- b.elements[0] *= c;
- b.elements[1] *= c;
- b.elements[2] *= c;
- b.elements[4] *= f;
- b.elements[5] *= f;
- b.elements[6] *= f;
- b.elements[8] *= k;
- b.elements[9] *= k;
- b.elements[10] *= k;
- d.setFromRotationMatrix(b);
- e.x = h;
- e.y = g;
- e.z = i;
- return this
- }
- }(),
- makeFrustum: function(a, b, c, d, e, f) {
- var h = this.elements;
- h[0] = 2 * e / (b - a);
- h[4] = 0;
- h[8] = (b + a) / (b - a);
- h[12] = 0;
- h[1] = 0;
- h[5] = 2 * e / (d - c);
- h[9] = (d + c) / (d - c);
- h[13] = 0;
- h[2] = 0;
- h[6] = 0;
- h[10] = -(f + e) / (f - e);
- h[14] = -2 * f * e / (f - e);
- h[3] = 0;
- h[7] = 0;
- h[11] = -1;
- h[15] = 0;
- return this
- },
- makePerspective: function(a, b, c, d) {
- var a = c * Math.tan(THREE.Math.degToRad(0.5 * a)),
- e = -a;
- return this.makeFrustum(e * b, a * b, e, a, c, d)
- },
- makeOrthographic: function(a, b, c, d, e, f) {
- var h = this.elements,
- g = b - a,
- i = c - d,
- k = f - e;
- h[0] = 2 / g;
- h[4] = 0;
- h[8] = 0;
- h[12] = -((b + a) / g);
- h[1] = 0;
- h[5] = 2 / i;
- h[9] = 0;
- h[13] = -((c + d) / i);
- h[2] = 0;
- h[6] = 0;
- h[10] = -2 / k;
- h[14] = -((f + e) / k);
- h[3] = 0;
- h[7] = 0;
- h[11] = 0;
- h[15] = 1;
- return this
- },
- fromArray: function(a) {
- this.elements.set(a);
- return this
- },
- toArray: function() {
- var a = this.elements;
- return [a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]]
- },
- clone: function() {
- var a = this.elements;
- return new THREE.Matrix4(a[0],
- a[4], a[8], a[12], a[1], a[5], a[9], a[13], a[2], a[6], a[10], a[14], a[3], a[7], a[11], a[15])
- }
-};
-THREE.Ray = function(a, b) {
- this.origin = void 0 !== a ? a : new THREE.Vector3;
- this.direction = void 0 !== b ? b : new THREE.Vector3
-};
-THREE.Ray.prototype = {
- constructor: THREE.Ray,
- set: function(a, b) {
- this.origin.copy(a);
- this.direction.copy(b);
- return this
- },
- copy: function(a) {
- this.origin.copy(a.origin);
- this.direction.copy(a.direction);
- return this
- },
- at: function(a, b) {
- return (b || new THREE.Vector3).copy(this.direction).multiplyScalar(a).add(this.origin)
- },
- recast: function() {
- var a = new THREE.Vector3;
- return function(b) {
- this.origin.copy(this.at(b, a));
- return this
- }
- }(),
- closestPointToPoint: function(a, b) {
- var c = b || new THREE.Vector3;
- c.subVectors(a, this.origin);
- var d = c.dot(this.direction);
- return 0 > d ? c.copy(this.origin) : c.copy(this.direction).multiplyScalar(d).add(this.origin)
- },
- distanceToPoint: function() {
- var a = new THREE.Vector3;
- return function(b) {
- var c = a.subVectors(b, this.origin).dot(this.direction);
- if (0 > c) return this.origin.distanceTo(b);
- a.copy(this.direction).multiplyScalar(c).add(this.origin);
- return a.distanceTo(b)
- }
- }(),
- distanceSqToSegment: function(a, b, c, d) {
- var e = a.clone().add(b).multiplyScalar(0.5),
- f = b.clone().sub(a).normalize(),
- h = 0.5 * a.distanceTo(b),
- g = this.origin.clone().sub(e),
- a = -this.direction.dot(f),
- b = g.dot(this.direction),
- i = -g.dot(f),
- k = g.lengthSq(),
- m = Math.abs(1 - a * a),
- l, p;
- 0 <= m ? (g = a * i - b, l = a * b - i, p = h * m, 0 <= g ? l >= -p ? l <= p ? (h = 1 / m, g *= h, l *= h, a = g * (g + a * l + 2 * b) + l * (a * g + l + 2 * i) + k) : (l = h, g = Math.max(0, - (a * l + b)), a = -g * g + l * (l + 2 * i) + k) : (l = -h, g = Math.max(0, - (a * l + b)), a = -g * g + l * (l + 2 * i) + k) : l <= -p ? (g = Math.max(0, - (-a * h + b)), l = 0 < g ? -h : Math.min(Math.max(-h, - i), h), a = -g * g + l * (l + 2 * i) + k) : l <= p ? (g = 0, l = Math.min(Math.max(-h, - i), h), a = l * (l + 2 * i) + k) : (g = Math.max(0, - (a * h + b)), l = 0 < g ? h : Math.min(Math.max(-h, - i), h), a = -g * g + l * (l + 2 * i) + k)) : (l = 0 < a ? -h : h, g = Math.max(0, - (a * l + b)), a = -g * g + l * (l + 2 * i) + k);
- c && c.copy(this.direction.clone().multiplyScalar(g).add(this.origin));
- d && d.copy(f.clone().multiplyScalar(l).add(e));
- return a
- },
- isIntersectionSphere: function(a) {
- return this.distanceToPoint(a.center) <= a.radius
- },
- isIntersectionPlane: function(a) {
- var b = a.distanceToPoint(this.origin);
- return 0 === b || 0 > a.normal.dot(this.direction) * b ? !0 : !1
- },
- distanceToPlane: function(a) {
- var b = a.normal.dot(this.direction);
- if (0 == b) return 0 == a.distanceToPoint(this.origin) ? 0 : null;
- a = -(this.origin.dot(a.normal) + a.constant) / b;
- return 0 <= a ? a : null
- },
- intersectPlane: function(a, b) {
- var c = this.distanceToPlane(a);
- return null === c ? null : this.at(c, b)
- },
- isIntersectionBox: function() {
- var a = new THREE.Vector3;
- return function(b) {
- return null !== this.intersectBox(b, a)
- }
- }(),
- intersectBox: function(a, b) {
- var c, d, e, f, h;
- d = 1 / this.direction.x;
- f = 1 / this.direction.y;
- h = 1 / this.direction.z;
- var g = this.origin;
- 0 <= d ? (c = (a.min.x - g.x) * d, d *= a.max.x - g.x) : (c = (a.max.x - g.x) * d, d *= a.min.x - g.x);
- 0 <= f ? (e = (a.min.y - g.y) * f, f *= a.max.y - g.y) : (e = (a.max.y - g.y) * f, f *= a.min.y - g.y);
- if (c > f || e > d) return null;
- if (e > c || c !== c) c = e;
- if (f < d || d !== d) d = f;
- 0 <= h ? (e = (a.min.z - g.z) * h, h *= a.max.z - g.z) : (e = (a.max.z - g.z) * h, h *= a.min.z - g.z);
- if (c > h || e > d) return null;
- if (e > c || c !== c) c = e;
- if (h < d || d !== d) d = h;
- return 0 > d ? null : this.at(0 <= c ? c : d, b)
- },
- intersectTriangle: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3,
- c = new THREE.Vector3,
- d = new THREE.Vector3;
- return function(e, f, h, g, i) {
- b.subVectors(f, e);
- c.subVectors(h, e);
- d.crossVectors(b, c);
- f = this.direction.dot(d);
- if (0 < f) {
- if (g) return null;
- g = 1
- } else if (0 > f) g = -1, f = -f;
- else return null;
- a.subVectors(this.origin, e);
- e = g * this.direction.dot(c.crossVectors(a, c));
- if (0 > e) return null;
- h = g * this.direction.dot(b.cross(a));
- if (0 > h || e + h > f) return null;
- e = -g * a.dot(d);
- return 0 > e ? null : this.at(e / f, i)
- }
- }(),
- applyMatrix4: function(a) {
- this.direction.add(this.origin).applyMatrix4(a);
- this.origin.applyMatrix4(a);
- this.direction.sub(this.origin);
- this.direction.normalize();
- return this
- },
- equals: function(a) {
- return a.origin.equals(this.origin) && a.direction.equals(this.direction)
- },
- clone: function() {
- return (new THREE.Ray).copy(this)
- }
-};
-THREE.Sphere = function(a, b) {
- this.center = void 0 !== a ? a : new THREE.Vector3;
- this.radius = void 0 !== b ? b : 0
-};
-THREE.Sphere.prototype = {
- constructor: THREE.Sphere,
- set: function(a, b) {
- this.center.copy(a);
- this.radius = b;
- return this
- },
- setFromPoints: function() {
- var a = new THREE.Box3;
- return function(b, c) {
- var d = this.center;
- void 0 !== c ? d.copy(c) : a.setFromPoints(b).center(d);
- for (var e = 0, f = 0, h = b.length; f < h; f++) e = Math.max(e, d.distanceToSquared(b[f]));
- this.radius = Math.sqrt(e);
- return this
- }
- }(),
- copy: function(a) {
- this.center.copy(a.center);
- this.radius = a.radius;
- return this
- },
- empty: function() {
- return 0 >= this.radius
- },
- containsPoint: function(a) {
- return a.distanceToSquared(this.center) <= this.radius * this.radius
- },
- distanceToPoint: function(a) {
- return a.distanceTo(this.center) - this.radius
- },
- intersectsSphere: function(a) {
- var b = this.radius + a.radius;
- return a.center.distanceToSquared(this.center) <= b * b
- },
- clampPoint: function(a, b) {
- var c = this.center.distanceToSquared(a),
- d = b || new THREE.Vector3;
- d.copy(a);
- c > this.radius * this.radius && (d.sub(this.center).normalize(), d.multiplyScalar(this.radius).add(this.center));
- return d
- },
- getBoundingBox: function(a) {
- a = a || new THREE.Box3;
- a.set(this.center, this.center);
- a.expandByScalar(this.radius);
- return a
- },
- applyMatrix4: function(a) {
- this.center.applyMatrix4(a);
- this.radius *= a.getMaxScaleOnAxis();
- return this
- },
- translate: function(a) {
- this.center.add(a);
- return this
- },
- equals: function(a) {
- return a.center.equals(this.center) && a.radius === this.radius
- },
- clone: function() {
- return (new THREE.Sphere).copy(this)
- }
-};
-THREE.Frustum = function(a, b, c, d, e, f) {
- this.planes = [void 0 !== a ? a : new THREE.Plane, void 0 !== b ? b : new THREE.Plane, void 0 !== c ? c : new THREE.Plane, void 0 !== d ? d : new THREE.Plane, void 0 !== e ? e : new THREE.Plane, void 0 !== f ? f : new THREE.Plane]
-};
-THREE.Frustum.prototype = {
- constructor: THREE.Frustum,
- set: function(a, b, c, d, e, f) {
- var h = this.planes;
- h[0].copy(a);
- h[1].copy(b);
- h[2].copy(c);
- h[3].copy(d);
- h[4].copy(e);
- h[5].copy(f);
- return this
- },
- copy: function(a) {
- for (var b = this.planes, c = 0; 6 > c; c++) b[c].copy(a.planes[c]);
- return this
- },
- setFromMatrix: function(a) {
- var b = this.planes,
- c = a.elements,
- a = c[0],
- d = c[1],
- e = c[2],
- f = c[3],
- h = c[4],
- g = c[5],
- i = c[6],
- k = c[7],
- m = c[8],
- l = c[9],
- p = c[10],
- t = c[11],
- s = c[12],
- q = c[13],
- n = c[14],
- c = c[15];
- b[0].setComponents(f - a, k - h, t - m, c - s).normalize();
- b[1].setComponents(f + a, k + h, t + m, c + s).normalize();
- b[2].setComponents(f + d, k + g, t + l, c + q).normalize();
- b[3].setComponents(f - d, k - g, t - l, c - q).normalize();
- b[4].setComponents(f - e, k - i, t - p, c - n).normalize();
- b[5].setComponents(f + e, k + i, t + p, c + n).normalize();
- return this
- },
- intersectsObject: function() {
- var a = new THREE.Sphere;
- return function(b) {
- var c = b.geometry;
- null === c.boundingSphere && c.computeBoundingSphere();
- a.copy(c.boundingSphere);
- a.applyMatrix4(b.matrixWorld);
- return this.intersectsSphere(a)
- }
- }(),
- intersectsSphere: function(a) {
- for (var b = this.planes,
- c = a.center, a = -a.radius, d = 0; 6 > d; d++) if (b[d].distanceToPoint(c) < a) return !1;
- return !0
- },
- intersectsBox: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function(c) {
- for (var d = this.planes, e = 0; 6 > e; e++) {
- var f = d[e];
- a.x = 0 < f.normal.x ? c.min.x : c.max.x;
- b.x = 0 < f.normal.x ? c.max.x : c.min.x;
- a.y = 0 < f.normal.y ? c.min.y : c.max.y;
- b.y = 0 < f.normal.y ? c.max.y : c.min.y;
- a.z = 0 < f.normal.z ? c.min.z : c.max.z;
- b.z = 0 < f.normal.z ? c.max.z : c.min.z;
- var h = f.distanceToPoint(a),
- f = f.distanceToPoint(b);
- if (0 > h && 0 > f) return !1
- }
- return !0
- }
- }(),
- containsPoint: function(a) {
- for (var b = this.planes, c = 0; 6 > c; c++) if (0 > b[c].distanceToPoint(a)) return !1;
- return !0
- },
- clone: function() {
- return (new THREE.Frustum).copy(this)
- }
-};
-THREE.Plane = function(a, b) {
- this.normal = void 0 !== a ? a : new THREE.Vector3(1, 0, 0);
- this.constant = void 0 !== b ? b : 0
-};
-THREE.Plane.prototype = {
- constructor: THREE.Plane,
- set: function(a, b) {
- this.normal.copy(a);
- this.constant = b;
- return this
- },
- setComponents: function(a, b, c, d) {
- this.normal.set(a, b, c);
- this.constant = d;
- return this
- },
- setFromNormalAndCoplanarPoint: function(a, b) {
- this.normal.copy(a);
- this.constant = -b.dot(this.normal);
- return this
- },
- setFromCoplanarPoints: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function(c, d, e) {
- d = a.subVectors(e, d).cross(b.subVectors(c, d)).normalize();
- this.setFromNormalAndCoplanarPoint(d,
- c);
- return this
- }
- }(),
- copy: function(a) {
- this.normal.copy(a.normal);
- this.constant = a.constant;
- return this
- },
- normalize: function() {
- var a = 1 / this.normal.length();
- this.normal.multiplyScalar(a);
- this.constant *= a;
- return this
- },
- negate: function() {
- this.constant *= -1;
- this.normal.negate();
- return this
- },
- distanceToPoint: function(a) {
- return this.normal.dot(a) + this.constant
- },
- distanceToSphere: function(a) {
- return this.distanceToPoint(a.center) - a.radius
- },
- projectPoint: function(a, b) {
- return this.orthoPoint(a, b).sub(a).negate()
- },
- orthoPoint: function(a,
- b) {
- var c = this.distanceToPoint(a);
- return (b || new THREE.Vector3).copy(this.normal).multiplyScalar(c)
- },
- isIntersectionLine: function(a) {
- var b = this.distanceToPoint(a.start),
- a = this.distanceToPoint(a.end);
- return 0 > b && 0 < a || 0 > a && 0 < b
- },
- intersectLine: function() {
- var a = new THREE.Vector3;
- return function(b, c) {
- var d = c || new THREE.Vector3,
- e = b.delta(a),
- f = this.normal.dot(e);
- if (0 == f) {
- if (0 == this.distanceToPoint(b.start)) return d.copy(b.start)
- } else return f = -(b.start.dot(this.normal) + this.constant) / f, 0 > f || 1 < f ? void 0 : d.copy(e).multiplyScalar(f).add(b.start)
- }
- }(),
- coplanarPoint: function(a) {
- return (a || new THREE.Vector3).copy(this.normal).multiplyScalar(-this.constant)
- },
- applyMatrix4: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3,
- c = new THREE.Matrix3;
- return function(d, e) {
- var f = e || c.getNormalMatrix(d),
- f = a.copy(this.normal).applyMatrix3(f),
- h = this.coplanarPoint(b);
- h.applyMatrix4(d);
- this.setFromNormalAndCoplanarPoint(f, h);
- return this
- }
- }(),
- translate: function(a) {
- this.constant -= a.dot(this.normal);
- return this
- },
- equals: function(a) {
- return a.normal.equals(this.normal) && a.constant == this.constant
- },
- clone: function() {
- return (new THREE.Plane).copy(this)
- }
-};
-THREE.Math = {
- PI2: 2 * Math.PI,
- generateUUID: function() {
- var a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),
- b = Array(36),
- c = 0,
- d;
- return function() {
- for (var e = 0; 36 > e; e++) 8 == e || 13 == e || 18 == e || 23 == e ? b[e] = "-" : 14 == e ? b[e] = "4" : (2 >= c && (c = 33554432 + 16777216 * Math.random() | 0), d = c & 15, c >>= 4, b[e] = a[19 == e ? d & 3 | 8 : d]);
- return b.join("")
- }
- }(),
- clamp: function(a, b, c) {
- return a < b ? b : a > c ? c : a
- },
- clampBottom: function(a, b) {
- return a < b ? b : a
- },
- mapLinear: function(a, b, c, d, e) {
- return d + (a - b) * (e - d) / (c - b)
- },
- smoothstep: function(a,
- b, c) {
- if (a <= b) return 0;
- if (a >= c) return 1;
- a = (a - b) / (c - b);
- return a * a * (3 - 2 * a)
- },
- smootherstep: function(a, b, c) {
- if (a <= b) return 0;
- if (a >= c) return 1;
- a = (a - b) / (c - b);
- return a * a * a * (a * (6 * a - 15) + 10)
- },
- random16: function() {
- return (65280 * Math.random() + 255 * Math.random()) / 65535
- },
- randInt: function(a, b) {
- return a + Math.floor(Math.random() * (b - a + 1))
- },
- randFloat: function(a, b) {
- return a + Math.random() * (b - a)
- },
- randFloatSpread: function(a) {
- return a * (0.5 - Math.random())
- },
- sign: function(a) {
- return 0 > a ? -1 : 0 < a ? 1 : 0
- },
- degToRad: function() {
- var a = Math.PI / 180;
- return function(b) {
- return b * a
- }
- }(),
- radToDeg: function() {
- var a = 180 / Math.PI;
- return function(b) {
- return b * a
- }
- }()
-};
-THREE.Spline = function(a) {
- function b(a, b, c, d, e, f, h) {
- a = 0.5 * (c - a);
- d = 0.5 * (d - b);
- return (2 * (b - c) + a + d) * h + (-3 * (b - c) - 2 * a - d) * f + a * e + b
- }
- this.points = a;
- var c = [],
- d = {
- x: 0,
- y: 0,
- z: 0
- }, e, f, h, g, i, k, m, l, p;
- this.initFromArray = function(a) {
- this.points = [];
- for (var b = 0; b < a.length; b++) this.points[b] = {
- x: a[b][0],
- y: a[b][1],
- z: a[b][2]
- }
- };
- this.getPoint = function(a) {
- e = (this.points.length - 1) * a;
- f = Math.floor(e);
- h = e - f;
- c[0] = 0 === f ? f : f - 1;
- c[1] = f;
- c[2] = f > this.points.length - 2 ? this.points.length - 1 : f + 1;
- c[3] = f > this.points.length - 3 ? this.points.length - 1 : f + 2;
- k = this.points[c[0]];
- m = this.points[c[1]];
- l = this.points[c[2]];
- p = this.points[c[3]];
- g = h * h;
- i = h * g;
- d.x = b(k.x, m.x, l.x, p.x, h, g, i);
- d.y = b(k.y, m.y, l.y, p.y, h, g, i);
- d.z = b(k.z, m.z, l.z, p.z, h, g, i);
- return d
- };
- this.getControlPointsArray = function() {
- var a, b, c = this.points.length,
- d = [];
- for (a = 0; a < c; a++) b = this.points[a], d[a] = [b.x, b.y, b.z];
- return d
- };
- this.getLength = function(a) {
- var b, c, d, e = b = b = 0,
- f = new THREE.Vector3,
- h = new THREE.Vector3,
- g = [],
- i = 0;
- g[0] = 0;
- a || (a = 100);
- c = this.points.length * a;
- f.copy(this.points[0]);
- for (a = 1; a < c; a++) b = a / c, d = this.getPoint(b), h.copy(d), i += h.distanceTo(f), f.copy(d), b *= this.points.length - 1, b = Math.floor(b), b != e && (g[b] = i, e = b);
- g[g.length] = i;
- return {
- chunks: g,
- total: i
- }
- };
- this.reparametrizeByArcLength = function(a) {
- var b, c, d, e, f, h, g = [],
- i = new THREE.Vector3,
- k = this.getLength();
- g.push(i.copy(this.points[0]).clone());
- for (b = 1; b < this.points.length; b++) {
- c = k.chunks[b] - k.chunks[b - 1];
- h = Math.ceil(a * c / k.total);
- e = (b - 1) / (this.points.length - 1);
- f = b / (this.points.length - 1);
- for (c = 1; c < h - 1; c++) d = e + c * (1 / h) * (f - e), d = this.getPoint(d),
- g.push(i.copy(d).clone());
- g.push(i.copy(this.points[b]).clone())
- }
- this.points = g
- }
-};
-THREE.Triangle = function(a, b, c) {
- this.a = void 0 !== a ? a : new THREE.Vector3;
- this.b = void 0 !== b ? b : new THREE.Vector3;
- this.c = void 0 !== c ? c : new THREE.Vector3
-};
-THREE.Triangle.normal = function() {
- var a = new THREE.Vector3;
- return function(b, c, d, e) {
- e = e || new THREE.Vector3;
- e.subVectors(d, c);
- a.subVectors(b, c);
- e.cross(a);
- b = e.lengthSq();
- return 0 < b ? e.multiplyScalar(1 / Math.sqrt(b)) : e.set(0, 0, 0)
- }
-}();
-THREE.Triangle.barycoordFromPoint = function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3,
- c = new THREE.Vector3;
- return function(d, e, f, h, g) {
- a.subVectors(h, e);
- b.subVectors(f, e);
- c.subVectors(d, e);
- var d = a.dot(a),
- e = a.dot(b),
- f = a.dot(c),
- i = b.dot(b),
- h = b.dot(c),
- k = d * i - e * e,
- g = g || new THREE.Vector3;
- if (0 == k) return g.set(-2, - 1, - 1);
- k = 1 / k;
- i = (i * f - e * h) * k;
- d = (d * h - e * f) * k;
- return g.set(1 - i - d, d, i)
- }
-}();
-THREE.Triangle.containsPoint = function() {
- var a = new THREE.Vector3;
- return function(b, c, d, e) {
- b = THREE.Triangle.barycoordFromPoint(b, c, d, e, a);
- return 0 <= b.x && 0 <= b.y && 1 >= b.x + b.y
- }
-}();
-THREE.Triangle.prototype = {
- constructor: THREE.Triangle,
- set: function(a, b, c) {
- this.a.copy(a);
- this.b.copy(b);
- this.c.copy(c);
- return this
- },
- setFromPointsAndIndices: function(a, b, c, d) {
- this.a.copy(a[b]);
- this.b.copy(a[c]);
- this.c.copy(a[d]);
- return this
- },
- copy: function(a) {
- this.a.copy(a.a);
- this.b.copy(a.b);
- this.c.copy(a.c);
- return this
- },
- area: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function() {
- a.subVectors(this.c, this.b);
- b.subVectors(this.a, this.b);
- return 0.5 * a.cross(b).length()
- }
- }(),
- midpoint: function(a) {
- return (a || new THREE.Vector3).addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3)
- },
- normal: function(a) {
- return THREE.Triangle.normal(this.a, this.b, this.c, a)
- },
- plane: function(a) {
- return (a || new THREE.Plane).setFromCoplanarPoints(this.a, this.b, this.c)
- },
- barycoordFromPoint: function(a, b) {
- return THREE.Triangle.barycoordFromPoint(a, this.a, this.b, this.c, b)
- },
- containsPoint: function(a) {
- return THREE.Triangle.containsPoint(a, this.a, this.b, this.c)
- },
- equals: function(a) {
- return a.a.equals(this.a) && a.b.equals(this.b) && a.c.equals(this.c)
- },
- clone: function() {
- return (new THREE.Triangle).copy(this)
- }
-};
-THREE.Vertex = function(a) {
- console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");
- return a
-};
-THREE.UV = function(a, b) {
- console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");
- return new THREE.Vector2(a, b)
-};
-THREE.Clock = function(a) {
- this.autoStart = void 0 !== a ? a : !0;
- this.elapsedTime = this.oldTime = this.startTime = 0;
- this.running = !1
-};
-THREE.Clock.prototype = {
- constructor: THREE.Clock,
- start: function() {
- this.oldTime = this.startTime = void 0 !== self.performance && void 0 !== self.performance.now ? self.performance.now() : Date.now();
- this.running = !0
- },
- stop: function() {
- this.getElapsedTime();
- this.running = !1
- },
- getElapsedTime: function() {
- this.getDelta();
- return this.elapsedTime
- },
- getDelta: function() {
- var a = 0;
- this.autoStart && !this.running && this.start();
- if (this.running) {
- var b = void 0 !== self.performance && void 0 !== self.performance.now ? self.performance.now() : Date.now(),
- a = 0.001 * (b - this.oldTime);
- this.oldTime = b;
- this.elapsedTime += a
- }
- return a
- }
-};
-THREE.EventDispatcher = function() {};
-THREE.EventDispatcher.prototype = {
- constructor: THREE.EventDispatcher,
- apply: function(a) {
- a.addEventListener = THREE.EventDispatcher.prototype.addEventListener;
- a.hasEventListener = THREE.EventDispatcher.prototype.hasEventListener;
- a.removeEventListener = THREE.EventDispatcher.prototype.removeEventListener;
- a.dispatchEvent = THREE.EventDispatcher.prototype.dispatchEvent
- },
- addEventListener: function(a, b) {
- void 0 === this._listeners && (this._listeners = {});
- var c = this._listeners;
- void 0 === c[a] && (c[a] = []); - 1 === c[a].indexOf(b) && c[a].push(b)
- },
- hasEventListener: function(a, b) {
- if (void 0 === this._listeners) return !1;
- var c = this._listeners;
- return void 0 !== c[a] && -1 !== c[a].indexOf(b) ? !0 : !1
- },
- removeEventListener: function(a, b) {
- if (void 0 !== this._listeners) {
- var c = this._listeners[a];
- if (void 0 !== c) {
- var d = c.indexOf(b); - 1 !== d && c.splice(d, 1)
- }
- }
- },
- dispatchEvent: function() {
- var a = [];
- return function(b) {
- if (void 0 !== this._listeners) {
- var c = this._listeners[b.type];
- if (void 0 !== c) {
- b.target = this;
- for (var d = c.length, e = 0; e < d; e++) a[e] = c[e];
- for (e = 0; e < d; e++) a[e].call(this,
- b)
- }
- }
- }
- }()
-};
-(function(a) {
- a.Raycaster = function(b, c, d, e) {
- this.ray = new a.Ray(b, c);
- this.near = d || 0;
- this.far = e || Infinity
- };
- var b = new a.Sphere,
- c = new a.Ray;
- new a.Plane;
- new a.Vector3;
- var d = new a.Vector3,
- e = new a.Matrix4,
- f = function(a, b) {
- return a.distance - b.distance
- }, h = new a.Vector3,
- g = new a.Vector3,
- i = new a.Vector3,
- k = function(f, m, t) {
- if (f instanceof a.Sprite) {
- d.setFromMatrixPosition(f.matrixWorld);
- var s = m.ray.distanceToPoint(d);
- if (s > f.scale.x) return t;
- t.push({
- distance: s,
- point: f.position,
- face: null,
- object: f
- })
- } else if (f instanceof
- a.LOD) d.setFromMatrixPosition(f.matrixWorld), s = m.ray.origin.distanceTo(d), k(f.getObjectForDistance(s), m, t);
- else if (f instanceof a.Mesh) {
- var q = f.geometry;
- null === q.boundingSphere && q.computeBoundingSphere();
- b.copy(q.boundingSphere);
- b.applyMatrix4(f.matrixWorld);
- if (!1 === m.ray.isIntersectionSphere(b)) return t;
- e.getInverse(f.matrixWorld);
- c.copy(m.ray).applyMatrix4(e);
- if (null !== q.boundingBox && !1 === c.isIntersectionBox(q.boundingBox)) return t;
- if (q instanceof a.BufferGeometry) {
- var n = f.material;
- if (void 0 === n || !1 === q.dynamic) return t;
- var u, r, v = m.precision;
- if (void 0 !== q.attributes.index) for (var z = q.offsets, G = q.attributes.index.array, w = q.attributes.position.array, y = q.offsets.length, E = q.attributes.index.array.length / 3, E = 0; E < y; ++E) for (var s = z[E].start, A = z[E].index, q = s, K = s + z[E].count; q < K; q += 3) s = A + G[q], u = A + G[q + 1], r = A + G[q + 2], h.set(w[3 * s], w[3 * s + 1], w[3 * s + 2]), g.set(w[3 * u], w[3 * u + 1], w[3 * u + 2]), i.set(w[3 * r], w[3 * r + 1], w[3 * r + 2]), u = n.side === a.BackSide ? c.intersectTriangle(i, g, h, !0) : c.intersectTriangle(h, g, i, n.side !== a.DoubleSide),
- null !== u && (u.applyMatrix4(f.matrixWorld), s = m.ray.origin.distanceTo(u), s < v || (s < m.near || s > m.far) || t.push({
- distance: s,
- point: u,
- face: null,
- faceIndex: null,
- object: f
- }));
- else {
- w = q.attributes.position.array;
- E = q.attributes.position.array.length;
- for (q = 0; q < E; q += 3) s = q, u = q + 1, r = q + 2, h.set(w[3 * s], w[3 * s + 1], w[3 * s + 2]), g.set(w[3 * u], w[3 * u + 1], w[3 * u + 2]), i.set(w[3 * r], w[3 * r + 1], w[3 * r + 2]), u = n.side === a.BackSide ? c.intersectTriangle(i, g, h, !0) : c.intersectTriangle(h, g, i, n.side !== a.DoubleSide), null !== u && (u.applyMatrix4(f.matrixWorld),
- s = m.ray.origin.distanceTo(u), s < v || (s < m.near || s > m.far) || t.push({
- distance: s,
- point: u,
- face: null,
- faceIndex: null,
- object: f
- }))
- }
- } else if (q instanceof a.Geometry) {
- G = f.material instanceof a.MeshFaceMaterial;
- w = !0 === G ? f.material.materials : null;
- v = m.precision;
- z = q.vertices;
- y = 0;
- for (E = q.faces.length; y < E; y++) A = q.faces[y], n = !0 === G ? w[A.materialIndex] : f.material, void 0 !== n && (s = z[A.a], u = z[A.b], r = z[A.c], u = n.side === a.BackSide ? c.intersectTriangle(r, u, s, !0) : c.intersectTriangle(s, u, r, n.side !== a.DoubleSide), null !== u && (u.applyMatrix4(f.matrixWorld),
- s = m.ray.origin.distanceTo(u), s < v || (s < m.near || s > m.far) || t.push({
- distance: s,
- point: u,
- face: A,
- faceIndex: y,
- object: f
- })))
- }
- } else if (f instanceof a.Line) {
- v = m.linePrecision;
- n = v * v;
- q = f.geometry;
- null === q.boundingSphere && q.computeBoundingSphere();
- b.copy(q.boundingSphere);
- b.applyMatrix4(f.matrixWorld);
- if (!1 === m.ray.isIntersectionSphere(b)) return t;
- e.getInverse(f.matrixWorld);
- c.copy(m.ray).applyMatrix4(e);
- if (q instanceof a.Geometry) {
- z = q.vertices;
- v = z.length;
- u = new a.Vector3;
- r = new a.Vector3;
- E = f.type === a.LineStrip ? 1 : 2;
- for (q = 0; q < v - 1; q += E) c.distanceSqToSegment(z[q], z[q + 1], r, u) > n || (s = c.origin.distanceTo(r), s < m.near || s > m.far || t.push({
- distance: s,
- point: u.clone().applyMatrix4(f.matrixWorld),
- face: null,
- faceIndex: null,
- object: f
- }))
- }
- }
- }, m = function(a, b, c) {
- for (var a = a.getDescendants(), d = 0, e = a.length; d < e; d++) k(a[d], b, c)
- };
- a.Raycaster.prototype.precision = 1E-4;
- a.Raycaster.prototype.linePrecision = 1;
- a.Raycaster.prototype.set = function(a, b) {
- this.ray.set(a, b)
- };
- a.Raycaster.prototype.intersectObject = function(a, b) {
- var c = [];
- !0 === b && m(a,
- this, c);
- k(a, this, c);
- c.sort(f);
- return c
- };
- a.Raycaster.prototype.intersectObjects = function(a, b) {
- for (var c = [], d = 0, e = a.length; d < e; d++) k(a[d], this, c), !0 === b && m(a[d], this, c);
- c.sort(f);
- return c
- }
-})(THREE);
-THREE.Object3D = function() {
- this.id = THREE.Object3DIdCount++;
- this.uuid = THREE.Math.generateUUID();
- this.name = "";
- this.parent = void 0;
- this.children = [];
- this.up = new THREE.Vector3(0, 1, 0);
- this.position = new THREE.Vector3;
- this._rotation = new THREE.Euler;
- this._quaternion = new THREE.Quaternion;
- this.scale = new THREE.Vector3(1, 1, 1);
- this._rotation._quaternion = this.quaternion;
- this._quaternion._euler = this.rotation;
- this.renderDepth = null;
- this.rotationAutoUpdate = !0;
- this.matrix = new THREE.Matrix4;
- this.matrixWorld = new THREE.Matrix4;
- this.visible = this.matrixWorldNeedsUpdate = this.matrixAutoUpdate = !0;
- this.receiveShadow = this.castShadow = !1;
- this.frustumCulled = !0;
- this.userData = {}
-};
-THREE.Object3D.prototype = {
- constructor: THREE.Object3D,
- get rotation() {
- return this._rotation
- },
- set rotation(a) {
- this._rotation = a;
- this._rotation._quaternion = this._quaternion;
- this._quaternion._euler = this._rotation;
- this._rotation._updateQuaternion()
- },
- get quaternion() {
- return this._quaternion
- },
- set quaternion(a) {
- this._quaternion = a;
- this._quaternion._euler = this._rotation;
- this._rotation._quaternion = this._quaternion;
- this._quaternion._updateEuler()
- },
- get eulerOrder() {
- console.warn("DEPRECATED: Object3D's .eulerOrder has been moved to Object3D's .rotation.order.");
- return this.rotation.order
- },
- set eulerOrder(a) {
- console.warn("DEPRECATED: Object3D's .eulerOrder has been moved to Object3D's .rotation.order.");
- this.rotation.order = a
- },
- get useQuaternion() {
- console.warn("DEPRECATED: Object3D's .useQuaternion has been removed. The library now uses quaternions by default.")
- },
- set useQuaternion(a) {
- console.warn("DEPRECATED: Object3D's .useQuaternion has been removed. The library now uses quaternions by default.")
- },
- applyMatrix: function() {
- var a = new THREE.Matrix4;
- return function(b) {
- this.matrix.multiplyMatrices(b,
- this.matrix);
- this.position.setFromMatrixPosition(this.matrix);
- this.scale.setFromMatrixScale(this.matrix);
- a.extractRotation(this.matrix);
- this.quaternion.setFromRotationMatrix(a)
- }
- }(),
- setRotationFromAxisAngle: function(a, b) {
- this.quaternion.setFromAxisAngle(a, b)
- },
- setRotationFromEuler: function(a) {
- this.quaternion.setFromEuler(a, !0)
- },
- setRotationFromMatrix: function(a) {
- this.quaternion.setFromRotationMatrix(a)
- },
- setRotationFromQuaternion: function(a) {
- this.quaternion.copy(a)
- },
- rotateOnAxis: function() {
- var a = new THREE.Quaternion;
- return function(b, c) {
- a.setFromAxisAngle(b, c);
- this.quaternion.multiply(a);
- return this
- }
- }(),
- rotateX: function() {
- var a = new THREE.Vector3(1, 0, 0);
- return function(b) {
- return this.rotateOnAxis(a, b)
- }
- }(),
- rotateY: function() {
- var a = new THREE.Vector3(0, 1, 0);
- return function(b) {
- return this.rotateOnAxis(a, b)
- }
- }(),
- rotateZ: function() {
- var a = new THREE.Vector3(0, 0, 1);
- return function(b) {
- return this.rotateOnAxis(a, b)
- }
- }(),
- translateOnAxis: function() {
- var a = new THREE.Vector3;
- return function(b, c) {
- a.copy(b);
- a.applyQuaternion(this.quaternion);
- this.position.add(a.multiplyScalar(c));
- return this
- }
- }(),
- translate: function(a, b) {
- console.warn("DEPRECATED: Object3D's .translate() has been removed. Use .translateOnAxis( axis, distance ) instead. Note args have been changed.");
- return this.translateOnAxis(b, a)
- },
- translateX: function() {
- var a = new THREE.Vector3(1, 0, 0);
- return function(b) {
- return this.translateOnAxis(a, b)
- }
- }(),
- translateY: function() {
- var a = new THREE.Vector3(0, 1, 0);
- return function(b) {
- return this.translateOnAxis(a, b)
- }
- }(),
- translateZ: function() {
- var a = new THREE.Vector3(0, 0, 1);
- return function(b) {
- return this.translateOnAxis(a, b)
- }
- }(),
- localToWorld: function(a) {
- return a.applyMatrix4(this.matrixWorld)
- },
- worldToLocal: function() {
- var a = new THREE.Matrix4;
- return function(b) {
- return b.applyMatrix4(a.getInverse(this.matrixWorld))
- }
- }(),
- lookAt: function() {
- var a = new THREE.Matrix4;
- return function(b) {
- a.lookAt(b, this.position, this.up);
- this.quaternion.setFromRotationMatrix(a)
- }
- }(),
- add: function(a) {
- if (a === this) console.warn("THREE.Object3D.add: An object can't be added as a child of itself.");
- else if (a instanceof THREE.Object3D) {
- void 0 !== a.parent && a.parent.remove(a);
- a.parent = this;
- a.dispatchEvent({
- type: "added"
- });
- this.children.push(a);
- for (var b = this; void 0 !== b.parent;) b = b.parent;
- void 0 !== b && b instanceof THREE.Scene && b.__addObject(a)
- }
- },
- remove: function(a) {
- var b = this.children.indexOf(a);
- if (-1 !== b) {
- a.parent = void 0;
- a.dispatchEvent({
- type: "removed"
- });
- this.children.splice(b, 1);
- for (b = this; void 0 !== b.parent;) b = b.parent;
- void 0 !== b && b instanceof THREE.Scene && b.__removeObject(a)
- }
- },
- traverse: function(a) {
- a(this);
- for (var b = 0, c = this.children.length; b < c; b++) this.children[b].traverse(a)
- },
- getObjectById: function(a, b) {
- for (var c = 0, d = this.children.length; c < d; c++) {
- var e = this.children[c];
- if (e.id === a || !0 === b && (e = e.getObjectById(a, b), void 0 !== e)) return e
- }
- },
- getObjectByName: function(a, b) {
- for (var c = 0, d = this.children.length; c < d; c++) {
- var e = this.children[c];
- if (e.name === a || !0 === b && (e = e.getObjectByName(a, b), void 0 !== e)) return e
- }
- },
- getChildByName: function(a, b) {
- console.warn("DEPRECATED: Object3D's .getChildByName() has been renamed to .getObjectByName().");
- return this.getObjectByName(a, b)
- },
- getDescendants: function(a) {
- void 0 === a && (a = []);
- Array.prototype.push.apply(a, this.children);
- for (var b = 0, c = this.children.length; b < c; b++) this.children[b].getDescendants(a);
- return a
- },
- updateMatrix: function() {
- this.matrix.compose(this.position, this.quaternion, this.scale);
- this.matrixWorldNeedsUpdate = !0
- },
- updateMatrixWorld: function(a) {
- !0 === this.matrixAutoUpdate && this.updateMatrix();
- if (!0 === this.matrixWorldNeedsUpdate || !0 === a) void 0 === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), this.matrixWorldNeedsUpdate = !1, a = !0;
- for (var b = 0, c = this.children.length; b < c; b++) this.children[b].updateMatrixWorld(a)
- },
- clone: function(a, b) {
- void 0 === a && (a = new THREE.Object3D);
- void 0 === b && (b = !0);
- a.name = this.name;
- a.up.copy(this.up);
- a.position.copy(this.position);
- a.quaternion.copy(this.quaternion);
- a.scale.copy(this.scale);
- a.renderDepth = this.renderDepth;
- a.rotationAutoUpdate = this.rotationAutoUpdate;
- a.matrix.copy(this.matrix);
- a.matrixWorld.copy(this.matrixWorld);
- a.matrixAutoUpdate = this.matrixAutoUpdate;
- a.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate;
- a.visible = this.visible;
- a.castShadow = this.castShadow;
- a.receiveShadow = this.receiveShadow;
- a.frustumCulled = this.frustumCulled;
- a.userData = JSON.parse(JSON.stringify(this.userData));
- if (!0 === b) for (var c = 0; c < this.children.length; c++) a.add(this.children[c].clone());
- return a
- }
-};
-THREE.EventDispatcher.prototype.apply(THREE.Object3D.prototype);
-THREE.Object3DIdCount = 0;
-THREE.Projector = function() {
- function a() {
- if (i === m) {
- var a = new THREE.RenderableVertex;
- k.push(a);
- m++;
- i++;
- return a
- }
- return k[i++]
- }
- function b(a, b) {
- return a.z !== b.z ? b.z - a.z : a.id !== b.id ? a.id - b.id : 0
- }
- function c(a, b) {
- var c = 0,
- d = 1,
- e = a.z + a.w,
- f = b.z + b.w,
- h = -a.z + a.w,
- g = -b.z + b.w;
- if (0 <= e && 0 <= f && 0 <= h && 0 <= g) return !0;
- if (0 > e && 0 > f || 0 > h && 0 > g) return !1;
- 0 > e ? c = Math.max(c, e / (e - f)) : 0 > f && (d = Math.min(d, e / (e - f)));
- 0 > h ? c = Math.max(c, h / (h - g)) : 0 > g && (d = Math.min(d, h / (h - g)));
- if (d < c) return !1;
- a.lerp(b, c);
- b.lerp(a, 1 - d);
- return !0
- }
- var d, e, f = [],
- h = 0,
- g, i, k = [],
- m = 0,
- l, p, t = [],
- s = 0,
- q, n, u = [],
- r = 0,
- v, z, G = [],
- w = 0,
- y = {
- objects: [],
- sprites: [],
- lights: [],
- elements: []
- }, E = new THREE.Vector3,
- A = new THREE.Vector4,
- K = new THREE.Box3(new THREE.Vector3(-1, - 1, - 1), new THREE.Vector3(1, 1, 1)),
- D = new THREE.Box3,
- F = Array(3),
- O = new THREE.Matrix4,
- x = new THREE.Matrix4,
- I, B = new THREE.Matrix4,
- M = new THREE.Matrix3,
- J = new THREE.Matrix3,
- ca = new THREE.Vector3,
- na = new THREE.Frustum,
- pa = new THREE.Vector4,
- C = new THREE.Vector4;
- this.projectVector = function(a, b) {
- b.matrixWorldInverse.getInverse(b.matrixWorld);
- x.multiplyMatrices(b.projectionMatrix, b.matrixWorldInverse);
- return a.applyProjection(x)
- };
- this.unprojectVector = function(a, b) {
- b.projectionMatrixInverse.getInverse(b.projectionMatrix);
- x.multiplyMatrices(b.matrixWorld, b.projectionMatrixInverse);
- return a.applyProjection(x)
- };
- this.pickingRay = function(a, b) {
- a.z = -1;
- var c = new THREE.Vector3(a.x, a.y, 1);
- this.unprojectVector(a, b);
- this.unprojectVector(c, b);
- c.sub(a).normalize();
- return new THREE.Raycaster(a, c)
- };
- var Q = function(a) {
- if (e === h) {
- var b = new THREE.RenderableObject;
- f.push(b);
- h++;
- e++;
- d = b
- } else d = f[e++];
- d.id = a.id;
- d.object = a;
- null !== a.renderDepth ? d.z = a.renderDepth : (E.setFromMatrixPosition(a.matrixWorld), E.applyProjection(x), d.z = E.z);
- return d
- }, R = function(a) {
- if (!1 !== a.visible) {
- a instanceof THREE.Light ? y.lights.push(a) : a instanceof THREE.Mesh || a instanceof THREE.Line ? (!1 === a.frustumCulled || !0 === na.intersectsObject(a)) && y.objects.push(Q(a)) : a instanceof THREE.Sprite && y.sprites.push(Q(a));
- for (var b = 0, c = a.children.length; b < c; b++) R(a.children[b])
- }
- };
- this.projectScene = function(d,
- f, h, m) {
- var E = !1,
- Q, $, ea, V, P, Y, U, ja, sa, ha, Ka, Ga;
- z = n = p = 0;
- y.elements.length = 0;
- !0 === d.autoUpdate && d.updateMatrixWorld();
- void 0 === f.parent && f.updateMatrixWorld();
- O.copy(f.matrixWorldInverse.getInverse(f.matrixWorld));
- x.multiplyMatrices(f.projectionMatrix, O);
- J.getNormalMatrix(O);
- na.setFromMatrix(x);
- e = 0;
- y.objects.length = 0;
- y.sprites.length = 0;
- y.lights.length = 0;
- R(d);
- !0 === h && y.objects.sort(b);
- d = 0;
- for (h = y.objects.length; d < h; d++) if (U = y.objects[d].object, I = U.matrixWorld, i = 0, U instanceof THREE.Mesh) {
- ja = U.geometry;
- ea = ja.vertices;
- sa = ja.faces;
- ja = ja.faceVertexUvs;
- M.getNormalMatrix(I);
- Ka = U.material instanceof THREE.MeshFaceMaterial;
- Ga = !0 === Ka ? U.material : null;
- Q = 0;
- for ($ = ea.length; Q < $; Q++) {
- g = a();
- g.positionWorld.copy(ea[Q]).applyMatrix4(I);
- g.positionScreen.copy(g.positionWorld).applyMatrix4(x);
- var ka = 1 / g.positionScreen.w;
- g.positionScreen.x *= ka;
- g.positionScreen.y *= ka;
- g.positionScreen.z *= ka;
- g.visible = !(-1 > g.positionScreen.x || 1 < g.positionScreen.x || -1 > g.positionScreen.y || 1 < g.positionScreen.y || -1 > g.positionScreen.z || 1 < g.positionScreen.z)
- }
- ea = 0;
- for (Q = sa.length; ea < Q; ea++) if ($ = sa[ea], ka = !0 === Ka ? Ga.materials[$.materialIndex] : U.material, void 0 !== ka && (Y = ka.side, V = k[$.a], P = k[$.b], ha = k[$.c], F[0] = V.positionScreen, F[1] = P.positionScreen, F[2] = ha.positionScreen, !0 === V.visible || !0 === P.visible || !0 === ha.visible || K.isIntersectionBox(D.setFromPoints(F)))) if (E = 0 > (ha.positionScreen.x - V.positionScreen.x) * (P.positionScreen.y - V.positionScreen.y) - (ha.positionScreen.y - V.positionScreen.y) * (P.positionScreen.x - V.positionScreen.x), Y === THREE.DoubleSide || E === (Y === THREE.FrontSide)) {
- if (p === s) {
- var Da = new THREE.RenderableFace3;
- t.push(Da);
- s++;
- p++;
- l = Da
- } else l = t[p++];
- l.id = U.id;
- l.v1.copy(V);
- l.v2.copy(P);
- l.v3.copy(ha);
- l.normalModel.copy($.normal);
- !1 === E && (Y === THREE.BackSide || Y === THREE.DoubleSide) && l.normalModel.negate();
- l.normalModel.applyMatrix3(M).normalize();
- l.normalModelView.copy(l.normalModel).applyMatrix3(J);
- l.centroidModel.copy($.centroid).applyMatrix4(I);
- ha = $.vertexNormals;
- V = 0;
- for (P = Math.min(ha.length, 3); V < P; V++) Da = l.vertexNormalsModel[V], Da.copy(ha[V]), !1 === E && (Y === THREE.BackSide || Y === THREE.DoubleSide) && Da.negate(), Da.applyMatrix3(M).normalize(), l.vertexNormalsModelView[V].copy(Da).applyMatrix3(J);
- l.vertexNormalsLength = ha.length;
- E = 0;
- for (V = Math.min(ja.length, 3); E < V; E++) if (ha = ja[E][ea], void 0 !== ha) {
- P = 0;
- for (Y = ha.length; P < Y; P++) l.uvs[E][P] = ha[P]
- }
- l.color = $.color;
- l.material = ka;
- ca.copy(l.centroidModel).applyProjection(x);
- l.z = ca.z;
- y.elements.push(l)
- }
- } else if (U instanceof THREE.Line) {
- B.multiplyMatrices(x, I);
- ea = U.geometry.vertices;
- V = a();
- V.positionScreen.copy(ea[0]).applyMatrix4(B);
- sa = U.type === THREE.LinePieces ? 2 : 1;
- Q = 1;
- for ($ = ea.length; Q < $; Q++) V = a(), V.positionScreen.copy(ea[Q]).applyMatrix4(B), 0 < (Q + 1) % sa || (P = k[i - 2], pa.copy(V.positionScreen), C.copy(P.positionScreen), !0 === c(pa, C) && (pa.multiplyScalar(1 / pa.w), C.multiplyScalar(1 / C.w), n === r ? (ja = new THREE.RenderableLine, u.push(ja), r++, n++, q = ja) : q = u[n++], q.id = U.id, q.v1.positionScreen.copy(pa), q.v2.positionScreen.copy(C), q.z = Math.max(pa.z, C.z), q.material = U.material, U.material.vertexColors === THREE.VertexColors && (q.vertexColors[0].copy(U.geometry.colors[Q]),
- q.vertexColors[1].copy(U.geometry.colors[Q - 1])), y.elements.push(q)))
- }
- d = 0;
- for (h = y.sprites.length; d < h; d++) U = y.sprites[d].object, I = U.matrixWorld, A.set(I.elements[12], I.elements[13], I.elements[14], 1), A.applyMatrix4(x), ka = 1 / A.w, A.z *= ka, - 1 <= A.z && 1 >= A.z && (z === w ? (sa = new THREE.RenderableSprite, G.push(sa), w++, z++, v = sa) : v = G[z++], v.id = U.id, v.x = A.x * ka, v.y = A.y * ka, v.z = A.z, v.object = U, v.rotation = U.rotation, v.scale.x = U.scale.x * Math.abs(v.x - (A.x + f.projectionMatrix.elements[0]) / (A.w + f.projectionMatrix.elements[12])),
- v.scale.y = U.scale.y * Math.abs(v.y - (A.y + f.projectionMatrix.elements[5]) / (A.w + f.projectionMatrix.elements[13])), v.material = U.material, y.elements.push(v));
- !0 === m && y.elements.sort(b);
- return y
- }
-};
-THREE.Face3 = function(a, b, c, d, e, f) {
- this.a = a;
- this.b = b;
- this.c = c;
- this.normal = d instanceof THREE.Vector3 ? d : new THREE.Vector3;
- this.vertexNormals = d instanceof Array ? d : [];
- this.color = e instanceof THREE.Color ? e : new THREE.Color;
- this.vertexColors = e instanceof Array ? e : [];
- this.vertexTangents = [];
- this.materialIndex = void 0 !== f ? f : 0;
- this.centroid = new THREE.Vector3
-};
-THREE.Face3.prototype = {
- constructor: THREE.Face3,
- clone: function() {
- var a = new THREE.Face3(this.a, this.b, this.c);
- a.normal.copy(this.normal);
- a.color.copy(this.color);
- a.centroid.copy(this.centroid);
- a.materialIndex = this.materialIndex;
- var b, c;
- b = 0;
- for (c = this.vertexNormals.length; b < c; b++) a.vertexNormals[b] = this.vertexNormals[b].clone();
- b = 0;
- for (c = this.vertexColors.length; b < c; b++) a.vertexColors[b] = this.vertexColors[b].clone();
- b = 0;
- for (c = this.vertexTangents.length; b < c; b++) a.vertexTangents[b] = this.vertexTangents[b].clone();
- return a
- }
-};
-THREE.Face4 = function(a, b, c, d, e, f, h) {
- console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");
- return new THREE.Face3(a, b, c, e, f, h)
-};
-THREE.Geometry = function() {
- this.id = THREE.GeometryIdCount++;
- this.uuid = THREE.Math.generateUUID();
- this.name = "";
- this.vertices = [];
- this.colors = [];
- this.faces = [];
- this.faceVertexUvs = [
- []
- ];
- this.morphTargets = [];
- this.morphColors = [];
- this.morphNormals = [];
- this.skinWeights = [];
- this.skinIndices = [];
- this.lineDistances = [];
- this.boundingSphere = this.boundingBox = null;
- this.hasTangents = !1;
- this.dynamic = !0;
- this.buffersNeedUpdate = this.lineDistancesNeedUpdate = this.colorsNeedUpdate = this.tangentsNeedUpdate = this.normalsNeedUpdate = this.uvsNeedUpdate = this.elementsNeedUpdate = this.verticesNeedUpdate = !1
-};
-THREE.Geometry.prototype = {
- constructor: THREE.Geometry,
- applyMatrix: function(a) {
- for (var b = (new THREE.Matrix3).getNormalMatrix(a), c = 0, d = this.vertices.length; c < d; c++) this.vertices[c].applyMatrix4(a);
- c = 0;
- for (d = this.faces.length; c < d; c++) {
- var e = this.faces[c];
- e.normal.applyMatrix3(b).normalize();
- for (var f = 0, h = e.vertexNormals.length; f < h; f++) e.vertexNormals[f].applyMatrix3(b).normalize();
- e.centroid.applyMatrix4(a)
- }
- this.boundingBox instanceof THREE.Box3 && this.computeBoundingBox();
- this.boundingSphere instanceof
- THREE.Sphere && this.computeBoundingSphere()
- },
- computeCentroids: function() {
- var a, b, c;
- a = 0;
- for (b = this.faces.length; a < b; a++) c = this.faces[a], c.centroid.set(0, 0, 0), c.centroid.add(this.vertices[c.a]), c.centroid.add(this.vertices[c.b]), c.centroid.add(this.vertices[c.c]), c.centroid.divideScalar(3)
- },
- computeFaceNormals: function() {
- for (var a = new THREE.Vector3, b = new THREE.Vector3, c = 0, d = this.faces.length; c < d; c++) {
- var e = this.faces[c],
- f = this.vertices[e.a],
- h = this.vertices[e.b];
- a.subVectors(this.vertices[e.c], h);
- b.subVectors(f,
- h);
- a.cross(b);
- a.normalize();
- e.normal.copy(a)
- }
- },
- computeVertexNormals: function(a) {
- var b, c, d, e;
- if (void 0 === this.__tmpVertices) {
- e = this.__tmpVertices = Array(this.vertices.length);
- b = 0;
- for (c = this.vertices.length; b < c; b++) e[b] = new THREE.Vector3;
- b = 0;
- for (c = this.faces.length; b < c; b++) d = this.faces[b], d.vertexNormals = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3]
- } else {
- e = this.__tmpVertices;
- b = 0;
- for (c = this.vertices.length; b < c; b++) e[b].set(0, 0, 0)
- }
- if (a) {
- var f, h, g = new THREE.Vector3,
- i = new THREE.Vector3;
- new THREE.Vector3;
- new THREE.Vector3;
- new THREE.Vector3;
- b = 0;
- for (c = this.faces.length; b < c; b++) d = this.faces[b], a = this.vertices[d.a], f = this.vertices[d.b], h = this.vertices[d.c], g.subVectors(h, f), i.subVectors(a, f), g.cross(i), e[d.a].add(g), e[d.b].add(g), e[d.c].add(g)
- } else {
- b = 0;
- for (c = this.faces.length; b < c; b++) d = this.faces[b], e[d.a].add(d.normal), e[d.b].add(d.normal), e[d.c].add(d.normal)
- }
- b = 0;
- for (c = this.vertices.length; b < c; b++) e[b].normalize();
- b = 0;
- for (c = this.faces.length; b < c; b++) d = this.faces[b], d.vertexNormals[0].copy(e[d.a]), d.vertexNormals[1].copy(e[d.b]),
- d.vertexNormals[2].copy(e[d.c])
- },
- computeMorphNormals: function() {
- var a, b, c, d, e;
- c = 0;
- for (d = this.faces.length; c < d; c++) {
- e = this.faces[c];
- e.__originalFaceNormal ? e.__originalFaceNormal.copy(e.normal) : e.__originalFaceNormal = e.normal.clone();
- e.__originalVertexNormals || (e.__originalVertexNormals = []);
- a = 0;
- for (b = e.vertexNormals.length; a < b; a++) e.__originalVertexNormals[a] ? e.__originalVertexNormals[a].copy(e.vertexNormals[a]) : e.__originalVertexNormals[a] = e.vertexNormals[a].clone()
- }
- var f = new THREE.Geometry;
- f.faces = this.faces;
- a = 0;
- for (b = this.morphTargets.length; a < b; a++) {
- if (!this.morphNormals[a]) {
- this.morphNormals[a] = {};
- this.morphNormals[a].faceNormals = [];
- this.morphNormals[a].vertexNormals = [];
- e = this.morphNormals[a].faceNormals;
- var h = this.morphNormals[a].vertexNormals,
- g, i;
- c = 0;
- for (d = this.faces.length; c < d; c++) g = new THREE.Vector3, i = {
- a: new THREE.Vector3,
- b: new THREE.Vector3,
- c: new THREE.Vector3
- }, e.push(g), h.push(i)
- }
- h = this.morphNormals[a];
- f.vertices = this.morphTargets[a].vertices;
- f.computeFaceNormals();
- f.computeVertexNormals();
- c = 0;
- for (d = this.faces.length; c < d; c++) e = this.faces[c], g = h.faceNormals[c], i = h.vertexNormals[c], g.copy(e.normal), i.a.copy(e.vertexNormals[0]), i.b.copy(e.vertexNormals[1]), i.c.copy(e.vertexNormals[2])
- }
- c = 0;
- for (d = this.faces.length; c < d; c++) e = this.faces[c], e.normal = e.__originalFaceNormal, e.vertexNormals = e.__originalVertexNormals
- },
- computeTangents: function() {
- var a, b, c, d, e, f, h, g, i, k, m, l, p, t, s, q, n, u = [],
- r = [];
- c = new THREE.Vector3;
- var v = new THREE.Vector3,
- z = new THREE.Vector3,
- G = new THREE.Vector3,
- w = new THREE.Vector3;
- a = 0;
- for (b = this.vertices.length; a < b; a++) u[a] = new THREE.Vector3, r[a] = new THREE.Vector3;
- a = 0;
- for (b = this.faces.length; a < b; a++) e = this.faces[a], f = this.faceVertexUvs[0][a], d = e.a, n = e.b, e = e.c, h = this.vertices[d], g = this.vertices[n], i = this.vertices[e], k = f[0], m = f[1], l = f[2], f = g.x - h.x, p = i.x - h.x, t = g.y - h.y, s = i.y - h.y, g = g.z - h.z, h = i.z - h.z, i = m.x - k.x, q = l.x - k.x, m = m.y - k.y, k = l.y - k.y, l = 1 / (i * k - q * m), c.set((k * f - m * p) * l, (k * t - m * s) * l, (k * g - m * h) * l), v.set((i * p - q * f) * l, (i * s - q * t) * l, (i * h - q * g) * l), u[d].add(c), u[n].add(c), u[e].add(c), r[d].add(v),
- r[n].add(v), r[e].add(v);
- v = ["a", "b", "c", "d"];
- a = 0;
- for (b = this.faces.length; a < b; a++) {
- e = this.faces[a];
- for (c = 0; c < Math.min(e.vertexNormals.length, 3); c++) w.copy(e.vertexNormals[c]), d = e[v[c]], n = u[d], z.copy(n), z.sub(w.multiplyScalar(w.dot(n))).normalize(), G.crossVectors(e.vertexNormals[c], n), d = G.dot(r[d]), d = 0 > d ? -1 : 1, e.vertexTangents[c] = new THREE.Vector4(z.x, z.y, z.z, d)
- }
- this.hasTangents = !0
- },
- computeLineDistances: function() {
- for (var a = 0, b = this.vertices, c = 0, d = b.length; c < d; c++) 0 < c && (a += b[c].distanceTo(b[c - 1])), this.lineDistances[c] = a
- },
- computeBoundingBox: function() {
- null === this.boundingBox && (this.boundingBox = new THREE.Box3);
- this.boundingBox.setFromPoints(this.vertices)
- },
- computeBoundingSphere: function() {
- null === this.boundingSphere && (this.boundingSphere = new THREE.Sphere);
- this.boundingSphere.setFromPoints(this.vertices)
- },
- mergeVertices: function() {
- var a = {}, b = [],
- c = [],
- d, e = Math.pow(10, 4),
- f, h;
- this.__tmpVertices = void 0;
- f = 0;
- for (h = this.vertices.length; f < h; f++) d = this.vertices[f], d = Math.round(d.x * e) + "_" + Math.round(d.y * e) + "_" + Math.round(d.z * e), void 0 === a[d] ? (a[d] = f, b.push(this.vertices[f]), c[f] = b.length - 1) : c[f] = c[a[d]];
- a = [];
- f = 0;
- for (h = this.faces.length; f < h; f++) {
- e = this.faces[f];
- e.a = c[e.a];
- e.b = c[e.b];
- e.c = c[e.c];
- e = [e.a, e.b, e.c];
- for (d = 0; 3 > d; d++) if (e[d] == e[(d + 1) % 3]) {
- a.push(f);
- break
- }
- }
- for (f = a.length - 1; 0 <= f; f--) {
- e = a[f];
- this.faces.splice(e, 1);
- c = 0;
- for (h = this.faceVertexUvs.length; c < h; c++) this.faceVertexUvs[c].splice(e, 1)
- }
- f = this.vertices.length - b.length;
- this.vertices = b;
- return f
- },
- clone: function() {
- for (var a = new THREE.Geometry, b = this.vertices, c = 0, d = b.length; c < d; c++) a.vertices.push(b[c].clone());
- b = this.faces;
- c = 0;
- for (d = b.length; c < d; c++) a.faces.push(b[c].clone());
- b = this.faceVertexUvs[0];
- c = 0;
- for (d = b.length; c < d; c++) {
- for (var e = b[c], f = [], h = 0, g = e.length; h < g; h++) f.push(new THREE.Vector2(e[h].x, e[h].y));
- a.faceVertexUvs[0].push(f)
- }
- return a
- },
- dispose: function() {
- this.dispatchEvent({
- type: "dispose"
- })
- }
-};
-THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype);
-THREE.GeometryIdCount = 0;
-THREE.BufferGeometry = function() {
- this.id = THREE.GeometryIdCount++;
- this.uuid = THREE.Math.generateUUID();
- this.name = "";
- this.attributes = {};
- this.dynamic = !0;
- this.offsets = [];
- this.boundingSphere = this.boundingBox = null;
- this.hasTangents = !1;
- this.morphTargets = []
-};
-THREE.BufferGeometry.prototype = {
- constructor: THREE.BufferGeometry,
- addAttribute: function(a, b, c, d) {
- this.attributes[a] = {
- itemSize: d,
- array: new b(c * d)
- }
- },
- applyMatrix: function(a) {
- var b, c;
- this.attributes.position && (b = this.attributes.position.array);
- this.attributes.normal && (c = this.attributes.normal.array);
- void 0 !== b && (a.multiplyVector3Array(b), this.verticesNeedUpdate = !0);
- void 0 !== c && ((new THREE.Matrix3).getNormalMatrix(a).multiplyVector3Array(c), this.normalizeNormals(), this.normalsNeedUpdate = !0)
- },
- computeBoundingBox: function() {
- null === this.boundingBox && (this.boundingBox = new THREE.Box3);
- var a = this.attributes.position.array;
- if (a) {
- var b = this.boundingBox,
- c, d, e;
- 3 <= a.length && (b.min.x = b.max.x = a[0], b.min.y = b.max.y = a[1], b.min.z = b.max.z = a[2]);
- for (var f = 3, h = a.length; f < h; f += 3) c = a[f], d = a[f + 1], e = a[f + 2], c < b.min.x ? b.min.x = c : c > b.max.x && (b.max.x = c), d < b.min.y ? b.min.y = d : d > b.max.y && (b.max.y = d), e < b.min.z ? b.min.z = e : e > b.max.z && (b.max.z = e)
- }
- if (void 0 === a || 0 === a.length) this.boundingBox.min.set(0, 0, 0), this.boundingBox.max.set(0, 0, 0)
- },
- computeBoundingSphere: function() {
- var a = new THREE.Box3,
- b = new THREE.Vector3;
- return function() {
- null === this.boundingSphere && (this.boundingSphere = new THREE.Sphere);
- var c = this.attributes.position.array;
- if (c) {
- for (var d = this.boundingSphere.center, e = 0, f = c.length; e < f; e += 3) b.set(c[e], c[e + 1], c[e + 2]), a.addPoint(b);
- a.center(d);
- for (var h = 0, e = 0, f = c.length; e < f; e += 3) b.set(c[e], c[e + 1], c[e + 2]), h = Math.max(h, d.distanceToSquared(b));
- this.boundingSphere.radius = Math.sqrt(h)
- }
- }
- }(),
- computeVertexNormals: function() {
- if (this.attributes.position) {
- var a, b, c, d;
- a = this.attributes.position.array.length;
- if (void 0 === this.attributes.normal) this.attributes.normal = {
- itemSize: 3,
- array: new Float32Array(a)
- };
- else {
- a = 0;
- for (b = this.attributes.normal.array.length; a < b; a++) this.attributes.normal.array[a] = 0
- }
- var e = this.attributes.position.array,
- f = this.attributes.normal.array,
- h, g, i, k, m, l, p = new THREE.Vector3,
- t = new THREE.Vector3,
- s = new THREE.Vector3,
- q = new THREE.Vector3,
- n = new THREE.Vector3;
- if (this.attributes.index) {
- var u = this.attributes.index.array,
- r = this.offsets;
- c = 0;
- for (d = r.length; c < d; ++c) {
- b = r[c].start;
- h = r[c].count;
- var v = r[c].index;
- a = b;
- for (b += h; a < b; a += 3) h = v + u[a], g = v + u[a + 1], i = v + u[a + 2], k = e[3 * h], m = e[3 * h + 1], l = e[3 * h + 2], p.set(k, m, l), k = e[3 * g], m = e[3 * g + 1], l = e[3 * g + 2], t.set(k, m, l), k = e[3 * i], m = e[3 * i + 1], l = e[3 * i + 2], s.set(k, m, l), q.subVectors(s, t), n.subVectors(p, t), q.cross(n), f[3 * h] += q.x, f[3 * h + 1] += q.y, f[3 * h + 2] += q.z, f[3 * g] += q.x, f[3 * g + 1] += q.y, f[3 * g + 2] += q.z, f[3 * i] += q.x, f[3 * i + 1] += q.y, f[3 * i + 2] += q.z
- }
- } else {
- a = 0;
- for (b = e.length; a < b; a += 9) k = e[a], m = e[a + 1], l = e[a + 2], p.set(k, m, l), k = e[a + 3], m = e[a + 4], l = e[a + 5], t.set(k, m, l), k = e[a + 6], m = e[a + 7], l = e[a + 8],
- s.set(k, m, l), q.subVectors(s, t), n.subVectors(p, t), q.cross(n), f[a] = q.x, f[a + 1] = q.y, f[a + 2] = q.z, f[a + 3] = q.x, f[a + 4] = q.y, f[a + 5] = q.z, f[a + 6] = q.x, f[a + 7] = q.y, f[a + 8] = q.z
- }
- this.normalizeNormals();
- this.normalsNeedUpdate = !0
- }
- },
- normalizeNormals: function() {
- for (var a = this.attributes.normal.array, b, c, d, e = 0, f = a.length; e < f; e += 3) b = a[e], c = a[e + 1], d = a[e + 2], b = 1 / Math.sqrt(b * b + c * c + d * d), a[e] *= b, a[e + 1] *= b, a[e + 2] *= b
- },
- computeTangents: function() {
- function a(a) {
- na.x = d[3 * a];
- na.y = d[3 * a + 1];
- na.z = d[3 * a + 2];
- pa.copy(na);
- Q = g[a];
- J.copy(Q);
- J.sub(na.multiplyScalar(na.dot(Q))).normalize();
- ca.crossVectors(pa, Q);
- R = ca.dot(i[a]);
- C = 0 > R ? -1 : 1;
- h[4 * a] = J.x;
- h[4 * a + 1] = J.y;
- h[4 * a + 2] = J.z;
- h[4 * a + 3] = C
- }
- if (void 0 === this.attributes.index || void 0 === this.attributes.position || void 0 === this.attributes.normal || void 0 === this.attributes.uv) console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");
- else {
- var b = this.attributes.index.array,
- c = this.attributes.position.array,
- d = this.attributes.normal.array,
- e = this.attributes.uv.array,
- f = c.length / 3;
- void 0 === this.attributes.tangent && (this.attributes.tangent = {
- itemSize: 4,
- array: new Float32Array(4 * f)
- });
- for (var h = this.attributes.tangent.array, g = [], i = [], k = 0; k < f; k++) g[k] = new THREE.Vector3, i[k] = new THREE.Vector3;
- var m, l, p, t, s, q, n, u, r, v, z, G, w, y, E, f = new THREE.Vector3,
- k = new THREE.Vector3,
- A, K, D, F, O, x, I, B = this.offsets;
- D = 0;
- for (F = B.length; D < F; ++D) {
- K = B[D].start;
- O = B[D].count;
- var M = B[D].index;
- A = K;
- for (K += O; A < K; A += 3) O = M + b[A], x = M + b[A + 1], I = M + b[A + 2], m = c[3 * O], l = c[3 * O + 1], p = c[3 * O + 2], t = c[3 * x], s = c[3 * x + 1], q = c[3 * x + 2], n = c[3 * I], u = c[3 * I + 1], r = c[3 * I + 2], v = e[2 * O], z = e[2 * O + 1], G = e[2 * x], w = e[2 * x + 1], y = e[2 * I], E = e[2 * I + 1], t -= m, m = n - m, s -= l, l = u - l, q -= p, p = r - p, G -= v, v = y - v, w -= z, z = E - z, E = 1 / (G * z - v * w), f.set((z * t - w * m) * E, (z * s - w * l) * E, (z * q - w * p) * E), k.set((G * m - v * t) * E, (G * l - v * s) * E, (G * p - v * q) * E), g[O].add(f), g[x].add(f), g[I].add(f), i[O].add(k), i[x].add(k), i[I].add(k)
- }
- var J = new THREE.Vector3,
- ca = new THREE.Vector3,
- na = new THREE.Vector3,
- pa = new THREE.Vector3,
- C, Q, R;
- D = 0;
- for (F = B.length; D < F; ++D) {
- K = B[D].start;
- O = B[D].count;
- M = B[D].index;
- A = K;
- for (K += O; A < K; A += 3) O = M + b[A], x = M + b[A + 1], I = M + b[A + 2], a(O), a(x),
- a(I)
- }
- this.tangentsNeedUpdate = this.hasTangents = !0
- }
- },
- clone: function() {
- var a = new THREE.BufferGeometry,
- b = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array],
- c;
- for (c in this.attributes) {
- for (var d = this.attributes[c], e = d.array, f = {
- itemSize: d.itemSize,
- numItems: d.numItems,
- array: null
- }, d = 0, h = b.length; d < h; d++) {
- var g = b[d];
- if (e instanceof g) {
- f.array = new g(e);
- break
- }
- }
- a.attributes[c] = f
- }
- d = 0;
- for (h = this.offsets.length; d < h; d++) b = this.offsets[d], a.offsets.push({
- start: b.start,
- index: b.index,
- count: b.count
- });
- return a
- },
- dispose: function() {
- this.dispatchEvent({
- type: "dispose"
- })
- }
-};
-THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype);
-THREE.Camera = function() {
- THREE.Object3D.call(this);
- this.matrixWorldInverse = new THREE.Matrix4;
- this.projectionMatrix = new THREE.Matrix4;
- this.projectionMatrixInverse = new THREE.Matrix4
-};
-THREE.Camera.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Camera.prototype.lookAt = function() {
- var a = new THREE.Matrix4;
- return function(b) {
- a.lookAt(this.position, b, this.up);
- this.quaternion.setFromRotationMatrix(a)
- }
-}();
-THREE.Camera.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.Camera);
- THREE.Object3D.prototype.clone.call(this, a);
- a.matrixWorldInverse.copy(this.matrixWorldInverse);
- a.projectionMatrix.copy(this.projectionMatrix);
- a.projectionMatrixInverse.copy(this.projectionMatrixInverse);
- return a
-};
-THREE.OrthographicCamera = function(a, b, c, d, e, f) {
- THREE.Camera.call(this);
- this.left = a;
- this.right = b;
- this.top = c;
- this.bottom = d;
- this.near = void 0 !== e ? e : 0.1;
- this.far = void 0 !== f ? f : 2E3;
- this.updateProjectionMatrix()
-};
-THREE.OrthographicCamera.prototype = Object.create(THREE.Camera.prototype);
-THREE.OrthographicCamera.prototype.updateProjectionMatrix = function() {
- this.projectionMatrix.makeOrthographic(this.left, this.right, this.top, this.bottom, this.near, this.far)
-};
-THREE.OrthographicCamera.prototype.clone = function() {
- var a = new THREE.OrthographicCamera;
- THREE.Camera.prototype.clone.call(this, a);
- a.left = this.left;
- a.right = this.right;
- a.top = this.top;
- a.bottom = this.bottom;
- a.near = this.near;
- a.far = this.far;
- return a
-};
-THREE.PerspectiveCamera = function(a, b, c, d) {
- THREE.Camera.call(this);
- this.fov = void 0 !== a ? a : 50;
- this.aspect = void 0 !== b ? b : 1;
- this.near = void 0 !== c ? c : 0.1;
- this.far = void 0 !== d ? d : 2E3;
- this.updateProjectionMatrix()
-};
-THREE.PerspectiveCamera.prototype = Object.create(THREE.Camera.prototype);
-THREE.PerspectiveCamera.prototype.setLens = function(a, b) {
- void 0 === b && (b = 24);
- this.fov = 2 * THREE.Math.radToDeg(Math.atan(b / (2 * a)));
- this.updateProjectionMatrix()
-};
-THREE.PerspectiveCamera.prototype.setViewOffset = function(a, b, c, d, e, f) {
- this.fullWidth = a;
- this.fullHeight = b;
- this.x = c;
- this.y = d;
- this.width = e;
- this.height = f;
- this.updateProjectionMatrix()
-};
-THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function() {
- if (this.fullWidth) {
- var a = this.fullWidth / this.fullHeight,
- b = Math.tan(THREE.Math.degToRad(0.5 * this.fov)) * this.near,
- c = -b,
- d = a * c,
- a = Math.abs(a * b - d),
- c = Math.abs(b - c);
- this.projectionMatrix.makeFrustum(d + this.x * a / this.fullWidth, d + (this.x + this.width) * a / this.fullWidth, b - (this.y + this.height) * c / this.fullHeight, b - this.y * c / this.fullHeight, this.near, this.far)
- } else this.projectionMatrix.makePerspective(this.fov, this.aspect, this.near, this.far)
-};
-THREE.PerspectiveCamera.prototype.clone = function() {
- var a = new THREE.PerspectiveCamera;
- THREE.Camera.prototype.clone.call(this, a);
- a.fov = this.fov;
- a.aspect = this.aspect;
- a.near = this.near;
- a.far = this.far;
- return a
-};
-THREE.Light = function(a) {
- THREE.Object3D.call(this);
- this.color = new THREE.Color(a)
-};
-THREE.Light.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Light.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.Light);
- THREE.Object3D.prototype.clone.call(this, a);
- a.color.copy(this.color);
- return a
-};
-THREE.AmbientLight = function(a) {
- THREE.Light.call(this, a)
-};
-THREE.AmbientLight.prototype = Object.create(THREE.Light.prototype);
-THREE.AmbientLight.prototype.clone = function() {
- var a = new THREE.AmbientLight;
- THREE.Light.prototype.clone.call(this, a);
- return a
-};
-THREE.AreaLight = function(a, b) {
- THREE.Light.call(this, a);
- this.normal = new THREE.Vector3(0, - 1, 0);
- this.right = new THREE.Vector3(1, 0, 0);
- this.intensity = void 0 !== b ? b : 1;
- this.height = this.width = 1;
- this.constantAttenuation = 1.5;
- this.linearAttenuation = 0.5;
- this.quadraticAttenuation = 0.1
-};
-THREE.AreaLight.prototype = Object.create(THREE.Light.prototype);
-THREE.DirectionalLight = function(a, b) {
- THREE.Light.call(this, a);
- this.position.set(0, 1, 0);
- this.target = new THREE.Object3D;
- this.intensity = void 0 !== b ? b : 1;
- this.onlyShadow = this.castShadow = !1;
- this.shadowCameraNear = 50;
- this.shadowCameraFar = 5E3;
- this.shadowCameraLeft = -500;
- this.shadowCameraTop = this.shadowCameraRight = 500;
- this.shadowCameraBottom = -500;
- this.shadowCameraVisible = !1;
- this.shadowBias = 0;
- this.shadowDarkness = 0.5;
- this.shadowMapHeight = this.shadowMapWidth = 512;
- this.shadowCascade = !1;
- this.shadowCascadeOffset = new THREE.Vector3(0,
- 0, - 1E3);
- this.shadowCascadeCount = 2;
- this.shadowCascadeBias = [0, 0, 0];
- this.shadowCascadeWidth = [512, 512, 512];
- this.shadowCascadeHeight = [512, 512, 512];
- this.shadowCascadeNearZ = [-1, 0.99, 0.998];
- this.shadowCascadeFarZ = [0.99, 0.998, 1];
- this.shadowCascadeArray = [];
- this.shadowMatrix = this.shadowCamera = this.shadowMapSize = this.shadowMap = null
-};
-THREE.DirectionalLight.prototype = Object.create(THREE.Light.prototype);
-THREE.DirectionalLight.prototype.clone = function() {
- var a = new THREE.DirectionalLight;
- THREE.Light.prototype.clone.call(this, a);
- a.target = this.target.clone();
- a.intensity = this.intensity;
- a.castShadow = this.castShadow;
- a.onlyShadow = this.onlyShadow;
- return a
-};
-THREE.HemisphereLight = function(a, b, c) {
- THREE.Light.call(this, a);
- this.position.set(0, 100, 0);
- this.groundColor = new THREE.Color(b);
- this.intensity = void 0 !== c ? c : 1
-};
-THREE.HemisphereLight.prototype = Object.create(THREE.Light.prototype);
-THREE.HemisphereLight.prototype.clone = function() {
- var a = new THREE.HemisphereLight;
- THREE.Light.prototype.clone.call(this, a);
- a.groundColor.copy(this.groundColor);
- a.intensity = this.intensity;
- return a
-};
-THREE.PointLight = function(a, b, c) {
- THREE.Light.call(this, a);
- this.intensity = void 0 !== b ? b : 1;
- this.distance = void 0 !== c ? c : 0
-};
-THREE.PointLight.prototype = Object.create(THREE.Light.prototype);
-THREE.PointLight.prototype.clone = function() {
- var a = new THREE.PointLight;
- THREE.Light.prototype.clone.call(this, a);
- a.intensity = this.intensity;
- a.distance = this.distance;
- return a
-};
-THREE.SpotLight = function(a, b, c, d, e) {
- THREE.Light.call(this, a);
- this.position.set(0, 1, 0);
- this.target = new THREE.Object3D;
- this.intensity = void 0 !== b ? b : 1;
- this.distance = void 0 !== c ? c : 0;
- this.angle = void 0 !== d ? d : Math.PI / 3;
- this.exponent = void 0 !== e ? e : 10;
- this.onlyShadow = this.castShadow = !1;
- this.shadowCameraNear = 50;
- this.shadowCameraFar = 5E3;
- this.shadowCameraFov = 50;
- this.shadowCameraVisible = !1;
- this.shadowBias = 0;
- this.shadowDarkness = 0.5;
- this.shadowMapHeight = this.shadowMapWidth = 512;
- this.shadowMatrix = this.shadowCamera = this.shadowMapSize = this.shadowMap = null
-};
-THREE.SpotLight.prototype = Object.create(THREE.Light.prototype);
-THREE.SpotLight.prototype.clone = function() {
- var a = new THREE.SpotLight;
- THREE.Light.prototype.clone.call(this, a);
- a.target = this.target.clone();
- a.intensity = this.intensity;
- a.distance = this.distance;
- a.angle = this.angle;
- a.exponent = this.exponent;
- a.castShadow = this.castShadow;
- a.onlyShadow = this.onlyShadow;
- return a
-};
-THREE.Loader = function(a) {
- this.statusDomElement = (this.showStatus = a) ? THREE.Loader.prototype.addStatusElement() : null;
- this.onLoadStart = function() {};
- this.onLoadProgress = function() {};
- this.onLoadComplete = function() {}
-};
-THREE.Loader.prototype = {
- constructor: THREE.Loader,
- crossOrigin: "anonymous",
- addStatusElement: function() {
- var a = document.createElement("div");
- a.style.position = "absolute";
- a.style.right = "0px";
- a.style.top = "0px";
- a.style.fontSize = "0.8em";
- a.style.textAlign = "left";
- a.style.background = "rgba(0,0,0,0.25)";
- a.style.color = "#fff";
- a.style.width = "120px";
- a.style.padding = "0.5em 0.5em 0.5em 0.5em";
- a.style.zIndex = 1E3;
- a.innerHTML = "Loading ...";
- return a
- },
- updateProgress: function(a) {
- var b = "Loaded ",
- b = a.total ? b + ((100 * a.loaded / a.total).toFixed(0) + "%") : b + ((a.loaded / 1E3).toFixed(2) + " KB");
- this.statusDomElement.innerHTML = b
- },
- extractUrlBase: function(a) {
- a = a.split("/");
- a.pop();
- return (1 > a.length ? "." : a.join("/")) + "/"
- },
- initMaterials: function(a, b) {
- for (var c = [], d = 0; d < a.length; ++d) c[d] = THREE.Loader.prototype.createMaterial(a[d], b);
- return c
- },
- needsTangents: function(a) {
- for (var b = 0, c = a.length; b < c; b++) if (a[b] instanceof THREE.ShaderMaterial) return !0;
- return !1
- },
- createMaterial: function(a, b) {
- function c(a) {
- a = Math.log(a) / Math.LN2;
- return Math.floor(a) == a
- }
- function d(a) {
- a = Math.log(a) / Math.LN2;
- return Math.pow(2, Math.round(a))
- }
- function e(a, e, f, g, i, k, n) {
- var u = /\.dds$/i.test(f),
- r = b + "/" + f;
- if (u) {
- var v = THREE.ImageUtils.loadCompressedTexture(r);
- a[e] = v
- } else v = document.createElement("canvas"), a[e] = new THREE.Texture(v);
- a[e].sourceFile = f;
- g && (a[e].repeat.set(g[0], g[1]), 1 !== g[0] && (a[e].wrapS = THREE.RepeatWrapping), 1 !== g[1] && (a[e].wrapT = THREE.RepeatWrapping));
- i && a[e].offset.set(i[0], i[1]);
- k && (f = {
- repeat: THREE.RepeatWrapping,
- mirror: THREE.MirroredRepeatWrapping
- }, void 0 !== f[k[0]] && (a[e].wrapS = f[k[0]]), void 0 !== f[k[1]] && (a[e].wrapT = f[k[1]]));
- n && (a[e].anisotropy = n);
- if (!u) {
- var z = a[e],
- a = new Image;
- a.onload = function() {
- if (!c(this.width) || !c(this.height)) {
- var a = d(this.width),
- b = d(this.height);
- z.image.width = a;
- z.image.height = b;
- z.image.getContext("2d").drawImage(this, 0, 0, a, b)
- } else z.image = this;
- z.needsUpdate = !0
- };
- a.crossOrigin = h.crossOrigin;
- a.src = r
- }
- }
- function f(a) {
- return (255 * a[0] << 16) + (255 * a[1] << 8) + 255 * a[2]
- }
- var h = this,
- g = "MeshLambertMaterial",
- i = {
- color: 15658734,
- opacity: 1,
- map: null,
- lightMap: null,
- normalMap: null,
- bumpMap: null,
- wireframe: !1
- };
- if (a.shading) {
- var k = a.shading.toLowerCase();
- "phong" === k ? g = "MeshPhongMaterial" : "basic" === k && (g = "MeshBasicMaterial")
- }
- void 0 !== a.blending && void 0 !== THREE[a.blending] && (i.blending = THREE[a.blending]);
- if (void 0 !== a.transparent || 1 > a.opacity) i.transparent = a.transparent;
- void 0 !== a.depthTest && (i.depthTest = a.depthTest);
- void 0 !== a.depthWrite && (i.depthWrite = a.depthWrite);
- void 0 !== a.visible && (i.visible = a.visible);
- void 0 !== a.flipSided && (i.side = THREE.BackSide);
- void 0 !== a.doubleSided && (i.side = THREE.DoubleSide);
- void 0 !== a.wireframe && (i.wireframe = a.wireframe);
- void 0 !== a.vertexColors && ("face" === a.vertexColors ? i.vertexColors = THREE.FaceColors : a.vertexColors && (i.vertexColors = THREE.VertexColors));
- a.colorDiffuse ? i.color = f(a.colorDiffuse) : a.DbgColor && (i.color = a.DbgColor);
- a.colorSpecular && (i.specular = f(a.colorSpecular));
- a.colorAmbient && (i.ambient = f(a.colorAmbient));
- a.transparency && (i.opacity = a.transparency);
- a.specularCoef && (i.shininess = a.specularCoef);
- a.mapDiffuse && b && e(i, "map", a.mapDiffuse, a.mapDiffuseRepeat, a.mapDiffuseOffset, a.mapDiffuseWrap, a.mapDiffuseAnisotropy);
- a.mapLight && b && e(i, "lightMap", a.mapLight, a.mapLightRepeat, a.mapLightOffset, a.mapLightWrap, a.mapLightAnisotropy);
- a.mapBump && b && e(i, "bumpMap", a.mapBump, a.mapBumpRepeat, a.mapBumpOffset, a.mapBumpWrap, a.mapBumpAnisotropy);
- a.mapNormal && b && e(i, "normalMap", a.mapNormal, a.mapNormalRepeat, a.mapNormalOffset, a.mapNormalWrap, a.mapNormalAnisotropy);
- a.mapSpecular && b && e(i, "specularMap", a.mapSpecular, a.mapSpecularRepeat,
- a.mapSpecularOffset, a.mapSpecularWrap, a.mapSpecularAnisotropy);
- a.mapBumpScale && (i.bumpScale = a.mapBumpScale);
- a.mapNormal ? (g = THREE.ShaderLib.normalmap, k = THREE.UniformsUtils.clone(g.uniforms), k.tNormal.value = i.normalMap, a.mapNormalFactor && k.uNormalScale.value.set(a.mapNormalFactor, a.mapNormalFactor), i.map && (k.tDiffuse.value = i.map, k.enableDiffuse.value = !0), i.specularMap && (k.tSpecular.value = i.specularMap, k.enableSpecular.value = !0), i.lightMap && (k.tAO.value = i.lightMap, k.enableAO.value = !0), k.uDiffuseColor.value.setHex(i.color),
- k.uSpecularColor.value.setHex(i.specular), k.uAmbientColor.value.setHex(i.ambient), k.uShininess.value = i.shininess, void 0 !== i.opacity && (k.uOpacity.value = i.opacity), g = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: k,
- lights: !0,
- fog: !0
- }), i.transparent && (g.transparent = !0)) : g = new THREE[g](i);
- void 0 !== a.DbgName && (g.name = a.DbgName);
- return g
- }
-};
-THREE.XHRLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.XHRLoader.prototype = {
- constructor: THREE.XHRLoader,
- load: function(a, b, c, d) {
- var e = this,
- f = new XMLHttpRequest;
- void 0 !== b && f.addEventListener("load", function(c) {
- b(c.target.responseText);
- e.manager.itemEnd(a)
- }, !1);
- void 0 !== c && f.addEventListener("progress", function(a) {
- c(a)
- }, !1);
- void 0 !== d && f.addEventListener("error", function(a) {
- d(a)
- }, !1);
- void 0 !== this.crossOrigin && (f.crossOrigin = this.crossOrigin);
- f.open("GET", a, !0);
- f.send(null);
- e.manager.itemStart(a)
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- }
-};
-THREE.ImageLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.ImageLoader.prototype = {
- constructor: THREE.ImageLoader,
- load: function(a, b, c, d) {
- var e = this,
- f = document.createElement("img");
- void 0 !== b && f.addEventListener("load", function() {
- e.manager.itemEnd(a);
- b(this)
- }, !1);
- void 0 !== c && f.addEventListener("progress", function(a) {
- c(a)
- }, !1);
- void 0 !== d && f.addEventListener("error", function(a) {
- d(a)
- }, !1);
- void 0 !== this.crossOrigin && (f.crossOrigin = this.crossOrigin);
- f.src = a;
- e.manager.itemStart(a);
- return f
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- }
-};
-THREE.JSONLoader = function(a) {
- THREE.Loader.call(this, a);
- this.withCredentials = !1
-};
-THREE.JSONLoader.prototype = Object.create(THREE.Loader.prototype);
-THREE.JSONLoader.prototype.load = function(a, b, c) {
- c = c && "string" === typeof c ? c : this.extractUrlBase(a);
- this.onLoadStart();
- this.loadAjaxJSON(this, a, b, c)
-};
-THREE.JSONLoader.prototype.loadAjaxJSON = function(a, b, c, d, e) {
- var f = new XMLHttpRequest,
- h = 0;
- f.onreadystatechange = function() {
- if (f.readyState === f.DONE) if (200 === f.status || 0 === f.status) {
- if (f.responseText) {
- var g = JSON.parse(f.responseText),
- g = a.parse(g, d);
- c(g.geometry, g.materials)
- } else console.warn("THREE.JSONLoader: [" + b + "] seems to be unreachable or file there is empty");
- a.onLoadComplete()
- } else console.error("THREE.JSONLoader: Couldn't load [" + b + "] [" + f.status + "]");
- else f.readyState === f.LOADING ? e && (0 === h && (h = f.getResponseHeader("Content-Length")), e({
- total: h,
- loaded: f.responseText.length
- })) : f.readyState === f.HEADERS_RECEIVED && void 0 !== e && (h = f.getResponseHeader("Content-Length"))
- };
- f.open("GET", b, !0);
- f.withCredentials = this.withCredentials;
- f.send(null)
-};
-THREE.JSONLoader.prototype.parse = function(a, b) {
- var c = new THREE.Geometry,
- d = void 0 !== a.scale ? 1 / a.scale : 1,
- e, f, h, g, i, k, m, l, p, t, s, q, n, u, r = a.faces;
- p = a.vertices;
- var v = a.normals,
- z = a.colors,
- G = 0;
- if (void 0 !== a.uvs) {
- for (e = 0; e < a.uvs.length; e++) a.uvs[e].length && G++;
- for (e = 0; e < G; e++) c.faceVertexUvs[e] = []
- }
- g = 0;
- for (i = p.length; g < i;) k = new THREE.Vector3, k.x = p[g++] * d, k.y = p[g++] * d, k.z = p[g++] * d, c.vertices.push(k);
- g = 0;
- for (i = r.length; g < i;) if (p = r[g++], t = p & 1, h = p & 2, e = p & 8, m = p & 16, s = p & 32, k = p & 64, p &= 128, t) {
- t = new THREE.Face3;
- t.a = r[g];
- t.b = r[g + 1];
- t.c = r[g + 3];
- q = new THREE.Face3;
- q.a = r[g + 1];
- q.b = r[g + 2];
- q.c = r[g + 3];
- g += 4;
- h && (h = r[g++], t.materialIndex = h, q.materialIndex = h);
- h = c.faces.length;
- if (e) for (e = 0; e < G; e++) {
- n = a.uvs[e];
- c.faceVertexUvs[e][h] = [];
- c.faceVertexUvs[e][h + 1] = [];
- for (f = 0; 4 > f; f++) l = r[g++], u = n[2 * l], l = n[2 * l + 1], u = new THREE.Vector2(u, l), 2 !== f && c.faceVertexUvs[e][h].push(u), 0 !== f && c.faceVertexUvs[e][h + 1].push(u)
- }
- m && (m = 3 * r[g++], t.normal.set(v[m++], v[m++], v[m]), q.normal.copy(t.normal));
- if (s) for (e = 0; 4 > e; e++) m = 3 * r[g++], s = new THREE.Vector3(v[m++],
- v[m++], v[m]), 2 !== e && t.vertexNormals.push(s), 0 !== e && q.vertexNormals.push(s);
- k && (k = r[g++], k = z[k], t.color.setHex(k), q.color.setHex(k));
- if (p) for (e = 0; 4 > e; e++) k = r[g++], k = z[k], 2 !== e && t.vertexColors.push(new THREE.Color(k)), 0 !== e && q.vertexColors.push(new THREE.Color(k));
- c.faces.push(t);
- c.faces.push(q)
- } else {
- t = new THREE.Face3;
- t.a = r[g++];
- t.b = r[g++];
- t.c = r[g++];
- h && (h = r[g++], t.materialIndex = h);
- h = c.faces.length;
- if (e) for (e = 0; e < G; e++) {
- n = a.uvs[e];
- c.faceVertexUvs[e][h] = [];
- for (f = 0; 3 > f; f++) l = r[g++], u = n[2 * l], l = n[2 * l + 1],
- u = new THREE.Vector2(u, l), c.faceVertexUvs[e][h].push(u)
- }
- m && (m = 3 * r[g++], t.normal.set(v[m++], v[m++], v[m]));
- if (s) for (e = 0; 3 > e; e++) m = 3 * r[g++], s = new THREE.Vector3(v[m++], v[m++], v[m]), t.vertexNormals.push(s);
- k && (k = r[g++], t.color.setHex(z[k]));
- if (p) for (e = 0; 3 > e; e++) k = r[g++], t.vertexColors.push(new THREE.Color(z[k]));
- c.faces.push(t)
- }
- if (a.skinWeights) {
- g = 0;
- for (i = a.skinWeights.length; g < i; g += 2) r = a.skinWeights[g], v = a.skinWeights[g + 1], c.skinWeights.push(new THREE.Vector4(r, v, 0, 0))
- }
- if (a.skinIndices) {
- g = 0;
- for (i = a.skinIndices.length; g < i; g += 2) r = a.skinIndices[g], v = a.skinIndices[g + 1], c.skinIndices.push(new THREE.Vector4(r, v, 0, 0))
- }
- c.bones = a.bones;
- c.animation = a.animation;
- c.animations = a.animations;
- if (void 0 !== a.morphTargets) {
- g = 0;
- for (i = a.morphTargets.length; g < i; g++) {
- c.morphTargets[g] = {};
- c.morphTargets[g].name = a.morphTargets[g].name;
- c.morphTargets[g].vertices = [];
- z = c.morphTargets[g].vertices;
- G = a.morphTargets[g].vertices;
- r = 0;
- for (v = G.length; r < v; r += 3) p = new THREE.Vector3, p.x = G[r] * d, p.y = G[r + 1] * d, p.z = G[r + 2] * d, z.push(p)
- }
- }
- if (void 0 !== a.morphColors) {
- g = 0;
- for (i = a.morphColors.length; g < i; g++) {
- c.morphColors[g] = {};
- c.morphColors[g].name = a.morphColors[g].name;
- c.morphColors[g].colors = [];
- v = c.morphColors[g].colors;
- z = a.morphColors[g].colors;
- d = 0;
- for (r = z.length; d < r; d += 3) G = new THREE.Color(16755200), G.setRGB(z[d], z[d + 1], z[d + 2]), v.push(G)
- }
- }
- c.computeCentroids();
- c.computeFaceNormals();
- c.computeBoundingSphere();
- if (void 0 === a.materials) return {
- geometry: c
- };
- d = this.initMaterials(a.materials, b);
- this.needsTangents(d) && c.computeTangents();
- return {
- geometry: c,
- materials: d
- }
-};
-THREE.LoadingManager = function(a, b, c) {
- var d = this,
- e = 0,
- f = 0;
- this.onLoad = a;
- this.onProgress = b;
- this.onError = c;
- this.itemStart = function() {
- f++
- };
- this.itemEnd = function(a) {
- e++;
- if (void 0 !== d.onProgress) d.onProgress(a, e, f);
- if (e === f && void 0 !== d.onLoad) d.onLoad()
- }
-};
-THREE.DefaultLoadingManager = new THREE.LoadingManager;
-THREE.BufferGeometryLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.BufferGeometryLoader.prototype = {
- constructor: THREE.BufferGeometryLoader,
- load: function(a, b) {
- var c = this,
- d = new THREE.XHRLoader;
- d.setCrossOrigin(this.crossOrigin);
- d.load(a, function(a) {
- b(c.parse(JSON.parse(a)))
- })
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- },
- parse: function(a) {
- var b = new THREE.BufferGeometry,
- c = a.attributes,
- d = a.offsets,
- a = a.boundingSphere,
- e;
- for (e in c) {
- var f = c[e];
- b.attributes[e] = {
- itemSize: f.itemSize,
- array: new self[f.type](f.array)
- }
- }
- void 0 !== d && (b.offsets = JSON.parse(JSON.stringify(d)));
- void 0 !== a && (b.boundingSphere = new THREE.Sphere((new THREE.Vector3).fromArray(void 0 !== a.center ? a.center : [0, 0, 0]), a.radius));
- return b
- }
-};
-THREE.GeometryLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.GeometryLoader.prototype = {
- constructor: THREE.GeometryLoader,
- load: function(a, b) {
- var c = this,
- d = new THREE.XHRLoader;
- d.setCrossOrigin(this.crossOrigin);
- d.load(a, function(a) {
- b(c.parse(JSON.parse(a)))
- })
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- },
- parse: function() {}
-};
-THREE.MaterialLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.MaterialLoader.prototype = {
- constructor: THREE.MaterialLoader,
- load: function(a, b) {
- var c = this,
- d = new THREE.XHRLoader;
- d.setCrossOrigin(this.crossOrigin);
- d.load(a, function(a) {
- b(c.parse(JSON.parse(a)))
- })
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- },
- parse: function(a) {
- var b = new THREE[a.type];
- void 0 !== a.color && b.color.setHex(a.color);
- void 0 !== a.ambient && b.ambient.setHex(a.ambient);
- void 0 !== a.emissive && b.emissive.setHex(a.emissive);
- void 0 !== a.specular && b.specular.setHex(a.specular);
- void 0 !== a.shininess && (b.shininess = a.shininess);
- void 0 !== a.vertexColors && (b.vertexColors = a.vertexColors);
- void 0 !== a.blending && (b.blending = a.blending);
- void 0 !== a.side && (b.side = a.side);
- void 0 !== a.opacity && (b.opacity = a.opacity);
- void 0 !== a.transparent && (b.transparent = a.transparent);
- void 0 !== a.wireframe && (b.wireframe = a.wireframe);
- if (void 0 !== a.materials) for (var c = 0, d = a.materials.length; c < d; c++) b.materials.push(this.parse(a.materials[c]));
- return b
- }
-};
-THREE.ObjectLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.ObjectLoader.prototype = {
- constructor: THREE.ObjectLoader,
- load: function(a, b) {
- var c = this,
- d = new THREE.XHRLoader(c.manager);
- d.setCrossOrigin(this.crossOrigin);
- d.load(a, function(a) {
- b(c.parse(JSON.parse(a)))
- })
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- },
- parse: function(a) {
- var b = this.parseGeometries(a.geometries),
- c = this.parseMaterials(a.materials);
- return this.parseObject(a.object, b, c)
- },
- parseGeometries: function(a) {
- var b = {};
- if (void 0 !== a) for (var c = new THREE.JSONLoader, d = new THREE.BufferGeometryLoader,
- e = 0, f = a.length; e < f; e++) {
- var h, g = a[e];
- switch (g.type) {
- case "PlaneGeometry":
- h = new THREE.PlaneGeometry(g.width, g.height, g.widthSegments, g.heightSegments);
- break;
- case "CircleGeometry":
- h = new THREE.CircleGeometry(g.radius, g.segments);
- break;
- case "CubeGeometry":
- h = new THREE.CubeGeometry(g.width, g.height, g.depth, g.widthSegments, g.heightSegments, g.depthSegments);
- break;
- case "CylinderGeometry":
- h = new THREE.CylinderGeometry(g.radiusTop, g.radiusBottom, g.height, g.radialSegments, g.heightSegments, g.openEnded);
- break;
- case "SphereGeometry":
- h = new THREE.SphereGeometry(g.radius, g.widthSegments, g.heightSegments, g.phiStart, g.phiLength, g.thetaStart, g.thetaLength);
- break;
- case "IcosahedronGeometry":
- h = new THREE.IcosahedronGeometry(g.radius, g.detail);
- break;
- case "TorusGeometry":
- h = new THREE.TorusGeometry(g.radius, g.tube, g.radialSegments, g.tubularSegments, g.arc);
- break;
- case "TorusKnotGeometry":
- h = new THREE.TorusKnotGeometry(g.radius, g.tube, g.radialSegments, g.tubularSegments, g.p, g.q, g.heightScale);
- break;
- case "BufferGeometry":
- h = d.parse(g.data);
- break;
- case "Geometry":
- h = c.parse(g.data).geometry
- }
- h.uuid = g.uuid;
- void 0 !== g.name && (h.name = g.name);
- b[g.uuid] = h
- }
- return b
- },
- parseMaterials: function(a) {
- var b = {};
- if (void 0 !== a) for (var c = new THREE.MaterialLoader, d = 0, e = a.length; d < e; d++) {
- var f = a[d],
- h = c.parse(f);
- h.uuid = f.uuid;
- void 0 !== f.name && (h.name = f.name);
- b[f.uuid] = h
- }
- return b
- },
- parseObject: function() {
- var a = new THREE.Matrix4;
- return function(b, c, d) {
- var e;
- switch (b.type) {
- case "Scene":
- e = new THREE.Scene;
- break;
- case "PerspectiveCamera":
- e = new THREE.PerspectiveCamera(b.fov, b.aspect, b.near,
- b.far);
- break;
- case "OrthographicCamera":
- e = new THREE.OrthographicCamera(b.left, b.right, b.top, b.bottom, b.near, b.far);
- break;
- case "AmbientLight":
- e = new THREE.AmbientLight(b.color);
- break;
- case "DirectionalLight":
- e = new THREE.DirectionalLight(b.color, b.intensity);
- break;
- case "PointLight":
- e = new THREE.PointLight(b.color, b.intensity, b.distance);
- break;
- case "SpotLight":
- e = new THREE.SpotLight(b.color, b.intensity, b.distance, b.angle, b.exponent);
- break;
- case "HemisphereLight":
- e = new THREE.HemisphereLight(b.color, b.groundColor,
- b.intensity);
- break;
- case "Mesh":
- e = c[b.geometry];
- var f = d[b.material];
- void 0 === e && console.error("THREE.ObjectLoader: Undefined geometry " + b.geometry);
- void 0 === f && console.error("THREE.ObjectLoader: Undefined material " + b.material);
- e = new THREE.Mesh(e, f);
- break;
- case "Sprite":
- f = d[b.material];
- void 0 === f && console.error("THREE.ObjectLoader: Undefined material " + b.material);
- e = new THREE.Sprite(f);
- break;
- default:
- e = new THREE.Object3D
- }
- e.uuid = b.uuid;
- void 0 !== b.name && (e.name = b.name);
- void 0 !== b.matrix ? (a.fromArray(b.matrix),
- a.decompose(e.position, e.quaternion, e.scale)) : (void 0 !== b.position && e.position.fromArray(b.position), void 0 !== b.rotation && e.rotation.fromArray(b.rotation), void 0 !== b.scale && e.scale.fromArray(b.scale));
- void 0 !== b.visible && (e.visible = b.visible);
- void 0 !== b.userData && (e.userData = b.userData);
- if (void 0 !== b.children) for (var h in b.children) e.add(this.parseObject(b.children[h], c, d));
- return e
- }
- }()
-};
-THREE.SceneLoader = function() {
- this.onLoadStart = function() {};
- this.onLoadProgress = function() {};
- this.onLoadComplete = function() {};
- this.callbackSync = function() {};
- this.callbackProgress = function() {};
- this.geometryHandlers = {};
- this.hierarchyHandlers = {};
- this.addGeometryHandler("ascii", THREE.JSONLoader)
-};
-THREE.SceneLoader.prototype = {
- constructor: THREE.SceneLoader,
- load: function(a, b) {
- var c = this,
- d = new THREE.XHRLoader(c.manager);
- d.setCrossOrigin(this.crossOrigin);
- d.load(a, function(d) {
- c.parse(JSON.parse(d), b, a)
- })
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- },
- addGeometryHandler: function(a, b) {
- this.geometryHandlers[a] = {
- loaderClass: b
- }
- },
- addHierarchyHandler: function(a, b) {
- this.hierarchyHandlers[a] = {
- loaderClass: b
- }
- },
- parse: function(a, b, c) {
- function d(a, b) {
- return "relativeToHTML" == b ? a : p + "/" + a
- }
- function e() {
- f(y.scene,
- A.objects)
- }
- function f(a, b) {
- var c, e, h, i, k, m;
- for (m in b) {
- var p = y.objects[m],
- n = b[m];
- if (void 0 === p) {
- if (n.type && n.type in l.hierarchyHandlers) {
- if (void 0 === n.loading) {
- c = {
- type: 1,
- url: 1,
- material: 1,
- position: 1,
- rotation: 1,
- scale: 1,
- visible: 1,
- children: 1,
- userData: 1,
- skin: 1,
- morph: 1,
- mirroredLoop: 1,
- duration: 1
- };
- var u = {}, v;
- for (v in n) v in c || (u[v] = n[v]);
- s = y.materials[n.material];
- n.loading = !0;
- c = l.hierarchyHandlers[n.type].loaderObject;
- c.options ? c.load(d(n.url, A.urlBaseType), g(m, a, s, n)) : c.load(d(n.url, A.urlBaseType), g(m,
- a, s, n), u)
- }
- } else if (void 0 !== n.geometry) {
- if (t = y.geometries[n.geometry]) {
- p = !1;
- s = y.materials[n.material];
- p = s instanceof THREE.ShaderMaterial;
- e = n.position;
- h = n.rotation;
- i = n.scale;
- c = n.matrix;
- k = n.quaternion;
- n.material || (s = new THREE.MeshFaceMaterial(y.face_materials[n.geometry]));
- s instanceof THREE.MeshFaceMaterial && 0 === s.materials.length && (s = new THREE.MeshFaceMaterial(y.face_materials[n.geometry]));
- if (s instanceof THREE.MeshFaceMaterial) for (u = 0; u < s.materials.length; u++) p = p || s.materials[u] instanceof THREE.ShaderMaterial;
- p && t.computeTangents();
- n.skin ? p = new THREE.SkinnedMesh(t, s) : n.morph ? (p = new THREE.MorphAnimMesh(t, s), void 0 !== n.duration && (p.duration = n.duration), void 0 !== n.time && (p.time = n.time), void 0 !== n.mirroredLoop && (p.mirroredLoop = n.mirroredLoop), s.morphNormals && t.computeMorphNormals()) : p = new THREE.Mesh(t, s);
- p.name = m;
- c ? (p.matrixAutoUpdate = !1, p.matrix.set(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15])) : (p.position.fromArray(e), k ? p.quaternion.fromArray(k) : p.rotation.fromArray(h),
- p.scale.fromArray(i));
- p.visible = n.visible;
- p.castShadow = n.castShadow;
- p.receiveShadow = n.receiveShadow;
- a.add(p);
- y.objects[m] = p
- }
- } else if ("AmbientLight" === n.type || "PointLight" === n.type || "DirectionalLight" === n.type || "SpotLight" === n.type || "HemisphereLight" === n.type || "AreaLight" === n.type) {
- u = n.color;
- c = n.intensity;
- e = n.distance;
- h = n.position;
- i = n.rotation;
- switch (n.type) {
- case "AmbientLight":
- r = new THREE.AmbientLight(u);
- break;
- case "PointLight":
- r = new THREE.PointLight(u, c, e);
- r.position.fromArray(h);
- break;
- case "DirectionalLight":
- r = new THREE.DirectionalLight(u, c);
- r.position.fromArray(n.direction);
- break;
- case "SpotLight":
- r = new THREE.SpotLight(u, c, e, 1);
- r.angle = n.angle;
- r.position.fromArray(h);
- r.target.set(h[0], h[1] - e, h[2]);
- r.target.applyEuler(new THREE.Euler(i[0], i[1], i[2], "XYZ"));
- break;
- case "HemisphereLight":
- r = new THREE.DirectionalLight(u, c, e);
- r.target.set(h[0], h[1] - e, h[2]);
- r.target.applyEuler(new THREE.Euler(i[0], i[1], i[2], "XYZ"));
- break;
- case "AreaLight":
- r = new THREE.AreaLight(u, c), r.position.fromArray(h), r.width = n.size, r.height = n.size_y
- }
- a.add(r);
- r.name = m;
- y.lights[m] = r;
- y.objects[m] = r
- } else "PerspectiveCamera" === n.type || "OrthographicCamera" === n.type ? (e = n.position, h = n.rotation, k = n.quaternion, "PerspectiveCamera" === n.type ? q = new THREE.PerspectiveCamera(n.fov, n.aspect, n.near, n.far) : "OrthographicCamera" === n.type && (q = new THREE.OrthographicCamera(n.left, n.right, n.top, n.bottom, n.near, n.far)), q.name = m, q.position.fromArray(e), void 0 !== k ? q.quaternion.fromArray(k) : void 0 !== h && q.rotation.fromArray(h), a.add(q), y.cameras[m] = q, y.objects[m] = q) : (e = n.position, h = n.rotation, i = n.scale, k = n.quaternion, p = new THREE.Object3D, p.name = m, p.position.fromArray(e), k ? p.quaternion.fromArray(k) : p.rotation.fromArray(h), p.scale.fromArray(i), p.visible = void 0 !== n.visible ? n.visible : !1, a.add(p), y.objects[m] = p, y.empties[m] = p);
- if (p) {
- if (void 0 !== n.userData) for (var z in n.userData) p.userData[z] = n.userData[z];
- if (void 0 !== n.groups) for (u = 0; u < n.groups.length; u++) c = n.groups[u], void 0 === y.groups[c] && (y.groups[c] = []), y.groups[c].push(m)
- }
- }
- void 0 !== p && void 0 !== n.children && f(p, n.children)
- }
- }
- function h(a) {
- return function(b, c) {
- b.name = a;
- y.geometries[a] = b;
- y.face_materials[a] = c;
- e();
- v -= 1;
- l.onLoadComplete();
- k()
- }
- }
- function g(a, b, c, d) {
- return function(f) {
- var f = f.content ? f.content : f.dae ? f.scene : f,
- h = d.rotation,
- g = d.quaternion,
- i = d.scale;
- f.position.fromArray(d.position);
- g ? f.quaternion.fromArray(g) : f.rotation.fromArray(h);
- f.scale.fromArray(i);
- c && f.traverse(function(a) {
- a.material = c
- });
- var m = void 0 !== d.visible ? d.visible : !0;
- f.traverse(function(a) {
- a.visible = m
- });
- b.add(f);
- f.name = a;
- y.objects[a] = f;
- e();
- v -= 1;
- l.onLoadComplete();
- k()
- }
- }
- function i(a) {
- return function(b, c) {
- b.name = a;
- y.geometries[a] = b;
- y.face_materials[a] = c
- }
- }
- function k() {
- l.callbackProgress({
- totalModels: G,
- totalTextures: w,
- loadedModels: G - v,
- loadedTextures: w - z
- }, y);
- l.onLoadProgress();
- if (0 === v && 0 === z) {
- for (var a = 0; a < E.length; a++) {
- var c = E[a],
- d = y.objects[c.targetName];
- d ? c.object.target = d : (c.object.target = new THREE.Object3D, y.scene.add(c.object.target));
- c.object.target.userData.targetInverse = c.object
- }
- b(y)
- }
- }
- function m(a, b) {
- b(a);
- if (void 0 !== a.children) for (var c in a.children) m(a.children[c],
- b)
- }
- var l = this,
- p = THREE.Loader.prototype.extractUrlBase(c),
- t, s, q, n, u, r, v, z, G, w, y, E = [],
- A = a,
- K;
- for (K in this.geometryHandlers) a = this.geometryHandlers[K].loaderClass, this.geometryHandlers[K].loaderObject = new a;
- for (K in this.hierarchyHandlers) a = this.hierarchyHandlers[K].loaderClass, this.hierarchyHandlers[K].loaderObject = new a;
- z = v = 0;
- y = {
- scene: new THREE.Scene,
- geometries: {},
- face_materials: {},
- materials: {},
- textures: {},
- objects: {},
- cameras: {},
- lights: {},
- fogs: {},
- empties: {},
- groups: {}
- };
- if (A.transform && (K = A.transform.position,
- a = A.transform.rotation, c = A.transform.scale, K && y.scene.position.fromArray(K), a && y.scene.rotation.fromArray(a), c && y.scene.scale.fromArray(c), K || a || c)) y.scene.updateMatrix(), y.scene.updateMatrixWorld();
- K = function(a) {
- return function() {
- z -= a;
- k();
- l.onLoadComplete()
- }
- };
- for (var D in A.fogs) a = A.fogs[D], "linear" === a.type ? n = new THREE.Fog(0, a.near, a.far) : "exp2" === a.type && (n = new THREE.FogExp2(0, a.density)), a = a.color, n.color.setRGB(a[0], a[1], a[2]), y.fogs[D] = n;
- for (var F in A.geometries) n = A.geometries[F], n.type in this.geometryHandlers && (v += 1, l.onLoadStart());
- for (var O in A.objects) m(A.objects[O], function(a) {
- a.type && a.type in l.hierarchyHandlers && (v += 1, l.onLoadStart())
- });
- G = v;
- for (F in A.geometries) if (n = A.geometries[F], "cube" === n.type) t = new THREE.CubeGeometry(n.width, n.height, n.depth, n.widthSegments, n.heightSegments, n.depthSegments), t.name = F, y.geometries[F] = t;
- else if ("plane" === n.type) t = new THREE.PlaneGeometry(n.width, n.height, n.widthSegments, n.heightSegments), t.name = F, y.geometries[F] = t;
- else if ("sphere" === n.type) t = new THREE.SphereGeometry(n.radius, n.widthSegments, n.heightSegments), t.name = F, y.geometries[F] = t;
- else if ("cylinder" === n.type) t = new THREE.CylinderGeometry(n.topRad, n.botRad, n.height, n.radSegs, n.heightSegs), t.name = F, y.geometries[F] = t;
- else if ("torus" === n.type) t = new THREE.TorusGeometry(n.radius, n.tube, n.segmentsR, n.segmentsT), t.name = F, y.geometries[F] = t;
- else if ("icosahedron" === n.type) t = new THREE.IcosahedronGeometry(n.radius, n.subdivisions), t.name = F, y.geometries[F] = t;
- else if (n.type in this.geometryHandlers) {
- O = {};
- for (u in n) "type" !== u && "url" !== u && (O[u] = n[u]);
- this.geometryHandlers[n.type].loaderObject.load(d(n.url, A.urlBaseType), h(F), O)
- } else "embedded" === n.type && (O = A.embeds[n.id], O.metadata = A.metadata, O && (O = this.geometryHandlers.ascii.loaderObject.parse(O, ""), i(F)(O.geometry, O.materials)));
- for (var x in A.textures) if (F = A.textures[x], F.url instanceof Array) {
- z += F.url.length;
- for (u = 0; u < F.url.length; u++) l.onLoadStart()
- } else z += 1, l.onLoadStart();
- w = z;
- for (x in A.textures) {
- F = A.textures[x];
- void 0 !== F.mapping && void 0 !== THREE[F.mapping] && (F.mapping = new THREE[F.mapping]);
- if (F.url instanceof Array) {
- O = F.url.length;
- n = [];
- for (u = 0; u < O; u++) n[u] = d(F.url[u], A.urlBaseType);
- u = (u = /\.dds$/i.test(n[0])) ? THREE.ImageUtils.loadCompressedTextureCube(n, F.mapping, K(O)) : THREE.ImageUtils.loadTextureCube(n, F.mapping, K(O))
- } else u = /\.dds$/i.test(F.url), O = d(F.url, A.urlBaseType), n = K(1), u = u ? THREE.ImageUtils.loadCompressedTexture(O, F.mapping, n) : THREE.ImageUtils.loadTexture(O, F.mapping, n), void 0 !== THREE[F.minFilter] && (u.minFilter = THREE[F.minFilter]),
- void 0 !== THREE[F.magFilter] && (u.magFilter = THREE[F.magFilter]), F.anisotropy && (u.anisotropy = F.anisotropy), F.repeat && (u.repeat.set(F.repeat[0], F.repeat[1]), 1 !== F.repeat[0] && (u.wrapS = THREE.RepeatWrapping), 1 !== F.repeat[1] && (u.wrapT = THREE.RepeatWrapping)), F.offset && u.offset.set(F.offset[0], F.offset[1]), F.wrap && (O = {
- repeat: THREE.RepeatWrapping,
- mirror: THREE.MirroredRepeatWrapping
- }, void 0 !== O[F.wrap[0]] && (u.wrapS = O[F.wrap[0]]), void 0 !== O[F.wrap[1]] && (u.wrapT = O[F.wrap[1]]));
- y.textures[x] = u
- }
- var I, B;
- for (I in A.materials) {
- x = A.materials[I];
- for (B in x.parameters) "envMap" === B || "map" === B || "lightMap" === B || "bumpMap" === B ? x.parameters[B] = y.textures[x.parameters[B]] : "shading" === B ? x.parameters[B] = "flat" === x.parameters[B] ? THREE.FlatShading : THREE.SmoothShading : "side" === B ? x.parameters[B] = "double" == x.parameters[B] ? THREE.DoubleSide : "back" == x.parameters[B] ? THREE.BackSide : THREE.FrontSide : "blending" === B ? x.parameters[B] = x.parameters[B] in THREE ? THREE[x.parameters[B]] : THREE.NormalBlending : "combine" === B ? x.parameters[B] = x.parameters[B] in THREE ? THREE[x.parameters[B]] : THREE.MultiplyOperation : "vertexColors" === B ? "face" == x.parameters[B] ? x.parameters[B] = THREE.FaceColors : x.parameters[B] && (x.parameters[B] = THREE.VertexColors) : "wrapRGB" === B && (K = x.parameters[B], x.parameters[B] = new THREE.Vector3(K[0], K[1], K[2]));
- void 0 !== x.parameters.opacity && 1 > x.parameters.opacity && (x.parameters.transparent = !0);
- x.parameters.normalMap ? (K = THREE.ShaderLib.normalmap, F = THREE.UniformsUtils.clone(K.uniforms), u = x.parameters.color, O = x.parameters.specular, n = x.parameters.ambient,
- D = x.parameters.shininess, F.tNormal.value = y.textures[x.parameters.normalMap], x.parameters.normalScale && F.uNormalScale.value.set(x.parameters.normalScale[0], x.parameters.normalScale[1]), x.parameters.map && (F.tDiffuse.value = x.parameters.map, F.enableDiffuse.value = !0), x.parameters.envMap && (F.tCube.value = x.parameters.envMap, F.enableReflection.value = !0, F.uReflectivity.value = x.parameters.reflectivity), x.parameters.lightMap && (F.tAO.value = x.parameters.lightMap, F.enableAO.value = !0), x.parameters.specularMap && (F.tSpecular.value = y.textures[x.parameters.specularMap], F.enableSpecular.value = !0), x.parameters.displacementMap && (F.tDisplacement.value = y.textures[x.parameters.displacementMap], F.enableDisplacement.value = !0, F.uDisplacementBias.value = x.parameters.displacementBias, F.uDisplacementScale.value = x.parameters.displacementScale), F.uDiffuseColor.value.setHex(u), F.uSpecularColor.value.setHex(O), F.uAmbientColor.value.setHex(n), F.uShininess.value = D, x.parameters.opacity && (F.uOpacity.value = x.parameters.opacity),
- s = new THREE.ShaderMaterial({
- fragmentShader: K.fragmentShader,
- vertexShader: K.vertexShader,
- uniforms: F,
- lights: !0,
- fog: !0
- })) : s = new THREE[x.type](x.parameters);
- s.name = I;
- y.materials[I] = s
- }
- for (I in A.materials) if (x = A.materials[I], x.parameters.materials) {
- B = [];
- for (u = 0; u < x.parameters.materials.length; u++) B.push(y.materials[x.parameters.materials[u]]);
- y.materials[I].materials = B
- }
- e();
- y.cameras && A.defaults.camera && (y.currentCamera = y.cameras[A.defaults.camera]);
- y.fogs && A.defaults.fog && (y.scene.fog = y.fogs[A.defaults.fog]);
- l.callbackSync(y);
- k()
- }
-};
-THREE.TextureLoader = function(a) {
- this.manager = void 0 !== a ? a : THREE.DefaultLoadingManager
-};
-THREE.TextureLoader.prototype = {
- constructor: THREE.TextureLoader,
- load: function(a, b) {
- var c = new THREE.ImageLoader(this.manager);
- c.setCrossOrigin(this.crossOrigin);
- c.load(a, function(a) {
- a = new THREE.Texture(a);
- a.needsUpdate = !0;
- void 0 !== b && b(a)
- })
- },
- setCrossOrigin: function(a) {
- this.crossOrigin = a
- }
-};
-THREE.Material = function() {
- this.id = THREE.MaterialIdCount++;
- this.uuid = THREE.Math.generateUUID();
- this.name = "";
- this.side = THREE.FrontSide;
- this.opacity = 1;
- this.transparent = !1;
- this.blending = THREE.NormalBlending;
- this.blendSrc = THREE.SrcAlphaFactor;
- this.blendDst = THREE.OneMinusSrcAlphaFactor;
- this.blendEquation = THREE.AddEquation;
- this.depthWrite = this.depthTest = !0;
- this.polygonOffset = !1;
- this.overdraw = this.alphaTest = this.polygonOffsetUnits = this.polygonOffsetFactor = 0;
- this.needsUpdate = this.visible = !0
-};
-THREE.Material.prototype = {
- constructor: THREE.Material,
- setValues: function(a) {
- if (void 0 !== a) for (var b in a) {
- var c = a[b];
- if (void 0 === c) console.warn("THREE.Material: '" + b + "' parameter is undefined.");
- else if (b in this) {
- var d = this[b];
- d instanceof THREE.Color ? d.set(c) : d instanceof THREE.Vector3 && c instanceof THREE.Vector3 ? d.copy(c) : this[b] = "overdraw" == b ? Number(c) : c
- }
- }
- },
- clone: function(a) {
- void 0 === a && (a = new THREE.Material);
- a.name = this.name;
- a.side = this.side;
- a.opacity = this.opacity;
- a.transparent = this.transparent;
- a.blending = this.blending;
- a.blendSrc = this.blendSrc;
- a.blendDst = this.blendDst;
- a.blendEquation = this.blendEquation;
- a.depthTest = this.depthTest;
- a.depthWrite = this.depthWrite;
- a.polygonOffset = this.polygonOffset;
- a.polygonOffsetFactor = this.polygonOffsetFactor;
- a.polygonOffsetUnits = this.polygonOffsetUnits;
- a.alphaTest = this.alphaTest;
- a.overdraw = this.overdraw;
- a.visible = this.visible;
- return a
- },
- dispose: function() {
- this.dispatchEvent({
- type: "dispose"
- })
- }
-};
-THREE.EventDispatcher.prototype.apply(THREE.Material.prototype);
-THREE.MaterialIdCount = 0;
-THREE.LineBasicMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.linewidth = 1;
- this.linejoin = this.linecap = "round";
- this.vertexColors = !1;
- this.fog = !0;
- this.setValues(a)
-};
-THREE.LineBasicMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.LineBasicMaterial.prototype.clone = function() {
- var a = new THREE.LineBasicMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.linewidth = this.linewidth;
- a.linecap = this.linecap;
- a.linejoin = this.linejoin;
- a.vertexColors = this.vertexColors;
- a.fog = this.fog;
- return a
-};
-THREE.LineDashedMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.scale = this.linewidth = 1;
- this.dashSize = 3;
- this.gapSize = 1;
- this.vertexColors = !1;
- this.fog = !0;
- this.setValues(a)
-};
-THREE.LineDashedMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.LineDashedMaterial.prototype.clone = function() {
- var a = new THREE.LineDashedMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.linewidth = this.linewidth;
- a.scale = this.scale;
- a.dashSize = this.dashSize;
- a.gapSize = this.gapSize;
- a.vertexColors = this.vertexColors;
- a.fog = this.fog;
- return a
-};
-THREE.MeshBasicMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.envMap = this.specularMap = this.lightMap = this.map = null;
- this.combine = THREE.MultiplyOperation;
- this.reflectivity = 1;
- this.refractionRatio = 0.98;
- this.fog = !0;
- this.shading = THREE.SmoothShading;
- this.wireframe = !1;
- this.wireframeLinewidth = 1;
- this.wireframeLinejoin = this.wireframeLinecap = "round";
- this.vertexColors = THREE.NoColors;
- this.morphTargets = this.skinning = !1;
- this.setValues(a)
-};
-THREE.MeshBasicMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.MeshBasicMaterial.prototype.clone = function() {
- var a = new THREE.MeshBasicMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.map = this.map;
- a.lightMap = this.lightMap;
- a.specularMap = this.specularMap;
- a.envMap = this.envMap;
- a.combine = this.combine;
- a.reflectivity = this.reflectivity;
- a.refractionRatio = this.refractionRatio;
- a.fog = this.fog;
- a.shading = this.shading;
- a.wireframe = this.wireframe;
- a.wireframeLinewidth = this.wireframeLinewidth;
- a.wireframeLinecap = this.wireframeLinecap;
- a.wireframeLinejoin = this.wireframeLinejoin;
- a.vertexColors = this.vertexColors;
- a.skinning = this.skinning;
- a.morphTargets = this.morphTargets;
- return a
-};
-THREE.MeshLambertMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.ambient = new THREE.Color(16777215);
- this.emissive = new THREE.Color(0);
- this.wrapAround = !1;
- this.wrapRGB = new THREE.Vector3(1, 1, 1);
- this.envMap = this.specularMap = this.lightMap = this.map = null;
- this.combine = THREE.MultiplyOperation;
- this.reflectivity = 1;
- this.refractionRatio = 0.98;
- this.fog = !0;
- this.shading = THREE.SmoothShading;
- this.wireframe = !1;
- this.wireframeLinewidth = 1;
- this.wireframeLinejoin = this.wireframeLinecap = "round";
- this.vertexColors = THREE.NoColors;
- this.morphNormals = this.morphTargets = this.skinning = !1;
- this.setValues(a)
-};
-THREE.MeshLambertMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.MeshLambertMaterial.prototype.clone = function() {
- var a = new THREE.MeshLambertMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.ambient.copy(this.ambient);
- a.emissive.copy(this.emissive);
- a.wrapAround = this.wrapAround;
- a.wrapRGB.copy(this.wrapRGB);
- a.map = this.map;
- a.lightMap = this.lightMap;
- a.specularMap = this.specularMap;
- a.envMap = this.envMap;
- a.combine = this.combine;
- a.reflectivity = this.reflectivity;
- a.refractionRatio = this.refractionRatio;
- a.fog = this.fog;
- a.shading = this.shading;
- a.wireframe = this.wireframe;
- a.wireframeLinewidth = this.wireframeLinewidth;
- a.wireframeLinecap = this.wireframeLinecap;
- a.wireframeLinejoin = this.wireframeLinejoin;
- a.vertexColors = this.vertexColors;
- a.skinning = this.skinning;
- a.morphTargets = this.morphTargets;
- a.morphNormals = this.morphNormals;
- return a
-};
-THREE.MeshPhongMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.ambient = new THREE.Color(16777215);
- this.emissive = new THREE.Color(0);
- this.specular = new THREE.Color(1118481);
- this.shininess = 30;
- this.metal = !1;
- this.perPixel = !0;
- this.wrapAround = !1;
- this.wrapRGB = new THREE.Vector3(1, 1, 1);
- this.bumpMap = this.lightMap = this.map = null;
- this.bumpScale = 1;
- this.normalMap = null;
- this.normalScale = new THREE.Vector2(1, 1);
- this.envMap = this.specularMap = null;
- this.combine = THREE.MultiplyOperation;
- this.reflectivity = 1;
- this.refractionRatio = 0.98;
- this.fog = !0;
- this.shading = THREE.SmoothShading;
- this.wireframe = !1;
- this.wireframeLinewidth = 1;
- this.wireframeLinejoin = this.wireframeLinecap = "round";
- this.vertexColors = THREE.NoColors;
- this.morphNormals = this.morphTargets = this.skinning = !1;
- this.setValues(a)
-};
-THREE.MeshPhongMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.MeshPhongMaterial.prototype.clone = function() {
- var a = new THREE.MeshPhongMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.ambient.copy(this.ambient);
- a.emissive.copy(this.emissive);
- a.specular.copy(this.specular);
- a.shininess = this.shininess;
- a.metal = this.metal;
- a.perPixel = this.perPixel;
- a.wrapAround = this.wrapAround;
- a.wrapRGB.copy(this.wrapRGB);
- a.map = this.map;
- a.lightMap = this.lightMap;
- a.bumpMap = this.bumpMap;
- a.bumpScale = this.bumpScale;
- a.normalMap = this.normalMap;
- a.normalScale.copy(this.normalScale);
- a.specularMap = this.specularMap;
- a.envMap = this.envMap;
- a.combine = this.combine;
- a.reflectivity = this.reflectivity;
- a.refractionRatio = this.refractionRatio;
- a.fog = this.fog;
- a.shading = this.shading;
- a.wireframe = this.wireframe;
- a.wireframeLinewidth = this.wireframeLinewidth;
- a.wireframeLinecap = this.wireframeLinecap;
- a.wireframeLinejoin = this.wireframeLinejoin;
- a.vertexColors = this.vertexColors;
- a.skinning = this.skinning;
- a.morphTargets = this.morphTargets;
- a.morphNormals = this.morphNormals;
- return a
-};
-THREE.MeshDepthMaterial = function(a) {
- THREE.Material.call(this);
- this.wireframe = !1;
- this.wireframeLinewidth = 1;
- this.setValues(a)
-};
-THREE.MeshDepthMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.MeshDepthMaterial.prototype.clone = function() {
- var a = new THREE.MeshDepthMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.wireframe = this.wireframe;
- a.wireframeLinewidth = this.wireframeLinewidth;
- return a
-};
-THREE.MeshNormalMaterial = function(a) {
- THREE.Material.call(this, a);
- this.shading = THREE.FlatShading;
- this.wireframe = !1;
- this.wireframeLinewidth = 1;
- this.morphTargets = !1;
- this.setValues(a)
-};
-THREE.MeshNormalMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.MeshNormalMaterial.prototype.clone = function() {
- var a = new THREE.MeshNormalMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.shading = this.shading;
- a.wireframe = this.wireframe;
- a.wireframeLinewidth = this.wireframeLinewidth;
- return a
-};
-THREE.MeshFaceMaterial = function(a) {
- this.materials = a instanceof Array ? a : []
-};
-THREE.MeshFaceMaterial.prototype.clone = function() {
- for (var a = new THREE.MeshFaceMaterial, b = 0; b < this.materials.length; b++) a.materials.push(this.materials[b].clone());
- return a
-};
-THREE.ParticleSystemMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.map = null;
- this.size = 1;
- this.sizeAttenuation = !0;
- this.vertexColors = !1;
- this.fog = !0;
- this.setValues(a)
-};
-THREE.ParticleSystemMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.ParticleSystemMaterial.prototype.clone = function() {
- var a = new THREE.ParticleSystemMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.map = this.map;
- a.size = this.size;
- a.sizeAttenuation = this.sizeAttenuation;
- a.vertexColors = this.vertexColors;
- a.fog = this.fog;
- return a
-};
-THREE.ParticleBasicMaterial = THREE.ParticleSystemMaterial;
-THREE.ShaderMaterial = function(a) {
- THREE.Material.call(this);
- this.vertexShader = this.fragmentShader = "void main() {}";
- this.uniforms = {};
- this.defines = {};
- this.attributes = null;
- this.shading = THREE.SmoothShading;
- this.linewidth = 1;
- this.wireframe = !1;
- this.wireframeLinewidth = 1;
- this.lights = this.fog = !1;
- this.vertexColors = THREE.NoColors;
- this.morphNormals = this.morphTargets = this.skinning = !1;
- this.defaultAttributeValues = {
- color: [1, 1, 1],
- uv: [0, 0],
- uv2: [0, 0]
- };
- this.index0AttributeName = "position";
- this.setValues(a)
-};
-THREE.ShaderMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.ShaderMaterial.prototype.clone = function() {
- var a = new THREE.ShaderMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.fragmentShader = this.fragmentShader;
- a.vertexShader = this.vertexShader;
- a.uniforms = THREE.UniformsUtils.clone(this.uniforms);
- a.attributes = this.attributes;
- a.defines = this.defines;
- a.shading = this.shading;
- a.wireframe = this.wireframe;
- a.wireframeLinewidth = this.wireframeLinewidth;
- a.fog = this.fog;
- a.lights = this.lights;
- a.vertexColors = this.vertexColors;
- a.skinning = this.skinning;
- a.morphTargets = this.morphTargets;
- a.morphNormals = this.morphNormals;
- return a
-};
-THREE.SpriteMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.map = null;
- this.rotation = 0;
- this.fog = !1;
- this.uvOffset = new THREE.Vector2(0, 0);
- this.uvScale = new THREE.Vector2(1, 1);
- this.setValues(a)
-};
-THREE.SpriteMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.SpriteMaterial.prototype.clone = function() {
- var a = new THREE.SpriteMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.map = this.map;
- a.rotation = this.rotation;
- a.uvOffset.copy(this.uvOffset);
- a.uvScale.copy(this.uvScale);
- a.fog = this.fog;
- return a
-};
-THREE.SpriteCanvasMaterial = function(a) {
- THREE.Material.call(this);
- this.color = new THREE.Color(16777215);
- this.program = function() {};
- this.setValues(a)
-};
-THREE.SpriteCanvasMaterial.prototype = Object.create(THREE.Material.prototype);
-THREE.SpriteCanvasMaterial.prototype.clone = function() {
- var a = new THREE.SpriteCanvasMaterial;
- THREE.Material.prototype.clone.call(this, a);
- a.color.copy(this.color);
- a.program = this.program;
- return a
-};
-THREE.ParticleCanvasMaterial = THREE.SpriteCanvasMaterial;
-THREE.Texture = function(a, b, c, d, e, f, h, g, i) {
- this.id = THREE.TextureIdCount++;
- this.uuid = THREE.Math.generateUUID();
- this.name = "";
- this.image = a;
- this.mipmaps = [];
- this.mapping = void 0 !== b ? b : new THREE.UVMapping;
- this.wrapS = void 0 !== c ? c : THREE.ClampToEdgeWrapping;
- this.wrapT = void 0 !== d ? d : THREE.ClampToEdgeWrapping;
- this.magFilter = void 0 !== e ? e : THREE.LinearFilter;
- this.minFilter = void 0 !== f ? f : THREE.LinearMipMapLinearFilter;
- this.anisotropy = void 0 !== i ? i : 1;
- this.format = void 0 !== h ? h : THREE.RGBAFormat;
- this.type = void 0 !== g ? g : THREE.UnsignedByteType;
- this.offset = new THREE.Vector2(0, 0);
- this.repeat = new THREE.Vector2(1, 1);
- this.generateMipmaps = !0;
- this.premultiplyAlpha = !1;
- this.flipY = !0;
- this.unpackAlignment = 4;
- this.needsUpdate = !1;
- this.onUpdate = null
-};
-THREE.Texture.prototype = {
- constructor: THREE.Texture,
- clone: function(a) {
- void 0 === a && (a = new THREE.Texture);
- a.image = this.image;
- a.mipmaps = this.mipmaps.slice(0);
- a.mapping = this.mapping;
- a.wrapS = this.wrapS;
- a.wrapT = this.wrapT;
- a.magFilter = this.magFilter;
- a.minFilter = this.minFilter;
- a.anisotropy = this.anisotropy;
- a.format = this.format;
- a.type = this.type;
- a.offset.copy(this.offset);
- a.repeat.copy(this.repeat);
- a.generateMipmaps = this.generateMipmaps;
- a.premultiplyAlpha = this.premultiplyAlpha;
- a.flipY = this.flipY;
- a.unpackAlignment = this.unpackAlignment;
- return a
- },
- dispose: function() {
- this.dispatchEvent({
- type: "dispose"
- })
- }
-};
-THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype);
-THREE.TextureIdCount = 0;
-THREE.CompressedTexture = function(a, b, c, d, e, f, h, g, i, k, m) {
- THREE.Texture.call(this, null, f, h, g, i, k, d, e, m);
- this.image = {
- width: b,
- height: c
- };
- this.mipmaps = a;
- this.generateMipmaps = !1
-};
-THREE.CompressedTexture.prototype = Object.create(THREE.Texture.prototype);
-THREE.CompressedTexture.prototype.clone = function() {
- var a = new THREE.CompressedTexture;
- THREE.Texture.prototype.clone.call(this, a);
- return a
-};
-THREE.DataTexture = function(a, b, c, d, e, f, h, g, i, k, m) {
- THREE.Texture.call(this, null, f, h, g, i, k, d, e, m);
- this.image = {
- data: a,
- width: b,
- height: c
- }
-};
-THREE.DataTexture.prototype = Object.create(THREE.Texture.prototype);
-THREE.DataTexture.prototype.clone = function() {
- var a = new THREE.DataTexture;
- THREE.Texture.prototype.clone.call(this, a);
- return a
-};
-THREE.ParticleSystem = function(a, b) {
- THREE.Object3D.call(this);
- this.geometry = void 0 !== a ? a : new THREE.Geometry;
- this.material = void 0 !== b ? b : new THREE.ParticleSystemMaterial({
- color: 16777215 * Math.random()
- });
- this.frustumCulled = this.sortParticles = !1
-};
-THREE.ParticleSystem.prototype = Object.create(THREE.Object3D.prototype);
-THREE.ParticleSystem.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.ParticleSystem(this.geometry, this.material));
- a.sortParticles = this.sortParticles;
- THREE.Object3D.prototype.clone.call(this, a);
- return a
-};
-THREE.Line = function(a, b, c) {
- THREE.Object3D.call(this);
- this.geometry = void 0 !== a ? a : new THREE.Geometry;
- this.material = void 0 !== b ? b : new THREE.LineBasicMaterial({
- color: 16777215 * Math.random()
- });
- this.type = void 0 !== c ? c : THREE.LineStrip
-};
-THREE.LineStrip = 0;
-THREE.LinePieces = 1;
-THREE.Line.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Line.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.Line(this.geometry, this.material, this.type));
- THREE.Object3D.prototype.clone.call(this, a);
- return a
-};
-THREE.Mesh = function(a, b) {
- THREE.Object3D.call(this);
- this.geometry = void 0 !== a ? a : new THREE.Geometry;
- this.material = void 0 !== b ? b : new THREE.MeshBasicMaterial({
- color: 16777215 * Math.random()
- });
- this.updateMorphTargets()
-};
-THREE.Mesh.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Mesh.prototype.updateMorphTargets = function() {
- if (0 < this.geometry.morphTargets.length) {
- this.morphTargetBase = -1;
- this.morphTargetForcedOrder = [];
- this.morphTargetInfluences = [];
- this.morphTargetDictionary = {};
- for (var a = 0, b = this.geometry.morphTargets.length; a < b; a++) this.morphTargetInfluences.push(0), this.morphTargetDictionary[this.geometry.morphTargets[a].name] = a
- }
-};
-THREE.Mesh.prototype.getMorphTargetIndexByName = function(a) {
- if (void 0 !== this.morphTargetDictionary[a]) return this.morphTargetDictionary[a];
- console.log("THREE.Mesh.getMorphTargetIndexByName: morph target " + a + " does not exist. Returning 0.");
- return 0
-};
-THREE.Mesh.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.Mesh(this.geometry, this.material));
- THREE.Object3D.prototype.clone.call(this, a);
- return a
-};
-THREE.Bone = function(a) {
- THREE.Object3D.call(this);
- this.skin = a;
- this.skinMatrix = new THREE.Matrix4
-};
-THREE.Bone.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Bone.prototype.update = function(a, b) {
- this.matrixAutoUpdate && (b |= this.updateMatrix());
- if (b || this.matrixWorldNeedsUpdate) a ? this.skinMatrix.multiplyMatrices(a, this.matrix) : this.skinMatrix.copy(this.matrix), this.matrixWorldNeedsUpdate = !1, b = !0;
- var c, d = this.children.length;
- for (c = 0; c < d; c++) this.children[c].update(this.skinMatrix, b)
-};
-THREE.SkinnedMesh = function(a, b, c) {
- THREE.Mesh.call(this, a, b);
- this.useVertexTexture = void 0 !== c ? c : !0;
- this.identityMatrix = new THREE.Matrix4;
- this.bones = [];
- this.boneMatrices = [];
- var d, e, f;
- if (this.geometry && void 0 !== this.geometry.bones) {
- for (a = 0; a < this.geometry.bones.length; a++) c = this.geometry.bones[a], d = c.pos, e = c.rotq, f = c.scl, b = this.addBone(), b.name = c.name, b.position.set(d[0], d[1], d[2]), b.quaternion.set(e[0], e[1], e[2], e[3]), void 0 !== f ? b.scale.set(f[0], f[1], f[2]) : b.scale.set(1, 1, 1);
- for (a = 0; a < this.bones.length; a++) c = this.geometry.bones[a], b = this.bones[a], - 1 === c.parent ? this.add(b) : this.bones[c.parent].add(b);
- a = this.bones.length;
- this.useVertexTexture ? (this.boneTextureHeight = this.boneTextureWidth = a = 256 < a ? 64 : 64 < a ? 32 : 16 < a ? 16 : 8, this.boneMatrices = new Float32Array(4 * this.boneTextureWidth * this.boneTextureHeight), this.boneTexture = new THREE.DataTexture(this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType), this.boneTexture.minFilter = THREE.NearestFilter, this.boneTexture.magFilter = THREE.NearestFilter, this.boneTexture.generateMipmaps = !1, this.boneTexture.flipY = !1) : this.boneMatrices = new Float32Array(16 * a);
- this.pose()
- }
-};
-THREE.SkinnedMesh.prototype = Object.create(THREE.Mesh.prototype);
-THREE.SkinnedMesh.prototype.addBone = function(a) {
- void 0 === a && (a = new THREE.Bone(this));
- this.bones.push(a);
- return a
-};
-THREE.SkinnedMesh.prototype.updateMatrixWorld = function() {
- var a = new THREE.Matrix4;
- return function(b) {
- this.matrixAutoUpdate && this.updateMatrix();
- if (this.matrixWorldNeedsUpdate || b) this.parent ? this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix) : this.matrixWorld.copy(this.matrix), this.matrixWorldNeedsUpdate = !1;
- for (var b = 0, c = this.children.length; b < c; b++) {
- var d = this.children[b];
- d instanceof THREE.Bone ? d.update(this.identityMatrix, !1) : d.updateMatrixWorld(!0)
- }
- if (void 0 == this.boneInverses) {
- this.boneInverses = [];
- b = 0;
- for (c = this.bones.length; b < c; b++) d = new THREE.Matrix4, d.getInverse(this.bones[b].skinMatrix), this.boneInverses.push(d)
- }
- b = 0;
- for (c = this.bones.length; b < c; b++) a.multiplyMatrices(this.bones[b].skinMatrix, this.boneInverses[b]), a.flattenToArrayOffset(this.boneMatrices, 16 * b);
- this.useVertexTexture && (this.boneTexture.needsUpdate = !0)
- }
-}();
-THREE.SkinnedMesh.prototype.pose = function() {
- this.updateMatrixWorld(!0);
- this.normalizeSkinWeights()
-};
-THREE.SkinnedMesh.prototype.normalizeSkinWeights = function() {
- if (this.geometry instanceof THREE.Geometry) for (var a = 0; a < this.geometry.skinIndices.length; a++) {
- var b = this.geometry.skinWeights[a],
- c = 1 / b.lengthManhattan();
- Infinity !== c ? b.multiplyScalar(c) : b.set(1)
- }
-};
-THREE.SkinnedMesh.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.SkinnedMesh(this.geometry, this.material, this.useVertexTexture));
- THREE.Mesh.prototype.clone.call(this, a);
- return a
-};
-THREE.MorphAnimMesh = function(a, b) {
- THREE.Mesh.call(this, a, b);
- this.duration = 1E3;
- this.mirroredLoop = !1;
- this.currentKeyframe = this.lastKeyframe = this.time = 0;
- this.direction = 1;
- this.directionBackwards = !1;
- this.setFrameRange(0, this.geometry.morphTargets.length - 1)
-};
-THREE.MorphAnimMesh.prototype = Object.create(THREE.Mesh.prototype);
-THREE.MorphAnimMesh.prototype.setFrameRange = function(a, b) {
- this.startKeyframe = a;
- this.endKeyframe = b;
- this.length = this.endKeyframe - this.startKeyframe + 1
-};
-THREE.MorphAnimMesh.prototype.setDirectionForward = function() {
- this.direction = 1;
- this.directionBackwards = !1
-};
-THREE.MorphAnimMesh.prototype.setDirectionBackward = function() {
- this.direction = -1;
- this.directionBackwards = !0
-};
-THREE.MorphAnimMesh.prototype.parseAnimations = function() {
- var a = this.geometry;
- a.animations || (a.animations = {});
- for (var b, c = a.animations, d = /([a-z]+)(\d+)/, e = 0, f = a.morphTargets.length; e < f; e++) {
- var h = a.morphTargets[e].name.match(d);
- if (h && 1 < h.length) {
- h = h[1];
- c[h] || (c[h] = {
- start: Infinity,
- end: -Infinity
- });
- var g = c[h];
- e < g.start && (g.start = e);
- e > g.end && (g.end = e);
- b || (b = h)
- }
- }
- a.firstAnimation = b
-};
-THREE.MorphAnimMesh.prototype.setAnimationLabel = function(a, b, c) {
- this.geometry.animations || (this.geometry.animations = {});
- this.geometry.animations[a] = {
- start: b,
- end: c
- }
-};
-THREE.MorphAnimMesh.prototype.playAnimation = function(a, b) {
- var c = this.geometry.animations[a];
- c ? (this.setFrameRange(c.start, c.end), this.duration = 1E3 * ((c.end - c.start) / b), this.time = 0) : console.warn("animation[" + a + "] undefined")
-};
-THREE.MorphAnimMesh.prototype.updateAnimation = function(a) {
- var b = this.duration / this.length;
- this.time += this.direction * a;
- if (this.mirroredLoop) {
- if (this.time > this.duration || 0 > this.time) this.direction *= -1, this.time > this.duration && (this.time = this.duration, this.directionBackwards = !0), 0 > this.time && (this.time = 0, this.directionBackwards = !1)
- } else this.time %= this.duration, 0 > this.time && (this.time += this.duration);
- a = this.startKeyframe + THREE.Math.clamp(Math.floor(this.time / b), 0, this.length - 1);
- a !== this.currentKeyframe && (this.morphTargetInfluences[this.lastKeyframe] = 0, this.morphTargetInfluences[this.currentKeyframe] = 1, this.morphTargetInfluences[a] = 0, this.lastKeyframe = this.currentKeyframe, this.currentKeyframe = a);
- b = this.time % b / b;
- this.directionBackwards && (b = 1 - b);
- this.morphTargetInfluences[this.currentKeyframe] = b;
- this.morphTargetInfluences[this.lastKeyframe] = 1 - b
-};
-THREE.MorphAnimMesh.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.MorphAnimMesh(this.geometry, this.material));
- a.duration = this.duration;
- a.mirroredLoop = this.mirroredLoop;
- a.time = this.time;
- a.lastKeyframe = this.lastKeyframe;
- a.currentKeyframe = this.currentKeyframe;
- a.direction = this.direction;
- a.directionBackwards = this.directionBackwards;
- THREE.Mesh.prototype.clone.call(this, a);
- return a
-};
-THREE.LOD = function() {
- THREE.Object3D.call(this);
- this.objects = []
-};
-THREE.LOD.prototype = Object.create(THREE.Object3D.prototype);
-THREE.LOD.prototype.addLevel = function(a, b) {
- void 0 === b && (b = 0);
- for (var b = Math.abs(b), c = 0; c < this.objects.length && !(b < this.objects[c].distance); c++);
- this.objects.splice(c, 0, {
- distance: b,
- object: a
- });
- this.add(a)
-};
-THREE.LOD.prototype.getObjectForDistance = function(a) {
- for (var b = 1, c = this.objects.length; b < c && !(a < this.objects[b].distance); b++);
- return this.objects[b - 1].object
-};
-THREE.LOD.prototype.update = function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function(c) {
- if (1 < this.objects.length) {
- a.setFromMatrixPosition(c.matrixWorld);
- b.setFromMatrixPosition(this.matrixWorld);
- c = a.distanceTo(b);
- this.objects[0].object.visible = !0;
- for (var d = 1, e = this.objects.length; d < e; d++) if (c >= this.objects[d].distance) this.objects[d - 1].object.visible = !1, this.objects[d].object.visible = !0;
- else break;
- for (; d < e; d++) this.objects[d].object.visible = !1
- }
- }
-}();
-THREE.LOD.prototype.clone = function() {};
-THREE.Sprite = function(a) {
- THREE.Object3D.call(this);
- this.material = void 0 !== a ? a : new THREE.SpriteMaterial
-};
-THREE.Sprite.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Sprite.prototype.updateMatrix = function() {
- this.matrix.compose(this.position, this.quaternion, this.scale);
- this.matrixWorldNeedsUpdate = !0
-};
-THREE.Sprite.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.Sprite(this.material));
- THREE.Object3D.prototype.clone.call(this, a);
- return a
-};
-THREE.Particle = THREE.Sprite;
-THREE.Scene = function() {
- THREE.Object3D.call(this);
- this.overrideMaterial = this.fog = null;
- this.autoUpdate = !0;
- this.matrixAutoUpdate = !1;
- this.__lights = [];
- this.__objectsAdded = [];
- this.__objectsRemoved = []
-};
-THREE.Scene.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Scene.prototype.__addObject = function(a) {
- if (a instanceof THREE.Light) - 1 === this.__lights.indexOf(a) && this.__lights.push(a), a.target && void 0 === a.target.parent && this.add(a.target);
- else if (!(a instanceof THREE.Camera || a instanceof THREE.Bone)) {
- this.__objectsAdded.push(a);
- var b = this.__objectsRemoved.indexOf(a); - 1 !== b && this.__objectsRemoved.splice(b, 1)
- }
- for (b = 0; b < a.children.length; b++) this.__addObject(a.children[b])
-};
-THREE.Scene.prototype.__removeObject = function(a) {
- if (a instanceof THREE.Light) {
- var b = this.__lights.indexOf(a); - 1 !== b && this.__lights.splice(b, 1);
- if (a.shadowCascadeArray) for (b = 0; b < a.shadowCascadeArray.length; b++) this.__removeObject(a.shadowCascadeArray[b])
- } else a instanceof THREE.Camera || (this.__objectsRemoved.push(a), b = this.__objectsAdded.indexOf(a), - 1 !== b && this.__objectsAdded.splice(b, 1));
- for (b = 0; b < a.children.length; b++) this.__removeObject(a.children[b])
-};
-THREE.Scene.prototype.clone = function(a) {
- void 0 === a && (a = new THREE.Scene);
- THREE.Object3D.prototype.clone.call(this, a);
- null !== this.fog && (a.fog = this.fog.clone());
- null !== this.overrideMaterial && (a.overrideMaterial = this.overrideMaterial.clone());
- a.autoUpdate = this.autoUpdate;
- a.matrixAutoUpdate = this.matrixAutoUpdate;
- return a
-};
-THREE.Fog = function(a, b, c) {
- this.name = "";
- this.color = new THREE.Color(a);
- this.near = void 0 !== b ? b : 1;
- this.far = void 0 !== c ? c : 1E3
-};
-THREE.Fog.prototype.clone = function() {
- return new THREE.Fog(this.color.getHex(), this.near, this.far)
-};
-THREE.FogExp2 = function(a, b) {
- this.name = "";
- this.color = new THREE.Color(a);
- this.density = void 0 !== b ? b : 2.5E-4
-};
-THREE.FogExp2.prototype.clone = function() {
- return new THREE.FogExp2(this.color.getHex(), this.density)
-};
-THREE.CanvasRenderer = function(a) {
- function b(a, b, c) {
- for (var d = 0, e = z.length; d < e; d++) {
- var f = z[d];
- Ka.copy(f.color);
- if (f instanceof THREE.DirectionalLight) {
- var h = ta.setFromMatrixPosition(f.matrixWorld).normalize(),
- g = b.dot(h);
- 0 >= g || (g *= f.intensity, c.add(Ka.multiplyScalar(g)))
- } else f instanceof THREE.PointLight && (h = ta.setFromMatrixPosition(f.matrixWorld), g = b.dot(ta.subVectors(h, a).normalize()), 0 >= g || (g *= 0 == f.distance ? 1 : 1 - Math.min(a.distanceTo(h) / f.distance, 1), 0 != g && (g *= f.intensity, c.add(Ka.multiplyScalar(g)))))
- }
- }
-
- function c(a, b, c, d) {
- m(b);
- l(c);
- p(d);
- t(a.getStyle());
- D.stroke();
- Ea.expandByScalar(2 * b)
- }
- function d(a) {
- s(a.getStyle());
- D.fill()
- }
- function e(a, b, c, e, f, h, g, j, i, k, m, l, n) {
- if (!(n instanceof THREE.DataTexture || void 0 === n.image || 0 === n.image.width)) {
- if (!0 === n.needsUpdate) {
- var p = n.wrapS === THREE.RepeatWrapping,
- q = n.wrapT === THREE.RepeatWrapping;
- Ga[n.id] = D.createPattern(n.image, !0 === p && !0 === q ? "repeat" : !0 === p && !1 === q ? "repeat-x" : !1 === p && !0 === q ? "repeat-y" : "no-repeat");
- n.needsUpdate = !1
- }
- void 0 === Ga[n.id] ? s("rgba(0,0,0,1)") : s(Ga[n.id]);
- var p = n.offset.x / n.repeat.x,
- q = n.offset.y / n.repeat.y,
- t = n.image.width * n.repeat.x,
- r = n.image.height * n.repeat.y,
- g = (g + p) * t,
- j = (1 - j + q) * r,
- c = c - a,
- e = e - b,
- f = f - a,
- h = h - b,
- i = (i + p) * t - g,
- k = (1 - k + q) * r - j,
- m = (m + p) * t - g,
- l = (1 - l + q) * r - j,
- p = i * l - m * k;
- 0 === p ? (void 0 === ka[n.id] && (b = document.createElement("canvas"), b.width = n.image.width, b.height = n.image.height, b = b.getContext("2d"), b.drawImage(n.image, 0, 0), ka[n.id] = b.getImageData(0, 0, n.image.width, n.image.height).data), b = ka[n.id], g = 4 * (Math.floor(g) + Math.floor(j) * n.image.width),
- V.setRGB(b[g] / 255, b[g + 1] / 255, b[g + 2] / 255), d(V)) : (p = 1 / p, n = (l * c - k * f) * p, k = (l * e - k * h) * p, c = (i * f - m * c) * p, e = (i * h - m * e) * p, a = a - n * g - c * j, g = b - k * g - e * j, D.save(), D.transform(n, k, c, e, a, g), D.fill(), D.restore())
- }
- }
- function f(a, b, c, d, e, f, h, g, j, i, k, m, n) {
- var l, p;
- l = n.width - 1;
- p = n.height - 1;
- h *= l;
- g *= p;
- c -= a;
- d -= b;
- e -= a;
- f -= b;
- j = j * l - h;
- i = i * p - g;
- k = k * l - h;
- m = m * p - g;
- p = 1 / (j * m - k * i);
- l = (m * c - i * e) * p;
- i = (m * d - i * f) * p;
- c = (j * e - k * c) * p;
- d = (j * f - k * d) * p;
- a = a - l * h - c * g;
- b = b - i * h - d * g;
- D.save();
- D.transform(l, i, c, d, a, b);
- D.clip();
- D.drawImage(n, 0, 0);
- D.restore()
- }
- function h(a,
- b, c, d) {
- ua[0] = 255 * a.r | 0;
- ua[1] = 255 * a.g | 0;
- ua[2] = 255 * a.b | 0;
- ua[4] = 255 * b.r | 0;
- ua[5] = 255 * b.g | 0;
- ua[6] = 255 * b.b | 0;
- ua[8] = 255 * c.r | 0;
- ua[9] = 255 * c.g | 0;
- ua[10] = 255 * c.b | 0;
- ua[12] = 255 * d.r | 0;
- ua[13] = 255 * d.g | 0;
- ua[14] = 255 * d.b | 0;
- j.putImageData(Oa, 0, 0);
- Fa.drawImage(Pa, 0, 0);
- return La
- }
- function g(a, b, c) {
- var d = b.x - a.x,
- e = b.y - a.y,
- f = d * d + e * e;
- 0 !== f && (c /= Math.sqrt(f), d *= c, e *= c, b.x += d, b.y += e, a.x -= d, a.y -= e)
- }
- function i(a) {
- x !== a && (x = D.globalAlpha = a)
- }
- function k(a) {
- I !== a && (a === THREE.NormalBlending ? D.globalCompositeOperation = "source-over" : a === THREE.AdditiveBlending ? D.globalCompositeOperation = "lighter" : a === THREE.SubtractiveBlending && (D.globalCompositeOperation = "darker"), I = a)
- }
- function m(a) {
- J !== a && (J = D.lineWidth = a)
- }
- function l(a) {
- ca !== a && (ca = D.lineCap = a)
- }
- function p(a) {
- na !== a && (na = D.lineJoin = a)
- }
- function t(a) {
- B !== a && (B = D.strokeStyle = a)
- }
- function s(a) {
- M !== a && (M = D.fillStyle = a)
- }
- function q(a, b) {
- if (pa !== a || C !== b) D.setLineDash([a, b]), pa = a, C = b
- }
- console.log("THREE.CanvasRenderer", THREE.REVISION);
- var n = THREE.Math.smoothstep,
- a = a || {}, u = this,
- r, v, z, G = new THREE.Projector,
- w = void 0 !== a.canvas ? a.canvas : document.createElement("canvas"),
- y = w.width,
- E = w.height,
- A = Math.floor(y / 2),
- K = Math.floor(E / 2),
- D = w.getContext("2d"),
- F = new THREE.Color(0),
- O = 0,
- x = 1,
- I = 0,
- B = null,
- M = null,
- J = null,
- ca = null,
- na = null,
- pa = null,
- C = 0,
- Q, R, L, da;
- new THREE.RenderableVertex;
- new THREE.RenderableVertex;
- var za, Ba, ba, Aa, $, ea, V = new THREE.Color,
- P = new THREE.Color,
- Y = new THREE.Color,
- U = new THREE.Color,
- ja = new THREE.Color,
- sa = new THREE.Color,
- ha = new THREE.Color,
- Ka = new THREE.Color,
- Ga = {}, ka = {}, Da, Ua, Qa, wa, bb,
- cb, Ma, fb, sb, pb, va = new THREE.Box2,
- la = new THREE.Box2,
- Ea = new THREE.Box2,
- gb = new THREE.Color,
- ra = new THREE.Color,
- fa = new THREE.Color,
- ta = new THREE.Vector3,
- Pa, j, Oa, ua, La, Fa, Ra = 16;
- Pa = document.createElement("canvas");
- Pa.width = Pa.height = 2;
- j = Pa.getContext("2d");
- j.fillStyle = "rgba(0,0,0,1)";
- j.fillRect(0, 0, 2, 2);
- Oa = j.getImageData(0, 0, 2, 2);
- ua = Oa.data;
- La = document.createElement("canvas");
- La.width = La.height = Ra;
- Fa = La.getContext("2d");
- Fa.translate(-Ra / 2, - Ra / 2);
- Fa.scale(Ra, Ra);
- Ra--;
- void 0 === D.setLineDash && (D.setLineDash = void 0 !== D.mozDash ? function(a) {
- D.mozDash = null !== a[0] ? a : null
- } : function() {});
- this.domElement = w;
- this.devicePixelRatio = void 0 !== a.devicePixelRatio ? a.devicePixelRatio : void 0 !== self.devicePixelRatio ? self.devicePixelRatio : 1;
- this.sortElements = this.sortObjects = this.autoClear = !0;
- this.info = {
- render: {
- vertices: 0,
- faces: 0
- }
- };
- this.supportsVertexTextures = function() {};
- this.setFaceCulling = function() {};
- this.setSize = function(a, b, c) {
- y = a * this.devicePixelRatio;
- E = b * this.devicePixelRatio;
- A = Math.floor(y / 2);
- K = Math.floor(E / 2);
- w.width = y;
- w.height = E;
- 1 !== this.devicePixelRatio && !1 !== c && (w.style.width = a + "px", w.style.height = b + "px");
- va.set(new THREE.Vector2(-A, - K), new THREE.Vector2(A, K));
- la.set(new THREE.Vector2(-A, - K), new THREE.Vector2(A, K));
- x = 1;
- I = 0;
- na = ca = J = M = B = null
- };
- this.setClearColor = function(a, b) {
- F.set(a);
- O = void 0 !== b ? b : 1;
- la.set(new THREE.Vector2(-A, - K), new THREE.Vector2(A, K))
- };
- this.setClearColorHex = function(a, b) {
- console.warn("DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.");
- this.setClearColor(a,
- b)
- };
- this.getMaxAnisotropy = function() {
- return 0
- };
- this.clear = function() {
- D.setTransform(1, 0, 0, - 1, A, K);
- !1 === la.empty() && (la.intersect(va), la.expandByScalar(2), 1 > O && D.clearRect(la.min.x | 0, la.min.y | 0, la.max.x - la.min.x | 0, la.max.y - la.min.y | 0), 0 < O && (k(THREE.NormalBlending), i(1), s("rgba(" + Math.floor(255 * F.r) + "," + Math.floor(255 * F.g) + "," + Math.floor(255 * F.b) + "," + O + ")"), D.fillRect(la.min.x | 0, la.min.y | 0, la.max.x - la.min.x | 0, la.max.y - la.min.y | 0)), la.makeEmpty())
- };
- this.clearColor = function() {};
- this.clearDepth = function() {};
- this.clearStencil = function() {};
- this.render = function(a, j) {
- if (!1 === j instanceof THREE.Camera) console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");
- else {
- !0 === this.autoClear && this.clear();
- D.setTransform(1, 0, 0, - 1, A, K);
- u.info.render.vertices = 0;
- u.info.render.faces = 0;
- r = G.projectScene(a, j, this.sortObjects, this.sortElements);
- v = r.elements;
- z = r.lights;
- Q = j;
- gb.setRGB(0, 0, 0);
- ra.setRGB(0, 0, 0);
- fa.setRGB(0, 0, 0);
- for (var y = 0, F = z.length; y < F; y++) {
- var B = z[y],
- E = B.color;
- B instanceof THREE.AmbientLight ? gb.add(E) : B instanceof THREE.DirectionalLight ? ra.add(E) : B instanceof THREE.PointLight && fa.add(E)
- }
- y = 0;
- for (F = v.length; y < F; y++) {
- var x = v[y],
- w = x.material;
- if (!(void 0 === w || !1 === w.visible)) {
- Ea.makeEmpty();
- if (x instanceof THREE.RenderableSprite) {
- R = x;
- R.x *= A;
- R.y *= K;
- var B = R,
- E = x,
- I = w;
- i(I.opacity);
- k(I.blending);
- var x = E.scale.x * A,
- w = E.scale.y * K,
- O = 0.5 * Math.sqrt(x * x + w * w);
- Ea.min.set(B.x - O, B.y - O);
- Ea.max.set(B.x + O, B.y + O);
- !1 === va.isIntersectionBox(Ea) ? Ea.makeEmpty() : I instanceof THREE.SpriteMaterial || I instanceof THREE.ParticleSystemMaterial ? (null !== I.map ? (E = I.map.image, D.save(), D.translate(B.x, B.y), D.rotate(I.rotation), D.scale(x, - w), D.drawImage(E, 0, 0, E.width, E.height, - 0.5, - 0.5, 1, 1)) : (s(I.color.getStyle()), D.save(), D.translate(B.x, B.y), D.rotate(I.rotation), D.scale(x, - w), D.fillRect(-0.5, - 0.5, 1, 1)), D.restore()) : I instanceof THREE.SpriteCanvasMaterial && (t(I.color.getStyle()), s(I.color.getStyle()), D.save(), D.translate(B.x, B.y), D.rotate(-E.rotation), D.scale(x, w), I.program(D), D.restore())
- } else if (x instanceof THREE.RenderableLine) {
- if (R = x.v1,
- L = x.v2, R.positionScreen.x *= A, R.positionScreen.y *= K, L.positionScreen.x *= A, L.positionScreen.y *= K, Ea.setFromPoints([R.positionScreen, L.positionScreen]), !0 === va.isIntersectionBox(Ea)) if (B = R, E = L, I = x, x = w, i(x.opacity), k(x.blending), D.beginPath(), D.moveTo(B.positionScreen.x, B.positionScreen.y), D.lineTo(E.positionScreen.x, E.positionScreen.y), x instanceof THREE.LineBasicMaterial) {
- m(x.linewidth);
- l(x.linecap);
- p(x.linejoin);
- if (x.vertexColors !== THREE.VertexColors) t(x.color.getStyle());
- else if (w = I.vertexColors[0].getStyle(),
- I = I.vertexColors[1].getStyle(), w === I) t(w);
- else {
- try {
- var C = D.createLinearGradient(B.positionScreen.x, B.positionScreen.y, E.positionScreen.x, E.positionScreen.y);
- C.addColorStop(0, w);
- C.addColorStop(1, I)
- } catch (J) {
- C = w
- }
- t(C)
- }
- D.stroke();
- Ea.expandByScalar(2 * x.linewidth)
- } else x instanceof THREE.LineDashedMaterial && (m(x.linewidth), l(x.linecap), p(x.linejoin), t(x.color.getStyle()), q(x.dashSize, x.gapSize), D.stroke(), Ea.expandByScalar(2 * x.linewidth), q(null, null))
- } else if (x instanceof THREE.RenderableFace3) {
- R = x.v1;
- L = x.v2;
- da = x.v3;
- if (-1 > R.positionScreen.z || 1 < R.positionScreen.z) continue;
- if (-1 > L.positionScreen.z || 1 < L.positionScreen.z) continue;
- if (-1 > da.positionScreen.z || 1 < da.positionScreen.z) continue;
- R.positionScreen.x *= A;
- R.positionScreen.y *= K;
- L.positionScreen.x *= A;
- L.positionScreen.y *= K;
- da.positionScreen.x *= A;
- da.positionScreen.y *= K;
- 0 < w.overdraw && (g(R.positionScreen, L.positionScreen, w.overdraw), g(L.positionScreen, da.positionScreen, w.overdraw), g(da.positionScreen, R.positionScreen, w.overdraw));
- Ea.setFromPoints([R.positionScreen,
- L.positionScreen, da.positionScreen]);
- if (!0 === va.isIntersectionBox(Ea)) {
- B = R;
- E = L;
- I = da;
- u.info.render.vertices += 3;
- u.info.render.faces++;
- i(w.opacity);
- k(w.blending);
- za = B.positionScreen.x;
- Ba = B.positionScreen.y;
- ba = E.positionScreen.x;
- Aa = E.positionScreen.y;
- $ = I.positionScreen.x;
- ea = I.positionScreen.y;
- var O = za,
- M = Ba,
- ca = ba,
- ka = Aa,
- na = $,
- pa = ea;
- D.beginPath();
- D.moveTo(O, M);
- D.lineTo(ca, ka);
- D.lineTo(na, pa);
- D.closePath();
- (w instanceof THREE.MeshLambertMaterial || w instanceof THREE.MeshPhongMaterial) && null === w.map ? (sa.copy(w.color),
- ha.copy(w.emissive), w.vertexColors === THREE.FaceColors && sa.multiply(x.color), !1 === w.wireframe && w.shading === THREE.SmoothShading && 3 === x.vertexNormalsLength ? (P.copy(gb), Y.copy(gb), U.copy(gb), b(x.v1.positionWorld, x.vertexNormalsModel[0], P), b(x.v2.positionWorld, x.vertexNormalsModel[1], Y), b(x.v3.positionWorld, x.vertexNormalsModel[2], U), P.multiply(sa).add(ha), Y.multiply(sa).add(ha), U.multiply(sa).add(ha), ja.addColors(Y, U).multiplyScalar(0.5), Qa = h(P, Y, U, ja), f(za, Ba, ba, Aa, $, ea, 0, 0, 1, 0, 0, 1, Qa)) : (V.copy(gb),
- b(x.centroidModel, x.normalModel, V), V.multiply(sa).add(ha), !0 === w.wireframe ? c(V, w.wireframeLinewidth, w.wireframeLinecap, w.wireframeLinejoin) : d(V))) : w instanceof THREE.MeshBasicMaterial || w instanceof THREE.MeshLambertMaterial || w instanceof THREE.MeshPhongMaterial ? null !== w.map ? w.map.mapping instanceof THREE.UVMapping && (wa = x.uvs[0], e(za, Ba, ba, Aa, $, ea, wa[0].x, wa[0].y, wa[1].x, wa[1].y, wa[2].x, wa[2].y, w.map)) : null !== w.envMap ? w.envMap.mapping instanceof THREE.SphericalReflectionMapping && (ta.copy(x.vertexNormalsModelView[0]),
- bb = 0.5 * ta.x + 0.5, cb = 0.5 * ta.y + 0.5, ta.copy(x.vertexNormalsModelView[1]), Ma = 0.5 * ta.x + 0.5, fb = 0.5 * ta.y + 0.5, ta.copy(x.vertexNormalsModelView[2]), sb = 0.5 * ta.x + 0.5, pb = 0.5 * ta.y + 0.5, e(za, Ba, ba, Aa, $, ea, bb, cb, Ma, fb, sb, pb, w.envMap)) : (V.copy(w.color), w.vertexColors === THREE.FaceColors && V.multiply(x.color), !0 === w.wireframe ? c(V, w.wireframeLinewidth, w.wireframeLinecap, w.wireframeLinejoin) : d(V)) : w instanceof THREE.MeshDepthMaterial ? (Da = Q.near, Ua = Q.far, P.r = P.g = P.b = 1 - n(B.positionScreen.z * B.positionScreen.w, Da, Ua), Y.r = Y.g = Y.b = 1 - n(E.positionScreen.z * E.positionScreen.w, Da, Ua), U.r = U.g = U.b = 1 - n(I.positionScreen.z * I.positionScreen.w, Da, Ua), ja.addColors(Y, U).multiplyScalar(0.5), Qa = h(P, Y, U, ja), f(za, Ba, ba, Aa, $, ea, 0, 0, 1, 0, 0, 1, Qa)) : w instanceof THREE.MeshNormalMaterial && (B = void 0, w.shading === THREE.FlatShading ? (B = x.normalModelView, V.setRGB(B.x, B.y, B.z).multiplyScalar(0.5).addScalar(0.5), !0 === w.wireframe ? c(V, w.wireframeLinewidth, w.wireframeLinecap, w.wireframeLinejoin) : d(V)) : w.shading === THREE.SmoothShading && (B = x.vertexNormalsModelView[0],
- P.setRGB(B.x, B.y, B.z).multiplyScalar(0.5).addScalar(0.5), B = x.vertexNormalsModelView[1], Y.setRGB(B.x, B.y, B.z).multiplyScalar(0.5).addScalar(0.5), B = x.vertexNormalsModelView[2], U.setRGB(B.x, B.y, B.z).multiplyScalar(0.5).addScalar(0.5), ja.addColors(Y, U).multiplyScalar(0.5), Qa = h(P, Y, U, ja), f(za, Ba, ba, Aa, $, ea, 0, 0, 1, 0, 0, 1, Qa)))
- }
- }
- la.union(Ea)
- }
- }
- D.setTransform(1, 0, 0, 1, 0, 0)
- }
- }
-};
-THREE.ShaderChunk = {
- fog_pars_fragment: "#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",
- fog_fragment: "#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",
- envmap_pars_fragment: "#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",
- envmap_fragment: "#ifdef USE_ENVMAP\nvec3 reflectVec;\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else if ( combine == 2 ) {\ngl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif",
- envmap_pars_vertex: "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",
- worldpos_vertex: "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n#ifdef USE_SKINNING\nvec4 worldPosition = modelMatrix * skinned;\n#endif\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\n#endif\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n#endif\n#endif",
- envmap_vertex: "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\nvec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\nworldNormal = normalize( worldNormal );\nvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\nif ( useRefract ) {\nvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n} else {\nvReflect = reflect( cameraToVertex, worldNormal );\n}\n#endif",
- map_particle_pars_fragment: "#ifdef USE_MAP\nuniform sampler2D map;\n#endif",
- map_particle_fragment: "#ifdef USE_MAP\ngl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\n#endif",
- map_pars_vertex: "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\nvarying vec2 vUv;\nuniform vec4 offsetRepeat;\n#endif",
- map_pars_fragment: "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\nvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif",
- map_vertex: "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",
- map_fragment: "#ifdef USE_MAP\nvec4 texelColor = texture2D( map, vUv );\n#ifdef GAMMA_INPUT\ntexelColor.xyz *= texelColor.xyz;\n#endif\ngl_FragColor = gl_FragColor * texelColor;\n#endif",
- lightmap_pars_fragment: "#ifdef USE_LIGHTMAP\nvarying vec2 vUv2;\nuniform sampler2D lightMap;\n#endif",
- lightmap_pars_vertex: "#ifdef USE_LIGHTMAP\nvarying vec2 vUv2;\n#endif",
- lightmap_fragment: "#ifdef USE_LIGHTMAP\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\n#endif",
- lightmap_vertex: "#ifdef USE_LIGHTMAP\nvUv2 = uv2;\n#endif",
- bumpmap_pars_fragment: "#ifdef USE_BUMPMAP\nuniform sampler2D bumpMap;\nuniform float bumpScale;\nvec2 dHdxy_fwd() {\nvec2 dSTdx = dFdx( vUv );\nvec2 dSTdy = dFdy( vUv );\nfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\nfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\nfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\nreturn vec2( dBx, dBy );\n}\nvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\nvec3 vSigmaX = dFdx( surf_pos );\nvec3 vSigmaY = dFdy( surf_pos );\nvec3 vN = surf_norm;\nvec3 R1 = cross( vSigmaY, vN );\nvec3 R2 = cross( vN, vSigmaX );\nfloat fDet = dot( vSigmaX, R1 );\nvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\nreturn normalize( abs( fDet ) * surf_norm - vGrad );\n}\n#endif",
- normalmap_pars_fragment: "#ifdef USE_NORMALMAP\nuniform sampler2D normalMap;\nuniform vec2 normalScale;\nvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\nvec3 q0 = dFdx( eye_pos.xyz );\nvec3 q1 = dFdy( eye_pos.xyz );\nvec2 st0 = dFdx( vUv.st );\nvec2 st1 = dFdy( vUv.st );\nvec3 S = normalize( q0 * st1.t - q1 * st0.t );\nvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\nvec3 N = normalize( surf_norm );\nvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\nmapN.xy = normalScale * mapN.xy;\nmat3 tsn = mat3( S, T, N );\nreturn normalize( tsn * mapN );\n}\n#endif",
- specularmap_pars_fragment: "#ifdef USE_SPECULARMAP\nuniform sampler2D specularMap;\n#endif",
- specularmap_fragment: "float specularStrength;\n#ifdef USE_SPECULARMAP\nvec4 texelSpecular = texture2D( specularMap, vUv );\nspecularStrength = texelSpecular.r;\n#else\nspecularStrength = 1.0;\n#endif",
- lights_lambert_pars_vertex: "uniform vec3 ambient;\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif",
- lights_lambert_vertex: "vLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\nvLightBack = vec3( 0.0 );\n#endif\ntransformedNormal = normalize( transformedNormal );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, dirVector );\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n#ifdef DOUBLE_SIDED\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n#endif\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\n#ifdef DOUBLE_SIDED\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\n#ifdef DOUBLE_SIDED\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\nvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n#ifdef DOUBLE_SIDED\nvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n#endif\n}\n#endif\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\n#ifdef DOUBLE_SIDED\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\n#endif",
- lights_phong_pars_vertex: "#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif",
- lights_phong_vertex: "#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nvSpotLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvWorldPosition = worldPosition.xyz;\n#endif",
- lights_phong_pars_fragment: "uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#else\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;",
- lights_phong_fragment: "vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#ifdef DOUBLE_SIDED\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n#endif\n#ifdef USE_NORMALMAP\nnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\nnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\nfloat lDistance = vSpotLight[ i ].w;\n#endif\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\n#endif\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\nvec3 spotHalfVector = normalize( lVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, dirVector );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += diffuse * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif",
- color_pars_fragment: "#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",
- color_fragment: "#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, 1.0 );\n#endif",
- color_pars_vertex: "#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",
- color_vertex: "#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",
- skinning_pars_vertex: "#ifdef USE_SKINNING\n#ifdef BONE_TEXTURE\nuniform sampler2D boneTexture;\nuniform int boneTextureWidth;\nuniform int boneTextureHeight;\nmat4 getBoneMatrix( const in float i ) {\nfloat j = i * 4.0;\nfloat x = mod( j, float( boneTextureWidth ) );\nfloat y = floor( j / float( boneTextureWidth ) );\nfloat dx = 1.0 / float( boneTextureWidth );\nfloat dy = 1.0 / float( boneTextureHeight );\ny = dy * ( y + 0.5 );\nvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\nvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\nvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\nvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\nmat4 bone = mat4( v1, v2, v3, v4 );\nreturn bone;\n}\n#else\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\nmat4 getBoneMatrix( const in float i ) {\nmat4 bone = boneGlobalMatrices[ int(i) ];\nreturn bone;\n}\n#endif\n#endif",
- skinbase_vertex: "#ifdef USE_SKINNING\nmat4 boneMatX = getBoneMatrix( skinIndex.x );\nmat4 boneMatY = getBoneMatrix( skinIndex.y );\n#endif",
- skinning_vertex: "#ifdef USE_SKINNING\n#ifdef USE_MORPHTARGETS\nvec4 skinVertex = vec4( morphed, 1.0 );\n#else\nvec4 skinVertex = vec4( position, 1.0 );\n#endif\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\n#endif",
- morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETS\n#ifndef USE_MORPHNORMALS\nuniform float morphTargetInfluences[ 8 ];\n#else\nuniform float morphTargetInfluences[ 4 ];\n#endif\n#endif",
- morphtarget_vertex: "#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n#ifndef USE_MORPHNORMALS\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n#endif\nmorphed += position;\n#endif",
- default_vertex: "vec4 mvPosition;\n#ifdef USE_SKINNING\nmvPosition = modelViewMatrix * skinned;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( morphed, 1.0 );\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( position, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;",
- morphnormal_vertex: "#ifdef USE_MORPHNORMALS\nvec3 morphedNormal = vec3( 0.0 );\nmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\nmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\nmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\nmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\nmorphedNormal += normal;\n#endif",
- skinnormal_vertex: "#ifdef USE_SKINNING\nmat4 skinMatrix = skinWeight.x * boneMatX;\nskinMatrix \t+= skinWeight.y * boneMatY;\n#ifdef USE_MORPHNORMALS\nvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\n#else\nvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\n#endif\n#endif",
- defaultnormal_vertex: "vec3 objectNormal;\n#ifdef USE_SKINNING\nobjectNormal = skinnedNormal.xyz;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\nobjectNormal = morphedNormal;\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\nobjectNormal = normal;\n#endif\n#ifdef FLIP_SIDED\nobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;",
- shadowmap_pars_fragment: "#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif",
- shadowmap_fragment: "#ifdef USE_SHADOWMAP\n#ifdef SHADOWMAP_DEBUG\nvec3 frustumColors[3];\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n#endif\n#ifdef SHADOWMAP_CASCADE\nint inFrustumCount = 0;\n#endif\nfloat fDepth;\nvec3 shadowColor = vec3( 1.0 );\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nbool inFrustum = all( inFrustumVec );\n#ifdef SHADOWMAP_CASCADE\ninFrustumCount += int( inFrustum );\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n#else\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n#endif\nbool frustumTest = all( frustumTestVec );\nif ( frustumTest ) {\nshadowCoord.z += shadowBias[ i ];\n#if defined( SHADOWMAP_TYPE_PCF )\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\nfloat shadow = 0.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.0 * xPixelOffset;\nfloat dy0 = -1.0 * yPixelOffset;\nfloat dx1 = 1.0 * xPixelOffset;\nfloat dy1 = 1.0 * yPixelOffset;\nmat3 shadowKernel;\nmat3 depthKernel;\ndepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\ndepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\ndepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\ndepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\ndepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\ndepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\ndepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\ndepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\ndepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nvec3 shadowZ = vec3( shadowCoord.z );\nshadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\nshadowKernel[0] *= vec3(0.25);\nshadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\nshadowKernel[1] *= vec3(0.25);\nshadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\nshadowKernel[2] *= vec3(0.25);\nvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\nshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\nshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\nvec4 shadowValues;\nshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\nshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\nshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\nshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\nshadow = dot( shadowValues, vec4( 1.0 ) );\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n#ifdef SHADOWMAP_DEBUG\n#ifdef SHADOWMAP_CASCADE\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\n#else\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\n#endif\n#endif\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif",
- shadowmap_pars_vertex: "#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",
- shadowmap_vertex: "#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif",
- alphatest_fragment: "#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif",
- linear_to_gamma_fragment: "#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"
-};
-THREE.UniformsUtils = {
- merge: function(a) {
- var b, c, d, e = {};
- for (b = 0; b < a.length; b++) for (c in d = this.clone(a[b]), d) e[c] = d[c];
- return e
- },
- clone: function(a) {
- var b, c, d, e = {};
- for (b in a) for (c in e[b] = {}, a[b]) d = a[b][c], e[b][c] = d instanceof THREE.Color || d instanceof THREE.Vector2 || d instanceof THREE.Vector3 || d instanceof THREE.Vector4 || d instanceof THREE.Matrix4 || d instanceof THREE.Texture ? d.clone() : d instanceof Array ? d.slice() : d;
- return e
- }
-};
-THREE.UniformsLib = {
- common: {
- diffuse: {
- type: "c",
- value: new THREE.Color(15658734)
- },
- opacity: {
- type: "f",
- value: 1
- },
- map: {
- type: "t",
- value: null
- },
- offsetRepeat: {
- type: "v4",
- value: new THREE.Vector4(0, 0, 1, 1)
- },
- lightMap: {
- type: "t",
- value: null
- },
- specularMap: {
- type: "t",
- value: null
- },
- envMap: {
- type: "t",
- value: null
- },
- flipEnvMap: {
- type: "f",
- value: -1
- },
- useRefract: {
- type: "i",
- value: 0
- },
- reflectivity: {
- type: "f",
- value: 1
- },
- refractionRatio: {
- type: "f",
- value: 0.98
- },
- combine: {
- type: "i",
- value: 0
- },
- morphTargetInfluences: {
- type: "f",
- value: 0
- }
- },
- bump: {
- bumpMap: {
- type: "t",
- value: null
- },
- bumpScale: {
- type: "f",
- value: 1
- }
- },
- normalmap: {
- normalMap: {
- type: "t",
- value: null
- },
- normalScale: {
- type: "v2",
- value: new THREE.Vector2(1, 1)
- }
- },
- fog: {
- fogDensity: {
- type: "f",
- value: 2.5E-4
- },
- fogNear: {
- type: "f",
- value: 1
- },
- fogFar: {
- type: "f",
- value: 2E3
- },
- fogColor: {
- type: "c",
- value: new THREE.Color(16777215)
- }
- },
- lights: {
- ambientLightColor: {
- type: "fv",
- value: []
- },
- directionalLightDirection: {
- type: "fv",
- value: []
- },
- directionalLightColor: {
- type: "fv",
- value: []
- },
- hemisphereLightDirection: {
- type: "fv",
- value: []
- },
- hemisphereLightSkyColor: {
- type: "fv",
- value: []
- },
- hemisphereLightGroundColor: {
- type: "fv",
- value: []
- },
- pointLightColor: {
- type: "fv",
- value: []
- },
- pointLightPosition: {
- type: "fv",
- value: []
- },
- pointLightDistance: {
- type: "fv1",
- value: []
- },
- spotLightColor: {
- type: "fv",
- value: []
- },
- spotLightPosition: {
- type: "fv",
- value: []
- },
- spotLightDirection: {
- type: "fv",
- value: []
- },
- spotLightDistance: {
- type: "fv1",
- value: []
- },
- spotLightAngleCos: {
- type: "fv1",
- value: []
- },
- spotLightExponent: {
- type: "fv1",
- value: []
- }
- },
- particle: {
- psColor: {
- type: "c",
- value: new THREE.Color(15658734)
- },
- opacity: {
- type: "f",
- value: 1
- },
- size: {
- type: "f",
- value: 1
- },
- scale: {
- type: "f",
- value: 1
- },
- map: {
- type: "t",
- value: null
- },
- fogDensity: {
- type: "f",
- value: 2.5E-4
- },
- fogNear: {
- type: "f",
- value: 1
- },
- fogFar: {
- type: "f",
- value: 2E3
- },
- fogColor: {
- type: "c",
- value: new THREE.Color(16777215)
- }
- },
- shadowmap: {
- shadowMap: {
- type: "tv",
- value: []
- },
- shadowMapSize: {
- type: "v2v",
- value: []
- },
- shadowBias: {
- type: "fv1",
- value: []
- },
- shadowDarkness: {
- type: "fv1",
- value: []
- },
- shadowMatrix: {
- type: "m4v",
- value: []
- }
- }
-};
-THREE.ShaderLib = {
- basic: {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.shadowmap]),
- vertexShader: [THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.color_vertex,
- THREE.ShaderChunk.skinbase_vertex, "#ifdef USE_ENVMAP", THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, "#endif", THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"),
- fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment,
- THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.specularmap_pars_fragment, "void main() {\ngl_FragColor = vec4( diffuse, opacity );", THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.specularmap_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment,
- THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"].join("\n")
- },
- lambert: {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, {
- ambient: {
- type: "c",
- value: new THREE.Color(16777215)
- },
- emissive: {
- type: "c",
- value: new THREE.Color(0)
- },
- wrapRGB: {
- type: "v3",
- value: new THREE.Vector3(1, 1, 1)
- }
- }]),
- vertexShader: ["#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\nvarying vec3 vLightBack;\n#endif",
- THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_lambert_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinnormal_vertex,
- THREE.ShaderChunk.defaultnormal_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.lights_lambert_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"),
- fragmentShader: ["uniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\nvarying vec3 vLightBack;\n#endif", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment,
- THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.specularmap_pars_fragment, "void main() {\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );", THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.specularmap_fragment, "#ifdef DOUBLE_SIDED\nif ( gl_FrontFacing )\ngl_FragColor.xyz *= vLightFront;\nelse\ngl_FragColor.xyz *= vLightBack;\n#else\ngl_FragColor.xyz *= vLightFront;\n#endif", THREE.ShaderChunk.lightmap_fragment,
- THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"].join("\n")
- },
- phong: {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.bump, THREE.UniformsLib.normalmap, THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, {
- ambient: {
- type: "c",
- value: new THREE.Color(16777215)
- },
- emissive: {
- type: "c",
- value: new THREE.Color(0)
- },
- specular: {
- type: "c",
- value: new THREE.Color(1118481)
- },
- shininess: {
- type: "f",
- value: 30
- },
- wrapRGB: {
- type: "v3",
- value: new THREE.Vector3(1, 1, 1)
- }
- }]),
- vertexShader: ["#define PHONG\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_phong_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, "vNormal = normalize( transformedNormal );", THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, "vViewPosition = -mvPosition.xyz;", THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.envmap_vertex,
- THREE.ShaderChunk.lights_phong_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"),
- fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;\nuniform vec3 ambient;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.lights_phong_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment,
- THREE.ShaderChunk.bumpmap_pars_fragment, THREE.ShaderChunk.normalmap_pars_fragment, THREE.ShaderChunk.specularmap_pars_fragment, "void main() {\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );", THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.specularmap_fragment, THREE.ShaderChunk.lights_phong_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment,
- THREE.ShaderChunk.fog_fragment, "}"].join("\n")
- },
- particle_basic: {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.particle, THREE.UniformsLib.shadowmap]),
- vertexShader: ["uniform float size;\nuniform float scale;", THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {", THREE.ShaderChunk.color_vertex, "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n#ifdef USE_SIZEATTENUATION\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\n#else\ngl_PointSize = size;\n#endif\ngl_Position = projectionMatrix * mvPosition;",
- THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"),
- fragmentShader: ["uniform vec3 psColor;\nuniform float opacity;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_particle_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, "void main() {\ngl_FragColor = vec4( psColor, opacity );", THREE.ShaderChunk.map_particle_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.shadowmap_fragment,
- THREE.ShaderChunk.fog_fragment, "}"].join("\n")
- },
- dashed: {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, {
- scale: {
- type: "f",
- value: 1
- },
- dashSize: {
- type: "f",
- value: 1
- },
- totalSize: {
- type: "f",
- value: 2
- }
- }]),
- vertexShader: ["uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;", THREE.ShaderChunk.color_pars_vertex, "void main() {", THREE.ShaderChunk.color_vertex, "vLineDistance = scale * lineDistance;\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n}"].join("\n"),
- fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, "void main() {\nif ( mod( vLineDistance, totalSize ) > dashSize ) {\ndiscard;\n}\ngl_FragColor = vec4( diffuse, opacity );", THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.fog_fragment, "}"].join("\n")
- },
- depth: {
- uniforms: {
- mNear: {
- type: "f",
- value: 1
- },
- mFar: {
- type: "f",
- value: 2E3
- },
- opacity: {
- type: "f",
- value: 1
- }
- },
- vertexShader: "void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
- fragmentShader: "uniform float mNear;\nuniform float mFar;\nuniform float opacity;\nvoid main() {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\ngl_FragColor = vec4( vec3( color ), opacity );\n}"
- },
- normal: {
- uniforms: {
- opacity: {
- type: "f",
- value: 1
- }
- },
- vertexShader: ["varying vec3 vNormal;", THREE.ShaderChunk.morphtarget_pars_vertex, "void main() {\nvNormal = normalize( normalMatrix * normal );",
- THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, "}"].join("\n"),
- fragmentShader: "uniform float opacity;\nvarying vec3 vNormal;\nvoid main() {\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\n}"
- },
- normalmap: {
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, {
- enableAO: {
- type: "i",
- value: 0
- },
- enableDiffuse: {
- type: "i",
- value: 0
- },
- enableSpecular: {
- type: "i",
- value: 0
- },
- enableReflection: {
- type: "i",
- value: 0
- },
- enableDisplacement: {
- type: "i",
- value: 0
- },
- tDisplacement: {
- type: "t",
- value: null
- },
- tDiffuse: {
- type: "t",
- value: null
- },
- tCube: {
- type: "t",
- value: null
- },
- tNormal: {
- type: "t",
- value: null
- },
- tSpecular: {
- type: "t",
- value: null
- },
- tAO: {
- type: "t",
- value: null
- },
- uNormalScale: {
- type: "v2",
- value: new THREE.Vector2(1, 1)
- },
- uDisplacementBias: {
- type: "f",
- value: 0
- },
- uDisplacementScale: {
- type: "f",
- value: 1
- },
- uDiffuseColor: {
- type: "c",
- value: new THREE.Color(16777215)
- },
- uSpecularColor: {
- type: "c",
- value: new THREE.Color(1118481)
- },
- uAmbientColor: {
- type: "c",
- value: new THREE.Color(16777215)
- },
- uShininess: {
- type: "f",
- value: 30
- },
- uOpacity: {
- type: "f",
- value: 1
- },
- useRefract: {
- type: "i",
- value: 0
- },
- uRefractionRatio: {
- type: "f",
- value: 0.98
- },
- uReflectivity: {
- type: "f",
- value: 0.5
- },
- uOffset: {
- type: "v2",
- value: new THREE.Vector2(0, 0)
- },
- uRepeat: {
- type: "v2",
- value: new THREE.Vector2(1, 1)
- },
- wrapRGB: {
- type: "v3",
- value: new THREE.Vector3(1, 1, 1)
- }
- }]),
- fragmentShader: ["uniform vec3 uAmbientColor;\nuniform vec3 uDiffuseColor;\nuniform vec3 uSpecularColor;\nuniform float uShininess;\nuniform float uOpacity;\nuniform bool enableDiffuse;\nuniform bool enableSpecular;\nuniform bool enableAO;\nuniform bool enableReflection;\nuniform sampler2D tDiffuse;\nuniform sampler2D tNormal;\nuniform sampler2D tSpecular;\nuniform sampler2D tAO;\nuniform samplerCube tCube;\nuniform vec2 uNormalScale;\nuniform bool useRefract;\nuniform float uRefractionRatio;\nuniform float uReflectivity;\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nuniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;",
- THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, "void main() {\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\nvec3 specularTex = vec3( 1.0 );\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\nnormalTex.xy *= uNormalScale;\nnormalTex = normalize( normalTex );\nif( enableDiffuse ) {\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( tDiffuse, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\n#endif\n}\nif( enableAO ) {\n#ifdef GAMMA_INPUT\nvec4 aoColor = texture2D( tAO, vUv );\naoColor.xyz *= aoColor.xyz;\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\n#endif\n}\nif( enableSpecular )\nspecularTex = texture2D( tSpecular, vUv ).xyz;\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\nvec3 finalNormal = tsb * normalTex;\n#ifdef FLIP_SIDED\nfinalNormal = -finalNormal;\n#endif\nvec3 normal = normalize( finalNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 pointVector = lPosition.xyz + vViewPosition.xyz;\nfloat pointDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\npointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\npointVector = normalize( pointVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\n#endif\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\n#else\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 spotVector = lPosition.xyz + vViewPosition.xyz;\nfloat spotDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\nspotVector = normalize( spotVector );\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\n#endif\nspotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;\nvec3 spotHalfVector = normalize( spotVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += uDiffuseColor * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;\n#endif\nif ( enableReflection ) {\nvec3 vReflect;\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nvReflect = refract( cameraToVertex, normal, uRefractionRatio );\n} else {\nvReflect = reflect( cameraToVertex, normal );\n}\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\n}",
- THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"].join("\n"),
- vertexShader: ["attribute vec4 tangent;\nuniform vec2 uOffset;\nuniform vec2 uRepeat;\nuniform bool enableDisplacement;\n#ifdef VERTEX_TEXTURES\nuniform sampler2D tDisplacement;\nuniform float uDisplacementScale;\nuniform float uDisplacementBias;\n#endif\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;",
- THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {", THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinnormal_vertex, "#ifdef USE_SKINNING\nvNormal = normalize( normalMatrix * skinnedNormal.xyz );\nvec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\nvTangent = normalize( normalMatrix * skinnedTangent.xyz );\n#else\nvNormal = normalize( normalMatrix * normal );\nvTangent = normalize( normalMatrix * tangent.xyz );\n#endif\nvBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\nvUv = uv * uRepeat + uOffset;\nvec3 displacedPosition;\n#ifdef VERTEX_TEXTURES\nif ( enableDisplacement ) {\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\ndisplacedPosition = position + normalize( normal ) * df;\n} else {\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n}\n#else\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n#endif\nvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\nvec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\nvWorldPosition = worldPosition.xyz;\nvViewPosition = -mvPosition.xyz;\n#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif\n}"].join("\n")
- },
- cube: {
- uniforms: {
- tCube: {
- type: "t",
- value: null
- },
- tFlip: {
- type: "f",
- value: -1
- }
- },
- vertexShader: "varying vec3 vWorldPosition;\nvoid main() {\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\nvWorldPosition = worldPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
- fragmentShader: "uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\nvoid main() {\ngl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n}"
- },
- depthRGBA: {
- uniforms: {},
- vertexShader: [THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, "void main() {", THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, "}"].join("\n"),
- fragmentShader: "vec4 pack_depth( const in float depth ) {\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\nconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\nvec4 res = fract( depth * bit_shift );\nres -= res.xxyz * bit_mask;\nreturn res;\n}\nvoid main() {\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n}"
- }
-};
-THREE.WebGLRenderer = function(a) {
- function b(a, b) {
- var c = a.vertices.length,
- d = b.material;
- if (d.attributes) {
- void 0 === a.__webglCustomAttributesList && (a.__webglCustomAttributesList = []);
- for (var e in d.attributes) {
- var f = d.attributes[e];
- if (!f.__webglInitialized || f.createUniqueBuffers) {
- f.__webglInitialized = !0;
- var h = 1;
- "v2" === f.type ? h = 2 : "v3" === f.type ? h = 3 : "v4" === f.type ? h = 4 : "c" === f.type && (h = 3);
- f.size = h;
- f.array = new Float32Array(c * h);
- f.buffer = j.createBuffer();
- f.buffer.belongsToAttribute = e;
- f.needsUpdate = !0
- }
- a.__webglCustomAttributesList.push(f)
- }
- }
- }
-
- function c(a, b) {
- var c = b.geometry,
- h = a.faces3,
- g = 3 * h.length,
- i = 1 * h.length,
- k = 3 * h.length,
- h = d(b, a),
- m = f(h),
- l = e(h),
- n = h.vertexColors ? h.vertexColors : !1;
- a.__vertexArray = new Float32Array(3 * g);
- l && (a.__normalArray = new Float32Array(3 * g));
- c.hasTangents && (a.__tangentArray = new Float32Array(4 * g));
- n && (a.__colorArray = new Float32Array(3 * g));
- m && (0 < c.faceVertexUvs.length && (a.__uvArray = new Float32Array(2 * g)), 1 < c.faceVertexUvs.length && (a.__uv2Array = new Float32Array(2 * g)));
- b.geometry.skinWeights.length && b.geometry.skinIndices.length && (a.__skinIndexArray = new Float32Array(4 * g), a.__skinWeightArray = new Float32Array(4 * g));
- a.__faceArray = new Uint16Array(3 * i);
- a.__lineArray = new Uint16Array(2 * k);
- if (a.numMorphTargets) {
- a.__morphTargetsArrays = [];
- c = 0;
- for (m = a.numMorphTargets; c < m; c++) a.__morphTargetsArrays.push(new Float32Array(3 * g))
- }
- if (a.numMorphNormals) {
- a.__morphNormalsArrays = [];
- c = 0;
- for (m = a.numMorphNormals; c < m; c++) a.__morphNormalsArrays.push(new Float32Array(3 * g))
- }
- a.__webglFaceCount = 3 * i;
- a.__webglLineCount = 2 * k;
- if (h.attributes) {
- void 0 === a.__webglCustomAttributesList && (a.__webglCustomAttributesList = []);
- for (var p in h.attributes) {
- var i = h.attributes[p],
- k = {}, q;
- for (q in i) k[q] = i[q];
- if (!k.__webglInitialized || k.createUniqueBuffers) k.__webglInitialized = !0, c = 1, "v2" === k.type ? c = 2 : "v3" === k.type ? c = 3 : "v4" === k.type ? c = 4 : "c" === k.type && (c = 3), k.size = c, k.array = new Float32Array(g * c), k.buffer = j.createBuffer(), k.buffer.belongsToAttribute = p, i.needsUpdate = !0, k.__original = i;
- a.__webglCustomAttributesList.push(k)
- }
- }
- a.__inittedArrays = !0
- }
- function d(a, b) {
- return a.material instanceof THREE.MeshFaceMaterial ? a.material.materials[b.materialIndex] : a.material
- }
- function e(a) {
- return a instanceof THREE.MeshBasicMaterial && !a.envMap || a instanceof THREE.MeshDepthMaterial ? !1 : a && void 0 !== a.shading && a.shading === THREE.SmoothShading ? THREE.SmoothShading : THREE.FlatShading
- }
- function f(a) {
- return a.map || a.lightMap || a.bumpMap || a.normalMap || a.specularMap || a instanceof THREE.ShaderMaterial ? !0 : !1
- }
- function h(a) {
- va[a] || (j.enableVertexAttribArray(a), va[a] = !0)
- }
- function g() {
- for (var a in va) va[a] && (j.disableVertexAttribArray(a), va[a] = !1)
- }
- function i(a, b) {
- return a.z !== b.z ? b.z - a.z : a.id - b.id
- }
- function k(a, b) {
- return b[0] - a[0]
- }
- function m(a, b, c) {
- if (a.length) for (var d = 0, e = a.length; d < e; d++) ea = Ba = null, Aa = $ = U = Y = ka = Ga = ja = -1, ta = !0, a[d].render(b, c, sb, pb), ea = Ba = null, Aa = $ = U = Y = ka = Ga = ja = -1, ta = !0
- }
- function l(a, b, c, d, e, f, h, g) {
- var j, i, k, m;
- b ? (i = a.length - 1, m = b = -1) : (i = 0, b = a.length, m = 1);
- for (var l = i; l !== b; l += m) if (j = a[l], j.render) {
- i = j.object;
- k = j.buffer;
- if (g) j = g;
- else {
- j = j[c];
- if (!j) continue;
- h && L.setBlending(j.blending, j.blendEquation, j.blendSrc, j.blendDst);
- L.setDepthTest(j.depthTest);
- L.setDepthWrite(j.depthWrite);
- A(j.polygonOffset, j.polygonOffsetFactor, j.polygonOffsetUnits)
- }
- L.setMaterialFaces(j);
- k instanceof THREE.BufferGeometry ? L.renderBufferDirect(d, e, f, j, k, i) : L.renderBuffer(d, e, f, j, k, i)
- }
- }
- function p(a, b, c, d, e, f, h) {
- for (var g, j, i = 0, k = a.length; i < k; i++) if (g = a[i], j = g.object, j.visible) {
- if (h) g = h;
- else {
- g = g[b];
- if (!g) continue;
- f && L.setBlending(g.blending, g.blendEquation, g.blendSrc, g.blendDst);
- L.setDepthTest(g.depthTest);
- L.setDepthWrite(g.depthWrite);
- A(g.polygonOffset,
- g.polygonOffsetFactor, g.polygonOffsetUnits)
- }
- L.renderImmediateObject(c, d, e, g, j)
- }
- }
- function t(a, d) {
- var e, f, h, g;
- if (void 0 === a.__webglInit && (a.__webglInit = !0, a._modelViewMatrix = new THREE.Matrix4, a._normalMatrix = new THREE.Matrix3, void 0 !== a.geometry && void 0 === a.geometry.__webglInit && (a.geometry.__webglInit = !0, a.geometry.addEventListener("dispose", Cb)), f = a.geometry, void 0 !== f)) if (f instanceof THREE.BufferGeometry) {
- var i, k;
- for (i in f.attributes) k = "index" === i ? j.ELEMENT_ARRAY_BUFFER : j.ARRAY_BUFFER, g = f.attributes[i],
- void 0 === g.numItems && (g.numItems = g.array.length), g.buffer = j.createBuffer(), j.bindBuffer(k, g.buffer), j.bufferData(k, g.array, j.STATIC_DRAW)
- } else if (a instanceof THREE.Mesh) {
- h = a.material;
- if (void 0 === f.geometryGroups) {
- i = f;
- var m, l, n;
- k = {};
- var p = i.morphTargets.length,
- q = i.morphNormals.length,
- t = h instanceof THREE.MeshFaceMaterial;
- i.geometryGroups = {};
- h = 0;
- for (m = i.faces.length; h < m; h++) l = i.faces[h], l = t ? l.materialIndex : 0, void 0 === k[l] && (k[l] = {
- hash: l,
- counter: 0
- }), n = k[l].hash + "_" + k[l].counter, void 0 === i.geometryGroups[n] && (i.geometryGroups[n] = {
- faces3: [],
- materialIndex: l,
- vertices: 0,
- numMorphTargets: p,
- numMorphNormals: q
- }), 65535 < i.geometryGroups[n].vertices + 3 && (k[l].counter += 1, n = k[l].hash + "_" + k[l].counter, void 0 === i.geometryGroups[n] && (i.geometryGroups[n] = {
- faces3: [],
- materialIndex: l,
- vertices: 0,
- numMorphTargets: p,
- numMorphNormals: q
- })), i.geometryGroups[n].faces3.push(h), i.geometryGroups[n].vertices += 3;
- i.geometryGroupsList = [];
- for (g in i.geometryGroups) i.geometryGroups[g].id = V++, i.geometryGroupsList.push(i.geometryGroups[g])
- }
- for (e in f.geometryGroups) if (g = f.geometryGroups[e], !g.__webglVertexBuffer) {
- i = g;
- i.__webglVertexBuffer = j.createBuffer();
- i.__webglNormalBuffer = j.createBuffer();
- i.__webglTangentBuffer = j.createBuffer();
- i.__webglColorBuffer = j.createBuffer();
- i.__webglUVBuffer = j.createBuffer();
- i.__webglUV2Buffer = j.createBuffer();
- i.__webglSkinIndicesBuffer = j.createBuffer();
- i.__webglSkinWeightsBuffer = j.createBuffer();
- i.__webglFaceBuffer = j.createBuffer();
- i.__webglLineBuffer = j.createBuffer();
- p = k = void 0;
- if (i.numMorphTargets) {
- i.__webglMorphTargetsBuffers = [];
- k = 0;
- for (p = i.numMorphTargets; k < p; k++) i.__webglMorphTargetsBuffers.push(j.createBuffer())
- }
- if (i.numMorphNormals) {
- i.__webglMorphNormalsBuffers = [];
- k = 0;
- for (p = i.numMorphNormals; k < p; k++) i.__webglMorphNormalsBuffers.push(j.createBuffer())
- }
- L.info.memory.geometries++;
- c(g, a);
- f.verticesNeedUpdate = !0;
- f.morphTargetsNeedUpdate = !0;
- f.elementsNeedUpdate = !0;
- f.uvsNeedUpdate = !0;
- f.normalsNeedUpdate = !0;
- f.tangentsNeedUpdate = !0;
- f.colorsNeedUpdate = !0
- }
- } else a instanceof THREE.Line ? f.__webglVertexBuffer || (g = f, g.__webglVertexBuffer = j.createBuffer(), g.__webglColorBuffer = j.createBuffer(), g.__webglLineDistanceBuffer = j.createBuffer(), L.info.memory.geometries++, g = f, i = g.vertices.length, g.__vertexArray = new Float32Array(3 * i), g.__colorArray = new Float32Array(3 * i), g.__lineDistanceArray = new Float32Array(1 * i), g.__webglLineCount = i, b(g, a), f.verticesNeedUpdate = !0, f.colorsNeedUpdate = !0, f.lineDistancesNeedUpdate = !0) : a instanceof THREE.ParticleSystem && !f.__webglVertexBuffer && (g = f, g.__webglVertexBuffer = j.createBuffer(), g.__webglColorBuffer = j.createBuffer(),
- L.info.memory.geometries++, g = f, i = g.vertices.length, g.__vertexArray = new Float32Array(3 * i), g.__colorArray = new Float32Array(3 * i), g.__sortArray = [], g.__webglParticleCount = i, b(g, a), f.verticesNeedUpdate = !0, f.colorsNeedUpdate = !0);
- if (void 0 === a.__webglActive) {
- if (a instanceof THREE.Mesh) if (f = a.geometry, f instanceof THREE.BufferGeometry) s(d.__webglObjects, f, a);
- else {
- if (f instanceof THREE.Geometry) for (e in f.geometryGroups) g = f.geometryGroups[e], s(d.__webglObjects, g, a)
- } else a instanceof THREE.Line || a instanceof
- THREE.ParticleSystem ? (f = a.geometry, s(d.__webglObjects, f, a)) : a instanceof THREE.ImmediateRenderObject || a.immediateRenderCallback ? d.__webglObjectsImmediate.push({
- id: null,
- object: a,
- opaque: null,
- transparent: null,
- z: 0
- }) : a instanceof THREE.Sprite ? d.__webglSprites.push(a) : a instanceof THREE.LensFlare && d.__webglFlares.push(a);
- a.__webglActive = !0
- }
- }
- function s(a, b, c) {
- a.push({
- id: null,
- buffer: b,
- object: c,
- opaque: null,
- transparent: null,
- z: 0
- })
- }
- function q(a) {
- for (var b in a.attributes) if (a.attributes[b].needsUpdate) return !0;
- return !1
- }
- function n(a) {
- for (var b in a.attributes) a.attributes[b].needsUpdate = !1
- }
- function u(a, b) {
- a instanceof THREE.Mesh || a instanceof THREE.ParticleSystem || a instanceof THREE.Line ? r(b.__webglObjects, a) : a instanceof THREE.Sprite ? v(b.__webglSprites, a) : a instanceof THREE.LensFlare ? v(b.__webglFlares, a) : (a instanceof THREE.ImmediateRenderObject || a.immediateRenderCallback) && r(b.__webglObjectsImmediate, a);
- delete a.__webglActive
- }
- function r(a, b) {
- for (var c = a.length - 1; 0 <= c; c--) a[c].object === b && a.splice(c, 1)
- }
-
- function v(a, b) {
- for (var c = a.length - 1; 0 <= c; c--) a[c] === b && a.splice(c, 1)
- }
- function z(a, b, c, d, e) {
- P = 0;
- d.needsUpdate && (d.program && Gb(d), L.initMaterial(d, b, c, e), d.needsUpdate = !1);
- d.morphTargets && !e.__webglMorphTargetInfluences && (e.__webglMorphTargetInfluences = new Float32Array(L.maxMorphTargets));
- var f = !1,
- h = d.program,
- g = h.uniforms,
- i = d.uniforms;
- h !== Ba && (j.useProgram(h), Ba = h, f = !0);
- d.id !== Aa && (Aa = d.id, f = !0);
- if (f || a !== ea) j.uniformMatrix4fv(g.projectionMatrix, !1, a.projectionMatrix.elements), a !== ea && (ea = a);
- if (d.skinning) if (yb && e.useVertexTexture) {
- if (null !== g.boneTexture) {
- var k = G();
- j.uniform1i(g.boneTexture, k);
- L.setTexture(e.boneTexture, k)
- }
- null !== g.boneTextureWidth && j.uniform1i(g.boneTextureWidth, e.boneTextureWidth);
- null !== g.boneTextureHeight && j.uniform1i(g.boneTextureHeight, e.boneTextureHeight)
- } else null !== g.boneGlobalMatrices && j.uniformMatrix4fv(g.boneGlobalMatrices, !1, e.boneMatrices);
- if (f) {
- c && d.fog && (i.fogColor.value = c.color, c instanceof THREE.Fog ? (i.fogNear.value = c.near, i.fogFar.value = c.far) : c instanceof THREE.FogExp2 && (i.fogDensity.value = c.density));
- if (d instanceof THREE.MeshPhongMaterial || d instanceof THREE.MeshLambertMaterial || d.lights) {
- if (ta) {
- for (var m, l = k = 0, n = 0, p, q, t, r = Pa, s = r.directional.colors, u = r.directional.positions, v = r.point.colors, z = r.point.positions, x = r.point.distances, A = r.spot.colors, E = r.spot.positions, D = r.spot.distances, K = r.spot.directions, O = r.spot.anglesCos, C = r.spot.exponents, J = r.hemi.skyColors, V = r.hemi.groundColors, M = r.hemi.positions, Q = 0, U = 0, Y = 0, za = 0, $ = 0, dc = 0, X = 0, W = 0, R = m = 0, c = t = R = 0, f = b.length; c < f; c++) m = b[c], m.onlyShadow || (p = m.color, q = m.intensity, t = m.distance, m instanceof THREE.AmbientLight ? m.visible && (L.gammaInput ? (k += p.r * p.r, l += p.g * p.g, n += p.b * p.b) : (k += p.r, l += p.g, n += p.b)) : m instanceof THREE.DirectionalLight ? ($ += 1, m.visible && (fa.setFromMatrixPosition(m.matrixWorld), ra.setFromMatrixPosition(m.target.matrixWorld), fa.sub(ra), fa.normalize(), 0 === fa.x && 0 === fa.y && 0 === fa.z || (m = 3 * Q, u[m] = fa.x, u[m + 1] = fa.y, u[m + 2] = fa.z, L.gammaInput ? w(s, m, p, q * q) : y(s, m, p, q), Q += 1))) : m instanceof THREE.PointLight ? (dc += 1, m.visible && (R = 3 * U, L.gammaInput ? w(v, R, p, q * q) : y(v, R, p, q), ra.setFromMatrixPosition(m.matrixWorld), z[R] = ra.x, z[R + 1] = ra.y, z[R + 2] = ra.z, x[U] = t, U += 1)) : m instanceof THREE.SpotLight ? (X += 1, m.visible && (R = 3 * Y, L.gammaInput ? w(A, R, p, q * q) : y(A, R, p, q), ra.setFromMatrixPosition(m.matrixWorld), E[R] = ra.x, E[R + 1] = ra.y, E[R + 2] = ra.z, D[Y] = t, fa.copy(ra), ra.setFromMatrixPosition(m.target.matrixWorld), fa.sub(ra), fa.normalize(), K[R] = fa.x, K[R + 1] = fa.y, K[R + 2] = fa.z, O[Y] = Math.cos(m.angle), C[Y] = m.exponent, Y += 1)) : m instanceof THREE.HemisphereLight && (W += 1, m.visible && (fa.setFromMatrixPosition(m.matrixWorld), fa.normalize(), 0 === fa.x && 0 === fa.y && 0 === fa.z || (t = 3 * za, M[t] = fa.x, M[t + 1] = fa.y, M[t + 2] = fa.z, p = m.color, m = m.groundColor, L.gammaInput ? (q *= q, w(J, t, p, q), w(V, t, m, q)) : (y(J, t, p, q), y(V, t, m, q)), za += 1))));
- c = 3 * Q;
- for (f = Math.max(s.length, 3 * $); c < f; c++) s[c] = 0;
- c = 3 * U;
- for (f = Math.max(v.length, 3 * dc); c < f; c++) v[c] = 0;
- c = 3 * Y;
- for (f = Math.max(A.length, 3 * X); c < f; c++) A[c] = 0;
- c = 3 * za;
- for (f = Math.max(J.length, 3 * W); c < f; c++) J[c] = 0;
- c = 3 * za;
- for (f = Math.max(V.length, 3 * W); c < f; c++) V[c] = 0;
- r.directional.length = Q;
- r.point.length = U;
- r.spot.length = Y;
- r.hemi.length = za;
- r.ambient[0] = k;
- r.ambient[1] = l;
- r.ambient[2] = n;
- ta = !1
- }
- c = Pa;
- i.ambientLightColor.value = c.ambient;
- i.directionalLightColor.value = c.directional.colors;
- i.directionalLightDirection.value = c.directional.positions;
- i.pointLightColor.value = c.point.colors;
- i.pointLightPosition.value = c.point.positions;
- i.pointLightDistance.value = c.point.distances;
- i.spotLightColor.value = c.spot.colors;
- i.spotLightPosition.value = c.spot.positions;
- i.spotLightDistance.value = c.spot.distances;
- i.spotLightDirection.value = c.spot.directions;
- i.spotLightAngleCos.value = c.spot.anglesCos;
- i.spotLightExponent.value = c.spot.exponents;
- i.hemisphereLightSkyColor.value = c.hemi.skyColors;
- i.hemisphereLightGroundColor.value = c.hemi.groundColors;
- i.hemisphereLightDirection.value = c.hemi.positions
- }
- if (d instanceof THREE.MeshBasicMaterial || d instanceof THREE.MeshLambertMaterial || d instanceof THREE.MeshPhongMaterial) {
- i.opacity.value = d.opacity;
- L.gammaInput ? i.diffuse.value.copyGammaToLinear(d.color) : i.diffuse.value = d.color;
- i.map.value = d.map;
- i.lightMap.value = d.lightMap;
- i.specularMap.value = d.specularMap;
- d.bumpMap && (i.bumpMap.value = d.bumpMap, i.bumpScale.value = d.bumpScale);
- d.normalMap && (i.normalMap.value = d.normalMap, i.normalScale.value.copy(d.normalScale));
- var ba;
- d.map ? ba = d.map : d.specularMap ? ba = d.specularMap : d.normalMap ? ba = d.normalMap : d.bumpMap && (ba = d.bumpMap);
- void 0 !== ba && (c = ba.offset, ba = ba.repeat, i.offsetRepeat.value.set(c.x, c.y, ba.x, ba.y));
- i.envMap.value = d.envMap;
- i.flipEnvMap.value = d.envMap instanceof THREE.WebGLRenderTargetCube ? 1 : -1;
- i.reflectivity.value = d.reflectivity;
- i.refractionRatio.value = d.refractionRatio;
- i.combine.value = d.combine;
- i.useRefract.value = d.envMap && d.envMap.mapping instanceof THREE.CubeRefractionMapping
- }
- d instanceof THREE.LineBasicMaterial ? (i.diffuse.value = d.color, i.opacity.value = d.opacity) : d instanceof THREE.LineDashedMaterial ? (i.diffuse.value = d.color, i.opacity.value = d.opacity, i.dashSize.value = d.dashSize, i.totalSize.value = d.dashSize + d.gapSize, i.scale.value = d.scale) : d instanceof THREE.ParticleSystemMaterial ? (i.psColor.value = d.color, i.opacity.value = d.opacity, i.size.value = d.size, i.scale.value = B.height / 2, i.map.value = d.map) : d instanceof THREE.MeshPhongMaterial ? (i.shininess.value = d.shininess, L.gammaInput ? (i.ambient.value.copyGammaToLinear(d.ambient), i.emissive.value.copyGammaToLinear(d.emissive), i.specular.value.copyGammaToLinear(d.specular)) : (i.ambient.value = d.ambient, i.emissive.value = d.emissive, i.specular.value = d.specular), d.wrapAround && i.wrapRGB.value.copy(d.wrapRGB)) : d instanceof THREE.MeshLambertMaterial ? (L.gammaInput ? (i.ambient.value.copyGammaToLinear(d.ambient), i.emissive.value.copyGammaToLinear(d.emissive)) : (i.ambient.value = d.ambient, i.emissive.value = d.emissive), d.wrapAround && i.wrapRGB.value.copy(d.wrapRGB)) : d instanceof THREE.MeshDepthMaterial ? (i.mNear.value = a.near, i.mFar.value = a.far, i.opacity.value = d.opacity) : d instanceof THREE.MeshNormalMaterial && (i.opacity.value = d.opacity);
- if (e.receiveShadow && !d._shadowPass && i.shadowMatrix) {
- c = ba = 0;
- for (f = b.length; c < f; c++) if (k = b[c], k.castShadow && (k instanceof
- THREE.SpotLight || k instanceof THREE.DirectionalLight && !k.shadowCascade)) i.shadowMap.value[ba] = k.shadowMap, i.shadowMapSize.value[ba] = k.shadowMapSize, i.shadowMatrix.value[ba] = k.shadowMatrix, i.shadowDarkness.value[ba] = k.shadowDarkness, i.shadowBias.value[ba] = k.shadowBias, ba++
- }
- b = d.uniformsList;
- i = 0;
- for (ba = b.length; i < ba; i++) if (f = h.uniforms[b[i][1]]) if (c = b[i][0], l = c.type, k = c.value, "i" === l) j.uniform1i(f, k);
- else if ("f" === l) j.uniform1f(f, k);
- else if ("v2" === l) j.uniform2f(f, k.x, k.y);
- else if ("v3" === l) j.uniform3f(f,
- k.x, k.y, k.z);
- else if ("v4" === l) j.uniform4f(f, k.x, k.y, k.z, k.w);
- else if ("c" === l) j.uniform3f(f, k.r, k.g, k.b);
- else if ("iv1" === l) j.uniform1iv(f, k);
- else if ("iv" === l) j.uniform3iv(f, k);
- else if ("fv1" === l) j.uniform1fv(f, k);
- else if ("fv" === l) j.uniform3fv(f, k);
- else if ("v2v" === l) {
- void 0 === c._array && (c._array = new Float32Array(2 * k.length));
- l = 0;
- for (n = k.length; l < n; l++) r = 2 * l, c._array[r] = k[l].x, c._array[r + 1] = k[l].y;
- j.uniform2fv(f, c._array)
- } else if ("v3v" === l) {
- void 0 === c._array && (c._array = new Float32Array(3 * k.length));
- l = 0;
- for (n = k.length; l < n; l++) r = 3 * l, c._array[r] = k[l].x, c._array[r + 1] = k[l].y, c._array[r + 2] = k[l].z;
- j.uniform3fv(f, c._array)
- } else if ("v4v" === l) {
- void 0 === c._array && (c._array = new Float32Array(4 * k.length));
- l = 0;
- for (n = k.length; l < n; l++) r = 4 * l, c._array[r] = k[l].x, c._array[r + 1] = k[l].y, c._array[r + 2] = k[l].z, c._array[r + 3] = k[l].w;
- j.uniform4fv(f, c._array)
- } else if ("m4" === l) void 0 === c._array && (c._array = new Float32Array(16)), k.flattenToArray(c._array), j.uniformMatrix4fv(f, !1, c._array);
- else if ("m4v" === l) {
- void 0 === c._array && (c._array = new Float32Array(16 * k.length));
- l = 0;
- for (n = k.length; l < n; l++) k[l].flattenToArrayOffset(c._array, 16 * l);
- j.uniformMatrix4fv(f, !1, c._array)
- } else if ("t" === l) {
- if (r = k, k = G(), j.uniform1i(f, k), r) if (r.image instanceof Array && 6 === r.image.length) {
- if (c = r, f = k, 6 === c.image.length) if (c.needsUpdate) {
- c.image.__webglTextureCube || (c.addEventListener("dispose", Db), c.image.__webglTextureCube = j.createTexture(), L.info.memory.textures++);
- j.activeTexture(j.TEXTURE0 + f);
- j.bindTexture(j.TEXTURE_CUBE_MAP, c.image.__webglTextureCube);
- j.pixelStorei(j.UNPACK_FLIP_Y_WEBGL, c.flipY);
- f = c instanceof THREE.CompressedTexture;
- k = [];
- for (l = 0; 6 > l; l++) L.autoScaleCubemaps && !f ? (n = k, r = l, s = c.image[l], v = ac, s.width <= v && s.height <= v || (z = Math.max(s.width, s.height), u = Math.floor(s.width * v / z), v = Math.floor(s.height * v / z), z = document.createElement("canvas"), z.width = u, z.height = v, z.getContext("2d").drawImage(s, 0, 0, s.width, s.height, 0, 0, u, v), s = z), n[r] = s) : k[l] = c.image[l];
- l = k[0];
- n = 0 === (l.width & l.width - 1) && 0 === (l.height & l.height - 1);
- r = I(c.format);
- s = I(c.type);
- F(j.TEXTURE_CUBE_MAP,
- c, n);
- for (l = 0; 6 > l; l++) if (f) {
- v = k[l].mipmaps;
- z = 0;
- for (x = v.length; z < x; z++) u = v[z], c.format !== THREE.RGBAFormat ? j.compressedTexImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X + l, z, r, u.width, u.height, 0, u.data) : j.texImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X + l, z, r, u.width, u.height, 0, r, s, u.data)
- } else j.texImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X + l, 0, r, r, s, k[l]);
- c.generateMipmaps && n && j.generateMipmap(j.TEXTURE_CUBE_MAP);
- c.needsUpdate = !1;
- if (c.onUpdate) c.onUpdate()
- } else j.activeTexture(j.TEXTURE0 + f), j.bindTexture(j.TEXTURE_CUBE_MAP,
- c.image.__webglTextureCube)
- } else r instanceof THREE.WebGLRenderTargetCube ? (c = r, j.activeTexture(j.TEXTURE0 + k), j.bindTexture(j.TEXTURE_CUBE_MAP, c.__webglTexture)) : L.setTexture(r, k)
- } else if ("tv" === l) {
- void 0 === c._array && (c._array = []);
- l = 0;
- for (n = c.value.length; l < n; l++) c._array[l] = G();
- j.uniform1iv(f, c._array);
- l = 0;
- for (n = c.value.length; l < n; l++) r = c.value[l], k = c._array[l], r && L.setTexture(r, k)
- } else console.warn("THREE.WebGLRenderer: Unknown uniform type: " + l);
- if ((d instanceof THREE.ShaderMaterial || d instanceof
- THREE.MeshPhongMaterial || d.envMap) && null !== g.cameraPosition) ra.setFromMatrixPosition(a.matrixWorld), j.uniform3f(g.cameraPosition, ra.x, ra.y, ra.z);
- (d instanceof THREE.MeshPhongMaterial || d instanceof THREE.MeshLambertMaterial || d instanceof THREE.ShaderMaterial || d.skinning) && null !== g.viewMatrix && j.uniformMatrix4fv(g.viewMatrix, !1, a.matrixWorldInverse.elements)
- }
- j.uniformMatrix4fv(g.modelViewMatrix, !1, e._modelViewMatrix.elements);
- g.normalMatrix && j.uniformMatrix3fv(g.normalMatrix, !1, e._normalMatrix.elements);
- null !== g.modelMatrix && j.uniformMatrix4fv(g.modelMatrix, !1, e.matrixWorld.elements);
- return h
- }
- function G() {
- var a = P;
- a >= Mb && console.warn("WebGLRenderer: trying to use " + a + " texture units while this GPU supports only " + Mb);
- P += 1;
- return a
- }
- function w(a, b, c, d) {
- a[b] = c.r * c.r * d;
- a[b + 1] = c.g * c.g * d;
- a[b + 2] = c.b * c.b * d
- }
- function y(a, b, c, d) {
- a[b] = c.r * d;
- a[b + 1] = c.g * d;
- a[b + 2] = c.b * d
- }
- function E(a) {
- a !== wa && (j.lineWidth(a), wa = a)
- }
- function A(a, b, c) {
- Da !== a && (a ? j.enable(j.POLYGON_OFFSET_FILL) : j.disable(j.POLYGON_OFFSET_FILL), Da = a);
- if (a && (Ua !== b || Qa !== c)) j.polygonOffset(b, c), Ua = b, Qa = c
- }
- function K(a) {
- for (var a = a.split("\n"), b = 0, c = a.length; b < c; b++) a[b] = b + 1 + ": " + a[b];
- return a.join("\n")
- }
- function D(a, b) {
- var c;
- "fragment" === a ? c = j.createShader(j.FRAGMENT_SHADER) : "vertex" === a && (c = j.createShader(j.VERTEX_SHADER));
- j.shaderSource(c, b);
- j.compileShader(c);
- return !j.getShaderParameter(c, j.COMPILE_STATUS) ? (console.error(j.getShaderInfoLog(c)), console.error(K(b)), null) : c
- }
- function F(a, b, c) {
- c ? (j.texParameteri(a, j.TEXTURE_WRAP_S, I(b.wrapS)), j.texParameteri(a,
- j.TEXTURE_WRAP_T, I(b.wrapT)), j.texParameteri(a, j.TEXTURE_MAG_FILTER, I(b.magFilter)), j.texParameteri(a, j.TEXTURE_MIN_FILTER, I(b.minFilter))) : (j.texParameteri(a, j.TEXTURE_WRAP_S, j.CLAMP_TO_EDGE), j.texParameteri(a, j.TEXTURE_WRAP_T, j.CLAMP_TO_EDGE), j.texParameteri(a, j.TEXTURE_MAG_FILTER, x(b.magFilter)), j.texParameteri(a, j.TEXTURE_MIN_FILTER, x(b.minFilter)));
- if (La && b.type !== THREE.FloatType && (1 < b.anisotropy || b.__oldAnisotropy)) j.texParameterf(a, La.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(b.anisotropy, Nb)), b.__oldAnisotropy = b.anisotropy
- }
- function O(a, b) {
- j.bindRenderbuffer(j.RENDERBUFFER, a);
- b.depthBuffer && !b.stencilBuffer ? (j.renderbufferStorage(j.RENDERBUFFER, j.DEPTH_COMPONENT16, b.width, b.height), j.framebufferRenderbuffer(j.FRAMEBUFFER, j.DEPTH_ATTACHMENT, j.RENDERBUFFER, a)) : b.depthBuffer && b.stencilBuffer ? (j.renderbufferStorage(j.RENDERBUFFER, j.DEPTH_STENCIL, b.width, b.height), j.framebufferRenderbuffer(j.FRAMEBUFFER, j.DEPTH_STENCIL_ATTACHMENT, j.RENDERBUFFER, a)) : j.renderbufferStorage(j.RENDERBUFFER, j.RGBA4, b.width, b.height)
- }
-
- function x(a) {
- return a === THREE.NearestFilter || a === THREE.NearestMipMapNearestFilter || a === THREE.NearestMipMapLinearFilter ? j.NEAREST : j.LINEAR
- }
- function I(a) {
- if (a === THREE.RepeatWrapping) return j.REPEAT;
- if (a === THREE.ClampToEdgeWrapping) return j.CLAMP_TO_EDGE;
- if (a === THREE.MirroredRepeatWrapping) return j.MIRRORED_REPEAT;
- if (a === THREE.NearestFilter) return j.NEAREST;
- if (a === THREE.NearestMipMapNearestFilter) return j.NEAREST_MIPMAP_NEAREST;
- if (a === THREE.NearestMipMapLinearFilter) return j.NEAREST_MIPMAP_LINEAR;
- if (a === THREE.LinearFilter) return j.LINEAR;
- if (a === THREE.LinearMipMapNearestFilter) return j.LINEAR_MIPMAP_NEAREST;
- if (a === THREE.LinearMipMapLinearFilter) return j.LINEAR_MIPMAP_LINEAR;
- if (a === THREE.UnsignedByteType) return j.UNSIGNED_BYTE;
- if (a === THREE.UnsignedShort4444Type) return j.UNSIGNED_SHORT_4_4_4_4;
- if (a === THREE.UnsignedShort5551Type) return j.UNSIGNED_SHORT_5_5_5_1;
- if (a === THREE.UnsignedShort565Type) return j.UNSIGNED_SHORT_5_6_5;
- if (a === THREE.ByteType) return j.BYTE;
- if (a === THREE.ShortType) return j.SHORT;
- if (a === THREE.UnsignedShortType) return j.UNSIGNED_SHORT;
- if (a === THREE.IntType) return j.INT;
- if (a === THREE.UnsignedIntType) return j.UNSIGNED_INT;
- if (a === THREE.FloatType) return j.FLOAT;
- if (a === THREE.AlphaFormat) return j.ALPHA;
- if (a === THREE.RGBFormat) return j.RGB;
- if (a === THREE.RGBAFormat) return j.RGBA;
- if (a === THREE.LuminanceFormat) return j.LUMINANCE;
- if (a === THREE.LuminanceAlphaFormat) return j.LUMINANCE_ALPHA;
- if (a === THREE.AddEquation) return j.FUNC_ADD;
- if (a === THREE.SubtractEquation) return j.FUNC_SUBTRACT;
- if (a === THREE.ReverseSubtractEquation) return j.FUNC_REVERSE_SUBTRACT;
- if (a === THREE.ZeroFactor) return j.ZERO;
- if (a === THREE.OneFactor) return j.ONE;
- if (a === THREE.SrcColorFactor) return j.SRC_COLOR;
- if (a === THREE.OneMinusSrcColorFactor) return j.ONE_MINUS_SRC_COLOR;
- if (a === THREE.SrcAlphaFactor) return j.SRC_ALPHA;
- if (a === THREE.OneMinusSrcAlphaFactor) return j.ONE_MINUS_SRC_ALPHA;
- if (a === THREE.DstAlphaFactor) return j.DST_ALPHA;
- if (a === THREE.OneMinusDstAlphaFactor) return j.ONE_MINUS_DST_ALPHA;
- if (a === THREE.DstColorFactor) return j.DST_COLOR;
- if (a === THREE.OneMinusDstColorFactor) return j.ONE_MINUS_DST_COLOR;
- if (a === THREE.SrcAlphaSaturateFactor) return j.SRC_ALPHA_SATURATE;
- if (void 0 !== Fa) {
- if (a === THREE.RGB_S3TC_DXT1_Format) return Fa.COMPRESSED_RGB_S3TC_DXT1_EXT;
- if (a === THREE.RGBA_S3TC_DXT1_Format) return Fa.COMPRESSED_RGBA_S3TC_DXT1_EXT;
- if (a === THREE.RGBA_S3TC_DXT3_Format) return Fa.COMPRESSED_RGBA_S3TC_DXT3_EXT;
- if (a === THREE.RGBA_S3TC_DXT5_Format) return Fa.COMPRESSED_RGBA_S3TC_DXT5_EXT
- }
- return 0
- }
- console.log("THREE.WebGLRenderer", THREE.REVISION);
- var a = a || {}, B = void 0 !== a.canvas ? a.canvas : document.createElement("canvas"),
- M = void 0 !== a.precision ? a.precision : "highp",
- J = void 0 !== a.alpha ? a.alpha : !1,
- ca = void 0 !== a.premultipliedAlpha ? a.premultipliedAlpha : !0,
- na = void 0 !== a.antialias ? a.antialias : !1,
- pa = void 0 !== a.stencil ? a.stencil : !0,
- C = void 0 !== a.preserveDrawingBuffer ? a.preserveDrawingBuffer : !1,
- Q = new THREE.Color(0),
- R = 0;
- this.domElement = B;
- this.context = null;
- this.devicePixelRatio = void 0 !== a.devicePixelRatio ? a.devicePixelRatio : void 0 !== self.devicePixelRatio ? self.devicePixelRatio : 1;
- this.autoUpdateObjects = this.sortObjects = this.autoClearStencil = this.autoClearDepth = this.autoClearColor = this.autoClear = !0;
- this.shadowMapEnabled = this.physicallyBasedShading = this.gammaOutput = this.gammaInput = !1;
- this.shadowMapAutoUpdate = !0;
- this.shadowMapType = THREE.PCFShadowMap;
- this.shadowMapCullFace = THREE.CullFaceFront;
- this.shadowMapCascade = this.shadowMapDebug = !1;
- this.maxMorphTargets = 8;
- this.maxMorphNormals = 4;
- this.autoScaleCubemaps = !0;
- this.renderPluginsPre = [];
- this.renderPluginsPost = [];
- this.info = {
- memory: {
- programs: 0,
- geometries: 0,
- textures: 0
- },
- render: {
- calls: 0,
- vertices: 0,
- faces: 0,
- points: 0
- }
- };
- var L = this,
- da = [],
- za = 0,
- Ba = null,
- ba = null,
- Aa = -1,
- $ = null,
- ea = null,
- V = 0,
- P = 0,
- Y = -1,
- U = -1,
- ja = -1,
- sa = -1,
- ha = -1,
- Ka = -1,
- Ga = -1,
- ka = -1,
- Da = null,
- Ua = null,
- Qa = null,
- wa = null,
- bb = 0,
- cb = 0,
- Ma = B.width,
- fb = B.height,
- sb = 0,
- pb = 0,
- va = {}, la = new THREE.Frustum,
- Ea = new THREE.Matrix4,
- gb = new THREE.Matrix4,
- ra = new THREE.Vector3,
- fa = new THREE.Vector3,
- ta = !0,
- Pa = {
- ambient: [0, 0, 0],
- directional: {
- length: 0,
- colors: [],
- positions: []
- },
- point: {
- length: 0,
- colors: [],
- positions: [],
- distances: []
- },
- spot: {
- length: 0,
- colors: [],
- positions: [],
- distances: [],
- directions: [],
- anglesCos: [],
- exponents: []
- },
- hemi: {
- length: 0,
- skyColors: [],
- groundColors: [],
- positions: []
- }
- }, j, Oa, ua, La, Fa;
- try {
- var Ra = {
- alpha: J,
- premultipliedAlpha: ca,
- antialias: na,
- stencil: pa,
- preserveDrawingBuffer: C
- };
- j = B.getContext("webgl", Ra) || B.getContext("experimental-webgl", Ra);
- if (null === j) throw "Error creating WebGL context.";
- } catch (Zb) {
- console.error(Zb)
- }
- Oa = j.getExtension("OES_texture_float");
- j.getExtension("OES_texture_float_linear");
- ua = j.getExtension("OES_standard_derivatives");
- La = j.getExtension("EXT_texture_filter_anisotropic") || j.getExtension("MOZ_EXT_texture_filter_anisotropic") || j.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
- Fa = j.getExtension("WEBGL_compressed_texture_s3tc") || j.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || j.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
- Oa || console.log("THREE.WebGLRenderer: Float textures not supported.");
- ua || console.log("THREE.WebGLRenderer: Standard derivatives not supported.");
- La || console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");
- Fa || console.log("THREE.WebGLRenderer: S3TC compressed textures not supported.");
- void 0 === j.getShaderPrecisionFormat && (j.getShaderPrecisionFormat = function() {
- return {
- rangeMin: 1,
- rangeMax: 1,
- precision: 1
- }
- });
- j.clearColor(0, 0, 0, 1);
- j.clearDepth(1);
- j.clearStencil(0);
- j.enable(j.DEPTH_TEST);
- j.depthFunc(j.LEQUAL);
- j.frontFace(j.CCW);
- j.cullFace(j.BACK);
- j.enable(j.CULL_FACE);
- j.enable(j.BLEND);
- j.blendEquation(j.FUNC_ADD);
- j.blendFunc(j.SRC_ALPHA, j.ONE_MINUS_SRC_ALPHA);
- j.viewport(bb, cb, Ma, fb);
- j.clearColor(Q.r, Q.g, Q.b,
- R);
- this.context = j;
- var Mb = j.getParameter(j.MAX_TEXTURE_IMAGE_UNITS),
- $b = j.getParameter(j.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
- j.getParameter(j.MAX_TEXTURE_SIZE);
- var ac = j.getParameter(j.MAX_CUBE_MAP_TEXTURE_SIZE),
- Nb = La ? j.getParameter(La.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0,
- Bb = 0 < $b,
- yb = Bb && Oa;
- Fa && j.getParameter(j.COMPRESSED_TEXTURE_FORMATS);
- var bc = j.getShaderPrecisionFormat(j.VERTEX_SHADER, j.HIGH_FLOAT),
- cc = j.getShaderPrecisionFormat(j.VERTEX_SHADER, j.MEDIUM_FLOAT);
- j.getShaderPrecisionFormat(j.VERTEX_SHADER, j.LOW_FLOAT);
- var qc = j.getShaderPrecisionFormat(j.FRAGMENT_SHADER, j.HIGH_FLOAT),
- rc = j.getShaderPrecisionFormat(j.FRAGMENT_SHADER, j.MEDIUM_FLOAT);
- j.getShaderPrecisionFormat(j.FRAGMENT_SHADER, j.LOW_FLOAT);
- j.getShaderPrecisionFormat(j.VERTEX_SHADER, j.HIGH_INT);
- j.getShaderPrecisionFormat(j.VERTEX_SHADER, j.MEDIUM_INT);
- j.getShaderPrecisionFormat(j.VERTEX_SHADER, j.LOW_INT);
- j.getShaderPrecisionFormat(j.FRAGMENT_SHADER, j.HIGH_INT);
- j.getShaderPrecisionFormat(j.FRAGMENT_SHADER, j.MEDIUM_INT);
- j.getShaderPrecisionFormat(j.FRAGMENT_SHADER,
- j.LOW_INT);
- var sc = 0 < bc.precision && 0 < qc.precision,
- Ob = 0 < cc.precision && 0 < rc.precision;
- "highp" === M && !sc && (Ob ? (M = "mediump", console.warn("WebGLRenderer: highp not supported, using mediump")) : (M = "lowp", console.warn("WebGLRenderer: highp and mediump not supported, using lowp")));
- "mediump" === M && !Ob && (M = "lowp", console.warn("WebGLRenderer: mediump not supported, using lowp"));
- this.getContext = function() {
- return j
- };
- this.supportsVertexTextures = function() {
- return Bb
- };
- this.supportsFloatTextures = function() {
- return Oa
- };
- this.supportsStandardDerivatives = function() {
- return ua
- };
- this.supportsCompressedTextureS3TC = function() {
- return Fa
- };
- this.getMaxAnisotropy = function() {
- return Nb
- };
- this.getPrecision = function() {
- return M
- };
- this.setSize = function(a, b, c) {
- B.width = a * this.devicePixelRatio;
- B.height = b * this.devicePixelRatio;
- 1 !== this.devicePixelRatio && !1 !== c && (B.style.width = a + "px", B.style.height = b + "px");
- this.setViewport(0, 0, B.width, B.height)
- };
- this.setViewport = function(a, b, c, d) {
- bb = void 0 !== a ? a : 0;
- cb = void 0 !== b ? b : 0;
- Ma = void 0 !== c ? c : B.width;
- fb = void 0 !== d ? d : B.height;
- j.viewport(bb, cb, Ma, fb)
- };
- this.setScissor = function(a, b, c, d) {
- j.scissor(a, b, c, d)
- };
- this.enableScissorTest = function(a) {
- a ? j.enable(j.SCISSOR_TEST) : j.disable(j.SCISSOR_TEST)
- };
- this.setClearColor = function(a, b) {
- Q.set(a);
- R = void 0 !== b ? b : 1;
- j.clearColor(Q.r, Q.g, Q.b, R)
- };
- this.setClearColorHex = function(a, b) {
- console.warn("DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.");
- this.setClearColor(a, b)
- };
- this.getClearColor = function() {
- return Q
- };
- this.getClearAlpha = function() {
- return R
- };
- this.clear = function(a, b, c) {
- var d = 0;
- if (void 0 === a || a) d |= j.COLOR_BUFFER_BIT;
- if (void 0 === b || b) d |= j.DEPTH_BUFFER_BIT;
- if (void 0 === c || c) d |= j.STENCIL_BUFFER_BIT;
- j.clear(d)
- };
- this.clearColor = function() {
- j.clear(j.COLOR_BUFFER_BIT)
- };
- this.clearDepth = function() {
- j.clear(j.DEPTH_BUFFER_BIT)
- };
- this.clearStencil = function() {
- j.clear(j.STENCIL_BUFFER_BIT)
- };
- this.clearTarget = function(a, b, c, d) {
- this.setRenderTarget(a);
- this.clear(b, c, d)
- };
- this.addPostPlugin = function(a) {
- a.init(this);
- this.renderPluginsPost.push(a)
- };
- this.addPrePlugin = function(a) {
- a.init(this);
- this.renderPluginsPre.push(a)
- };
- this.updateShadowMap = function(a, b) {
- Ba = null;
- Aa = $ = ka = Ga = ja = -1;
- ta = !0;
- U = Y = -1;
- this.shadowMapPlugin.update(a, b)
- };
- var Cb = function(a) {
- a = a.target;
- a.removeEventListener("dispose", Cb);
- a.__webglInit = void 0;
- if (a instanceof THREE.BufferGeometry) {
- var b = a.attributes,
- c;
- for (c in b) void 0 !== b[c].buffer && j.deleteBuffer(b[c].buffer);
- L.info.memory.geometries--
- } else if (void 0 !== a.geometryGroups) for (b in a.geometryGroups) {
- c = a.geometryGroups[b];
- if (void 0 !== c.numMorphTargets) for (var d = 0, e = c.numMorphTargets; d < e; d++) j.deleteBuffer(c.__webglMorphTargetsBuffers[d]);
- if (void 0 !== c.numMorphNormals) {
- d = 0;
- for (e = c.numMorphNormals; d < e; d++) j.deleteBuffer(c.__webglMorphNormalsBuffers[d])
- }
- Hb(c)
- } else Hb(a)
- }, Db = function(a) {
- a = a.target;
- a.removeEventListener("dispose", Db);
- a.image && a.image.__webglTextureCube ? j.deleteTexture(a.image.__webglTextureCube) : a.__webglInit && (a.__webglInit = !1, j.deleteTexture(a.__webglTexture));
- L.info.memory.textures--
- }, Eb = function(a) {
- a = a.target;
- a.removeEventListener("dispose",
- Eb);
- if (a && a.__webglTexture) if (j.deleteTexture(a.__webglTexture), a instanceof THREE.WebGLRenderTargetCube) for (var b = 0; 6 > b; b++) j.deleteFramebuffer(a.__webglFramebuffer[b]), j.deleteRenderbuffer(a.__webglRenderbuffer[b]);
- else j.deleteFramebuffer(a.__webglFramebuffer), j.deleteRenderbuffer(a.__webglRenderbuffer);
- L.info.memory.textures--
- }, Fb = function(a) {
- a = a.target;
- a.removeEventListener("dispose", Fb);
- Gb(a)
- }, Hb = function(a) {
- void 0 !== a.__webglVertexBuffer && j.deleteBuffer(a.__webglVertexBuffer);
- void 0 !== a.__webglNormalBuffer && j.deleteBuffer(a.__webglNormalBuffer);
- void 0 !== a.__webglTangentBuffer && j.deleteBuffer(a.__webglTangentBuffer);
- void 0 !== a.__webglColorBuffer && j.deleteBuffer(a.__webglColorBuffer);
- void 0 !== a.__webglUVBuffer && j.deleteBuffer(a.__webglUVBuffer);
- void 0 !== a.__webglUV2Buffer && j.deleteBuffer(a.__webglUV2Buffer);
- void 0 !== a.__webglSkinIndicesBuffer && j.deleteBuffer(a.__webglSkinIndicesBuffer);
- void 0 !== a.__webglSkinWeightsBuffer && j.deleteBuffer(a.__webglSkinWeightsBuffer);
- void 0 !== a.__webglFaceBuffer && j.deleteBuffer(a.__webglFaceBuffer);
- void 0 !== a.__webglLineBuffer && j.deleteBuffer(a.__webglLineBuffer);
- void 0 !== a.__webglLineDistanceBuffer && j.deleteBuffer(a.__webglLineDistanceBuffer);
- if (void 0 !== a.__webglCustomAttributesList) for (var b in a.__webglCustomAttributesList) j.deleteBuffer(a.__webglCustomAttributesList[b].buffer);
- L.info.memory.geometries--
- }, Gb = function(a) {
- var b = a.program;
- if (void 0 !== b) {
- a.program = void 0;
- var c, d, e = !1,
- a = 0;
- for (c = da.length; a < c; a++) if (d = da[a], d.program === b) {
- d.usedTimes--;
- 0 === d.usedTimes && (e = !0);
- break
- }
- if (!0 === e) {
- e = [];
- a = 0;
- for (c = da.length; a < c; a++) d = da[a], d.program !== b && e.push(d);
- da = e;
- j.deleteProgram(b);
- L.info.memory.programs--
- }
- }
- };
- this.renderBufferImmediate = function(a, b, c) {
- a.hasPositions && !a.__webglVertexBuffer && (a.__webglVertexBuffer = j.createBuffer());
- a.hasNormals && !a.__webglNormalBuffer && (a.__webglNormalBuffer = j.createBuffer());
- a.hasUvs && !a.__webglUvBuffer && (a.__webglUvBuffer = j.createBuffer());
- a.hasColors && !a.__webglColorBuffer && (a.__webglColorBuffer = j.createBuffer());
- a.hasPositions && (j.bindBuffer(j.ARRAY_BUFFER,
- a.__webglVertexBuffer), j.bufferData(j.ARRAY_BUFFER, a.positionArray, j.DYNAMIC_DRAW), j.enableVertexAttribArray(b.attributes.position), j.vertexAttribPointer(b.attributes.position, 3, j.FLOAT, !1, 0, 0));
- if (a.hasNormals) {
- j.bindBuffer(j.ARRAY_BUFFER, a.__webglNormalBuffer);
- if (c.shading === THREE.FlatShading) {
- var d, e, f, g, h, i, k, l, m, n, p, q = 3 * a.count;
- for (p = 0; p < q; p += 9) n = a.normalArray, d = n[p], e = n[p + 1], f = n[p + 2], g = n[p + 3], i = n[p + 4], l = n[p + 5], h = n[p + 6], k = n[p + 7], m = n[p + 8], d = (d + g + h) / 3, e = (e + i + k) / 3, f = (f + l + m) / 3, n[p] = d, n[p + 1] = e, n[p + 2] = f, n[p + 3] = d, n[p + 4] = e, n[p + 5] = f, n[p + 6] = d, n[p + 7] = e, n[p + 8] = f
- }
- j.bufferData(j.ARRAY_BUFFER, a.normalArray, j.DYNAMIC_DRAW);
- j.enableVertexAttribArray(b.attributes.normal);
- j.vertexAttribPointer(b.attributes.normal, 3, j.FLOAT, !1, 0, 0)
- }
- a.hasUvs && c.map && (j.bindBuffer(j.ARRAY_BUFFER, a.__webglUvBuffer), j.bufferData(j.ARRAY_BUFFER, a.uvArray, j.DYNAMIC_DRAW), j.enableVertexAttribArray(b.attributes.uv), j.vertexAttribPointer(b.attributes.uv, 2, j.FLOAT, !1, 0, 0));
- a.hasColors && c.vertexColors !== THREE.NoColors && (j.bindBuffer(j.ARRAY_BUFFER,
- a.__webglColorBuffer), j.bufferData(j.ARRAY_BUFFER, a.colorArray, j.DYNAMIC_DRAW), j.enableVertexAttribArray(b.attributes.color), j.vertexAttribPointer(b.attributes.color, 3, j.FLOAT, !1, 0, 0));
- j.drawArrays(j.TRIANGLES, 0, a.count);
- a.count = 0
- };
- this.renderBufferDirect = function(a, b, c, d, e, f) {
- if (!1 !== d.visible) {
- var i, k, l, m;
- i = z(a, b, c, d, f);
- b = i.attributes;
- a = e.attributes;
- c = !1;
- i = 16777215 * e.id + 2 * i.id + (d.wireframe ? 1 : 0);
- i !== $ && ($ = i, c = !0);
- c && g();
- if (f instanceof THREE.Mesh) if (f = a.index) {
- e = e.offsets;
- 1 < e.length && (c = !0);
- for (var n = 0, p = e.length; n < p; n++) {
- var q = e[n].index;
- if (c) {
- for (k in b) l = b[k], i = a[k], 0 <= l && (i ? (m = i.itemSize, j.bindBuffer(j.ARRAY_BUFFER, i.buffer), h(l), j.vertexAttribPointer(l, m, j.FLOAT, !1, 0, 4 * q * m)) : d.defaultAttributeValues && (2 === d.defaultAttributeValues[k].length ? j.vertexAttrib2fv(l, d.defaultAttributeValues[k]) : 3 === d.defaultAttributeValues[k].length && j.vertexAttrib3fv(l, d.defaultAttributeValues[k])));
- j.bindBuffer(j.ELEMENT_ARRAY_BUFFER, f.buffer)
- }
- j.drawElements(j.TRIANGLES, e[n].count, j.UNSIGNED_SHORT, 2 * e[n].start);
- L.info.render.calls++;
- L.info.render.vertices += e[n].count;
- L.info.render.faces += e[n].count / 3
- }
- } else {
- if (c) for (k in b) "index" !== k && (l = b[k], i = a[k], 0 <= l && (i ? (m = i.itemSize, j.bindBuffer(j.ARRAY_BUFFER, i.buffer), h(l), j.vertexAttribPointer(l, m, j.FLOAT, !1, 0, 0)) : d.defaultAttributeValues && d.defaultAttributeValues[k] && (2 === d.defaultAttributeValues[k].length ? j.vertexAttrib2fv(l, d.defaultAttributeValues[k]) : 3 === d.defaultAttributeValues[k].length && j.vertexAttrib3fv(l, d.defaultAttributeValues[k]))));
- d = e.attributes.position;
- j.drawArrays(j.TRIANGLES, 0, d.numItems / 3);
- L.info.render.calls++;
- L.info.render.vertices += d.numItems / 3;
- L.info.render.faces += d.numItems / 3 / 3
- } else if (f instanceof THREE.ParticleSystem) {
- if (c) {
- for (k in b) l = b[k], i = a[k], 0 <= l && (i ? (m = i.itemSize, j.bindBuffer(j.ARRAY_BUFFER, i.buffer), h(l), j.vertexAttribPointer(l, m, j.FLOAT, !1, 0, 0)) : d.defaultAttributeValues && d.defaultAttributeValues[k] && (2 === d.defaultAttributeValues[k].length ? j.vertexAttrib2fv(l, d.defaultAttributeValues[k]) : 3 === d.defaultAttributeValues[k].length && j.vertexAttrib3fv(l, d.defaultAttributeValues[k])));
- d = a.position;
- j.drawArrays(j.POINTS, 0, d.numItems / 3);
- L.info.render.calls++;
- L.info.render.points += d.numItems / 3
- }
- } else if (f instanceof THREE.Line && c) {
- for (k in b) l = b[k], i = a[k], 0 <= l && (i ? (m = i.itemSize, j.bindBuffer(j.ARRAY_BUFFER, i.buffer), h(l), j.vertexAttribPointer(l, m, j.FLOAT, !1, 0, 0)) : d.defaultAttributeValues && d.defaultAttributeValues[k] && (2 === d.defaultAttributeValues[k].length ? j.vertexAttrib2fv(l, d.defaultAttributeValues[k]) : 3 === d.defaultAttributeValues[k].length && j.vertexAttrib3fv(l, d.defaultAttributeValues[k])));
- k = f.type === THREE.LineStrip ? j.LINE_STRIP : j.LINES;
- E(d.linewidth);
- d = a.position;
- j.drawArrays(k, 0, d.numItems / 3);
- L.info.render.calls++;
- L.info.render.points += d.numItems
- }
- }
- };
- this.renderBuffer = function(a, b, c, d, e, f) {
- if (!1 !== d.visible) {
- var i, l, c = z(a, b, c, d, f),
- a = c.attributes,
- b = !1,
- c = 16777215 * e.id + 2 * c.id + (d.wireframe ? 1 : 0);
- c !== $ && ($ = c, b = !0);
- b && g();
- if (!d.morphTargets && 0 <= a.position) b && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglVertexBuffer), h(a.position), j.vertexAttribPointer(a.position,
- 3, j.FLOAT, !1, 0, 0));
- else if (f.morphTargetBase) {
- c = d.program.attributes; - 1 !== f.morphTargetBase && 0 <= c.position ? (j.bindBuffer(j.ARRAY_BUFFER, e.__webglMorphTargetsBuffers[f.morphTargetBase]), h(c.position), j.vertexAttribPointer(c.position, 3, j.FLOAT, !1, 0, 0)) : 0 <= c.position && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglVertexBuffer), h(c.position), j.vertexAttribPointer(c.position, 3, j.FLOAT, !1, 0, 0));
- if (f.morphTargetForcedOrder.length) {
- var m = 0;
- l = f.morphTargetForcedOrder;
- for (i = f.morphTargetInfluences; m < d.numSupportedMorphTargets && m < l.length;) 0 <= c["morphTarget" + m] && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglMorphTargetsBuffers[l[m]]), h(c["morphTarget" + m]), j.vertexAttribPointer(c["morphTarget" + m], 3, j.FLOAT, !1, 0, 0)), 0 <= c["morphNormal" + m] && d.morphNormals && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglMorphNormalsBuffers[l[m]]), h(c["morphNormal" + m]), j.vertexAttribPointer(c["morphNormal" + m], 3, j.FLOAT, !1, 0, 0)), f.__webglMorphTargetInfluences[m] = i[l[m]], m++
- } else {
- l = [];
- i = f.morphTargetInfluences;
- var n, p = i.length;
- for (n = 0; n < p; n++) m = i[n], 0 < m && l.push([m,
- n]);
- l.length > d.numSupportedMorphTargets ? (l.sort(k), l.length = d.numSupportedMorphTargets) : l.length > d.numSupportedMorphNormals ? l.sort(k) : 0 === l.length && l.push([0, 0]);
- for (m = 0; m < d.numSupportedMorphTargets;) l[m] ? (n = l[m][1], 0 <= c["morphTarget" + m] && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglMorphTargetsBuffers[n]), h(c["morphTarget" + m]), j.vertexAttribPointer(c["morphTarget" + m], 3, j.FLOAT, !1, 0, 0)), 0 <= c["morphNormal" + m] && d.morphNormals && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglMorphNormalsBuffers[n]), h(c["morphNormal" + m]), j.vertexAttribPointer(c["morphNormal" + m], 3, j.FLOAT, !1, 0, 0)), f.__webglMorphTargetInfluences[m] = i[n]) : f.__webglMorphTargetInfluences[m] = 0, m++
- }
- null !== d.program.uniforms.morphTargetInfluences && j.uniform1fv(d.program.uniforms.morphTargetInfluences, f.__webglMorphTargetInfluences)
- }
- if (b) {
- if (e.__webglCustomAttributesList) {
- i = 0;
- for (l = e.__webglCustomAttributesList.length; i < l; i++) c = e.__webglCustomAttributesList[i], 0 <= a[c.buffer.belongsToAttribute] && (j.bindBuffer(j.ARRAY_BUFFER, c.buffer), h(a[c.buffer.belongsToAttribute]),
- j.vertexAttribPointer(a[c.buffer.belongsToAttribute], c.size, j.FLOAT, !1, 0, 0))
- }
- 0 <= a.color && (0 < f.geometry.colors.length || 0 < f.geometry.faces.length ? (j.bindBuffer(j.ARRAY_BUFFER, e.__webglColorBuffer), h(a.color), j.vertexAttribPointer(a.color, 3, j.FLOAT, !1, 0, 0)) : d.defaultAttributeValues && j.vertexAttrib3fv(a.color, d.defaultAttributeValues.color));
- 0 <= a.normal && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglNormalBuffer), h(a.normal), j.vertexAttribPointer(a.normal, 3, j.FLOAT, !1, 0, 0));
- 0 <= a.tangent && (j.bindBuffer(j.ARRAY_BUFFER,
- e.__webglTangentBuffer), h(a.tangent), j.vertexAttribPointer(a.tangent, 4, j.FLOAT, !1, 0, 0));
- 0 <= a.uv && (f.geometry.faceVertexUvs[0] ? (j.bindBuffer(j.ARRAY_BUFFER, e.__webglUVBuffer), h(a.uv), j.vertexAttribPointer(a.uv, 2, j.FLOAT, !1, 0, 0)) : d.defaultAttributeValues && j.vertexAttrib2fv(a.uv, d.defaultAttributeValues.uv));
- 0 <= a.uv2 && (f.geometry.faceVertexUvs[1] ? (j.bindBuffer(j.ARRAY_BUFFER, e.__webglUV2Buffer), h(a.uv2), j.vertexAttribPointer(a.uv2, 2, j.FLOAT, !1, 0, 0)) : d.defaultAttributeValues && j.vertexAttrib2fv(a.uv2,
- d.defaultAttributeValues.uv2));
- d.skinning && (0 <= a.skinIndex && 0 <= a.skinWeight) && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglSkinIndicesBuffer), h(a.skinIndex), j.vertexAttribPointer(a.skinIndex, 4, j.FLOAT, !1, 0, 0), j.bindBuffer(j.ARRAY_BUFFER, e.__webglSkinWeightsBuffer), h(a.skinWeight), j.vertexAttribPointer(a.skinWeight, 4, j.FLOAT, !1, 0, 0));
- 0 <= a.lineDistance && (j.bindBuffer(j.ARRAY_BUFFER, e.__webglLineDistanceBuffer), h(a.lineDistance), j.vertexAttribPointer(a.lineDistance, 1, j.FLOAT, !1, 0, 0))
- }
- f instanceof THREE.Mesh ? (d.wireframe ? (E(d.wireframeLinewidth), b && j.bindBuffer(j.ELEMENT_ARRAY_BUFFER, e.__webglLineBuffer), j.drawElements(j.LINES, e.__webglLineCount, j.UNSIGNED_SHORT, 0)) : (b && j.bindBuffer(j.ELEMENT_ARRAY_BUFFER, e.__webglFaceBuffer), j.drawElements(j.TRIANGLES, e.__webglFaceCount, j.UNSIGNED_SHORT, 0)), L.info.render.calls++, L.info.render.vertices += e.__webglFaceCount, L.info.render.faces += e.__webglFaceCount / 3) : f instanceof THREE.Line ? (f = f.type === THREE.LineStrip ? j.LINE_STRIP : j.LINES, E(d.linewidth), j.drawArrays(f, 0,
- e.__webglLineCount), L.info.render.calls++) : f instanceof THREE.ParticleSystem && (j.drawArrays(j.POINTS, 0, e.__webglParticleCount), L.info.render.calls++, L.info.render.points += e.__webglParticleCount)
- }
- };
- this.render = function(a, b, c, d) {
- if (!1 === b instanceof THREE.Camera) console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");
- else {
- var e, f, g, h, k = a.__lights,
- n = a.fog;
- Aa = -1;
- ta = !0;
- !0 === a.autoUpdate && a.updateMatrixWorld();
- void 0 === b.parent && b.updateMatrixWorld();
- b.matrixWorldInverse.getInverse(b.matrixWorld);
- Ea.multiplyMatrices(b.projectionMatrix, b.matrixWorldInverse);
- la.setFromMatrix(Ea);
- this.autoUpdateObjects && this.initWebGLObjects(a);
- m(this.renderPluginsPre, a, b);
- L.info.render.calls = 0;
- L.info.render.vertices = 0;
- L.info.render.faces = 0;
- L.info.render.points = 0;
- this.setRenderTarget(c);
- (this.autoClear || d) && this.clear(this.autoClearColor, this.autoClearDepth, this.autoClearStencil);
- h = a.__webglObjects;
- d = 0;
- for (e = h.length; d < e; d++) if (f = h[d], g = f.object, f.id = d, f.render = !1, g.visible && (!(g instanceof THREE.Mesh || g instanceof
- THREE.ParticleSystem) || !g.frustumCulled || la.intersectsObject(g))) {
- var q = g;
- q._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse, q.matrixWorld);
- q._normalMatrix.getNormalMatrix(q._modelViewMatrix);
- var q = f,
- r = q.buffer,
- t = void 0,
- s = t = void 0,
- s = q.object.material;
- if (s instanceof THREE.MeshFaceMaterial) t = r.materialIndex, t = s.materials[t], t.transparent ? (q.transparent = t, q.opaque = null) : (q.opaque = t, q.transparent = null);
- else if (t = s) t.transparent ? (q.transparent = t, q.opaque = null) : (q.opaque = t, q.transparent = null);
- f.render = !0;
- !0 === this.sortObjects && (null !== g.renderDepth ? f.z = g.renderDepth : (ra.setFromMatrixPosition(g.matrixWorld), ra.applyProjection(Ea), f.z = ra.z))
- }
- this.sortObjects && h.sort(i);
- h = a.__webglObjectsImmediate;
- d = 0;
- for (e = h.length; d < e; d++) f = h[d], g = f.object, g.visible && (g._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse, g.matrixWorld), g._normalMatrix.getNormalMatrix(g._modelViewMatrix), g = f.object.material, g.transparent ? (f.transparent = g, f.opaque = null) : (f.opaque = g, f.transparent = null));
- a.overrideMaterial ? (d = a.overrideMaterial,
- this.setBlending(d.blending, d.blendEquation, d.blendSrc, d.blendDst), this.setDepthTest(d.depthTest), this.setDepthWrite(d.depthWrite), A(d.polygonOffset, d.polygonOffsetFactor, d.polygonOffsetUnits), l(a.__webglObjects, !1, "", b, k, n, !0, d), p(a.__webglObjectsImmediate, "", b, k, n, !1, d)) : (d = null, this.setBlending(THREE.NoBlending), l(a.__webglObjects, !0, "opaque", b, k, n, !1, d), p(a.__webglObjectsImmediate, "opaque", b, k, n, !1, d), l(a.__webglObjects, !1, "transparent", b, k, n, !0, d), p(a.__webglObjectsImmediate, "transparent", b,
- k, n, !0, d));
- m(this.renderPluginsPost, a, b);
- c && (c.generateMipmaps && c.minFilter !== THREE.NearestFilter && c.minFilter !== THREE.LinearFilter) && (c instanceof THREE.WebGLRenderTargetCube ? (j.bindTexture(j.TEXTURE_CUBE_MAP, c.__webglTexture), j.generateMipmap(j.TEXTURE_CUBE_MAP), j.bindTexture(j.TEXTURE_CUBE_MAP, null)) : (j.bindTexture(j.TEXTURE_2D, c.__webglTexture), j.generateMipmap(j.TEXTURE_2D), j.bindTexture(j.TEXTURE_2D, null)));
- this.setDepthTest(!0);
- this.setDepthWrite(!0)
- }
- };
- this.renderImmediateObject = function(a,
- b, c, d, e) {
- var f = z(a, b, c, d, e);
- $ = -1;
- L.setMaterialFaces(d);
- e.immediateRenderCallback ? e.immediateRenderCallback(f, j, la) : e.render(function(a) {
- L.renderBufferImmediate(a, f, d)
- })
- };
- this.initWebGLObjects = function(a) {
- a.__webglObjects || (a.__webglObjects = [], a.__webglObjectsImmediate = [], a.__webglSprites = [], a.__webglFlares = []);
- for (; a.__objectsAdded.length;) t(a.__objectsAdded[0], a), a.__objectsAdded.splice(0, 1);
- for (; a.__objectsRemoved.length;) u(a.__objectsRemoved[0], a), a.__objectsRemoved.splice(0, 1);
- for (var b = 0, g = a.__webglObjects.length; b < g; b++) {
- var h = a.__webglObjects[b].object;
- void 0 === h.__webglInit && (void 0 !== h.__webglActive && u(h, a), t(h, a));
- var i = h,
- l = i.geometry,
- m = void 0,
- p = void 0,
- r = void 0;
- if (l instanceof THREE.BufferGeometry) {
- var s = j.DYNAMIC_DRAW,
- v = !l.dynamic,
- z = l.attributes,
- y = void 0,
- x = void 0;
- for (y in z) x = z[y], x.needsUpdate && ("index" === y ? (j.bindBuffer(j.ELEMENT_ARRAY_BUFFER, x.buffer), j.bufferData(j.ELEMENT_ARRAY_BUFFER, x.array, s)) : (j.bindBuffer(j.ARRAY_BUFFER, x.buffer), j.bufferData(j.ARRAY_BUFFER, x.array, s)), x.needsUpdate = !1), v && !x.dynamic && (x.array = null)
- } else if (i instanceof THREE.Mesh) {
- for (var A = 0, B = l.geometryGroupsList.length; A < B; A++) if (m = l.geometryGroupsList[A], r = d(i, m), l.buffersNeedUpdate && c(m, i), p = r.attributes && q(r), l.verticesNeedUpdate || l.morphTargetsNeedUpdate || l.elementsNeedUpdate || l.uvsNeedUpdate || l.normalsNeedUpdate || l.colorsNeedUpdate || l.tangentsNeedUpdate || p) {
- var w = m,
- E = i,
- D = j.DYNAMIC_DRAW,
- G = !l.dynamic,
- F = r;
- if (w.__inittedArrays) {
- var K = e(F),
- I = F.vertexColors ? F.vertexColors : !1,
- L = f(F),
- O = K === THREE.SmoothShading,
- C = void 0,
- J = void 0,
- V = void 0,
- M = void 0,
- Q = void 0,
- ba = void 0,
- R = void 0,
- U = void 0,
- Y = void 0,
- za = void 0,
- $ = void 0,
- P = void 0,
- X = void 0,
- W = void 0,
- Ba = void 0,
- ea = void 0,
- Aa = void 0,
- ca = void 0,
- da = void 0,
- ha = void 0,
- fa = void 0,
- ja = void 0,
- ka = void 0,
- la = void 0,
- na = void 0,
- pa = void 0,
- sa = void 0,
- ta = void 0,
- ua = void 0,
- Ca = void 0,
- Da = void 0,
- Ga = void 0,
- Fa = void 0,
- Ka = void 0,
- Sa = void 0,
- La = void 0,
- va = void 0,
- wa = void 0,
- Qa = void 0,
- Ra = void 0,
- db = 0,
- eb = 0,
- Oa = 0,
- Pa = 0,
- Ua = 0,
- hb = 0,
- Ta = 0,
- tb = 0,
- Za = 0,
- qa = 0,
- xa = 0,
- N = 0,
- Na = void 0,
- ib = w.__vertexArray,
- bb = w.__uvArray,
- cb = w.__uv2Array,
- Ma = w.__normalArray,
- Va = w.__tangentArray,
- jb = w.__colorArray,
- Wa = w.__skinIndexArray,
- Xa = w.__skinWeightArray,
- fb = w.__morphTargetsArrays,
- sb = w.__morphNormalsArrays,
- pb = w.__webglCustomAttributesList,
- H = void 0,
- Pb = w.__faceArray,
- vb = w.__lineArray,
- Ha = E.geometry,
- Bb = Ha.elementsNeedUpdate,
- yb = Ha.uvsNeedUpdate,
- Db = Ha.normalsNeedUpdate,
- Mb = Ha.tangentsNeedUpdate,
- Nb = Ha.colorsNeedUpdate,
- Ob = Ha.morphTargetsNeedUpdate,
- ec = Ha.vertices,
- aa = w.faces3,
- kb = Ha.faces,
- Cb = Ha.faceVertexUvs[0],
- Eb = Ha.faceVertexUvs[1],
- fc = Ha.skinIndices,
- Qb = Ha.skinWeights,
- Rb = Ha.morphTargets,
- Fb = Ha.morphNormals;
- if (Ha.verticesNeedUpdate) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], P = ec[M.a], X = ec[M.b], W = ec[M.c], ib[eb] = P.x, ib[eb + 1] = P.y, ib[eb + 2] = P.z, ib[eb + 3] = X.x, ib[eb + 4] = X.y, ib[eb + 5] = X.z, ib[eb + 6] = W.x, ib[eb + 7] = W.y, ib[eb + 8] = W.z, eb += 9;
- j.bindBuffer(j.ARRAY_BUFFER, w.__webglVertexBuffer);
- j.bufferData(j.ARRAY_BUFFER, ib, D)
- }
- if (Ob) {
- Sa = 0;
- for (La = Rb.length; Sa < La; Sa++) {
- C = xa = 0;
- for (J = aa.length; C < J; C++) Qa = aa[C], M = kb[Qa], P = Rb[Sa].vertices[M.a], X = Rb[Sa].vertices[M.b], W = Rb[Sa].vertices[M.c], va = fb[Sa], va[xa] = P.x,
- va[xa + 1] = P.y, va[xa + 2] = P.z, va[xa + 3] = X.x, va[xa + 4] = X.y, va[xa + 5] = X.z, va[xa + 6] = W.x, va[xa + 7] = W.y, va[xa + 8] = W.z, F.morphNormals && (O ? (Ra = Fb[Sa].vertexNormals[Qa], ca = Ra.a, da = Ra.b, ha = Ra.c) : ha = da = ca = Fb[Sa].faceNormals[Qa], wa = sb[Sa], wa[xa] = ca.x, wa[xa + 1] = ca.y, wa[xa + 2] = ca.z, wa[xa + 3] = da.x, wa[xa + 4] = da.y, wa[xa + 5] = da.z, wa[xa + 6] = ha.x, wa[xa + 7] = ha.y, wa[xa + 8] = ha.z), xa += 9;
- j.bindBuffer(j.ARRAY_BUFFER, w.__webglMorphTargetsBuffers[Sa]);
- j.bufferData(j.ARRAY_BUFFER, fb[Sa], D);
- F.morphNormals && (j.bindBuffer(j.ARRAY_BUFFER, w.__webglMorphNormalsBuffers[Sa]),
- j.bufferData(j.ARRAY_BUFFER, sb[Sa], D))
- }
- }
- if (Qb.length) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], la = Qb[M.a], na = Qb[M.b], pa = Qb[M.c], Xa[qa] = la.x, Xa[qa + 1] = la.y, Xa[qa + 2] = la.z, Xa[qa + 3] = la.w, Xa[qa + 4] = na.x, Xa[qa + 5] = na.y, Xa[qa + 6] = na.z, Xa[qa + 7] = na.w, Xa[qa + 8] = pa.x, Xa[qa + 9] = pa.y, Xa[qa + 10] = pa.z, Xa[qa + 11] = pa.w, sa = fc[M.a], ta = fc[M.b], ua = fc[M.c], Wa[qa] = sa.x, Wa[qa + 1] = sa.y, Wa[qa + 2] = sa.z, Wa[qa + 3] = sa.w, Wa[qa + 4] = ta.x, Wa[qa + 5] = ta.y, Wa[qa + 6] = ta.z, Wa[qa + 7] = ta.w, Wa[qa + 8] = ua.x, Wa[qa + 9] = ua.y, Wa[qa + 10] = ua.z, Wa[qa + 11] = ua.w, qa += 12;
- 0 < qa && (j.bindBuffer(j.ARRAY_BUFFER, w.__webglSkinIndicesBuffer), j.bufferData(j.ARRAY_BUFFER, Wa, D), j.bindBuffer(j.ARRAY_BUFFER, w.__webglSkinWeightsBuffer), j.bufferData(j.ARRAY_BUFFER, Xa, D))
- }
- if (Nb && I) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], R = M.vertexColors, U = M.color, 3 === R.length && I === THREE.VertexColors ? (fa = R[0], ja = R[1], ka = R[2]) : ka = ja = fa = U, jb[Za] = fa.r, jb[Za + 1] = fa.g, jb[Za + 2] = fa.b, jb[Za + 3] = ja.r, jb[Za + 4] = ja.g, jb[Za + 5] = ja.b, jb[Za + 6] = ka.r, jb[Za + 7] = ka.g, jb[Za + 8] = ka.b, Za += 9;
- 0 < Za && (j.bindBuffer(j.ARRAY_BUFFER,
- w.__webglColorBuffer), j.bufferData(j.ARRAY_BUFFER, jb, D))
- }
- if (Mb && Ha.hasTangents) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], Y = M.vertexTangents, Ba = Y[0], ea = Y[1], Aa = Y[2], Va[Ta] = Ba.x, Va[Ta + 1] = Ba.y, Va[Ta + 2] = Ba.z, Va[Ta + 3] = Ba.w, Va[Ta + 4] = ea.x, Va[Ta + 5] = ea.y, Va[Ta + 6] = ea.z, Va[Ta + 7] = ea.w, Va[Ta + 8] = Aa.x, Va[Ta + 9] = Aa.y, Va[Ta + 10] = Aa.z, Va[Ta + 11] = Aa.w, Ta += 12;
- j.bindBuffer(j.ARRAY_BUFFER, w.__webglTangentBuffer);
- j.bufferData(j.ARRAY_BUFFER, Va, D)
- }
- if (Db && K) {
- C = 0;
- for (J = aa.length; C < J; C++) if (M = kb[aa[C]], Q = M.vertexNormals, ba = M.normal,
- 3 === Q.length && O) for (Ca = 0; 3 > Ca; Ca++) Ga = Q[Ca], Ma[hb] = Ga.x, Ma[hb + 1] = Ga.y, Ma[hb + 2] = Ga.z, hb += 3;
- else for (Ca = 0; 3 > Ca; Ca++) Ma[hb] = ba.x, Ma[hb + 1] = ba.y, Ma[hb + 2] = ba.z, hb += 3;
- j.bindBuffer(j.ARRAY_BUFFER, w.__webglNormalBuffer);
- j.bufferData(j.ARRAY_BUFFER, Ma, D)
- }
- if (yb && Cb && L) {
- C = 0;
- for (J = aa.length; C < J; C++) if (V = aa[C], za = Cb[V], void 0 !== za) for (Ca = 0; 3 > Ca; Ca++) Fa = za[Ca], bb[Oa] = Fa.x, bb[Oa + 1] = Fa.y, Oa += 2;
- 0 < Oa && (j.bindBuffer(j.ARRAY_BUFFER, w.__webglUVBuffer), j.bufferData(j.ARRAY_BUFFER, bb, D))
- }
- if (yb && Eb && L) {
- C = 0;
- for (J = aa.length; C < J; C++) if (V = aa[C], $ = Eb[V], void 0 !== $) for (Ca = 0; 3 > Ca; Ca++) Ka = $[Ca], cb[Pa] = Ka.x, cb[Pa + 1] = Ka.y, Pa += 2;
- 0 < Pa && (j.bindBuffer(j.ARRAY_BUFFER, w.__webglUV2Buffer), j.bufferData(j.ARRAY_BUFFER, cb, D))
- }
- if (Bb) {
- C = 0;
- for (J = aa.length; C < J; C++) Pb[Ua] = db, Pb[Ua + 1] = db + 1, Pb[Ua + 2] = db + 2, Ua += 3, vb[tb] = db, vb[tb + 1] = db + 1, vb[tb + 2] = db, vb[tb + 3] = db + 2, vb[tb + 4] = db + 1, vb[tb + 5] = db + 2, tb += 6, db += 3;
- j.bindBuffer(j.ELEMENT_ARRAY_BUFFER, w.__webglFaceBuffer);
- j.bufferData(j.ELEMENT_ARRAY_BUFFER, Pb, D);
- j.bindBuffer(j.ELEMENT_ARRAY_BUFFER, w.__webglLineBuffer);
- j.bufferData(j.ELEMENT_ARRAY_BUFFER, vb, D)
- }
- if (pb) {
- Ca = 0;
- for (Da = pb.length; Ca < Da; Ca++) if (H = pb[Ca], H.__original.needsUpdate) {
- N = 0;
- if (1 === H.size) if (void 0 === H.boundTo || "vertices" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], H.array[N] = H.value[M.a], H.array[N + 1] = H.value[M.b], H.array[N + 2] = H.value[M.c], N += 3
- } else {
- if ("faces" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) Na = H.value[aa[C]], H.array[N] = Na, H.array[N + 1] = Na, H.array[N + 2] = Na, N += 3
- }
- } else if (2 === H.size) if (void 0 === H.boundTo || "vertices" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], P = H.value[M.a], X = H.value[M.b], W = H.value[M.c], H.array[N] = P.x, H.array[N + 1] = P.y, H.array[N + 2] = X.x, H.array[N + 3] = X.y, H.array[N + 4] = W.x, H.array[N + 5] = W.y, N += 6
- } else {
- if ("faces" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) W = X = P = Na = H.value[aa[C]], H.array[N] = P.x, H.array[N + 1] = P.y, H.array[N + 2] = X.x, H.array[N + 3] = X.y, H.array[N + 4] = W.x, H.array[N + 5] = W.y, N += 6
- }
- } else if (3 === H.size) {
- var oa;
- oa = "c" === H.type ? ["r", "g", "b"] : ["x", "y", "z"];
- if (void 0 === H.boundTo || "vertices" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], P = H.value[M.a], X = H.value[M.b], W = H.value[M.c], H.array[N] = P[oa[0]], H.array[N + 1] = P[oa[1]], H.array[N + 2] = P[oa[2]], H.array[N + 3] = X[oa[0]], H.array[N + 4] = X[oa[1]], H.array[N + 5] = X[oa[2]], H.array[N + 6] = W[oa[0]], H.array[N + 7] = W[oa[1]], H.array[N + 8] = W[oa[2]], N += 9
- } else if ("faces" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) W = X = P = Na = H.value[aa[C]], H.array[N] = P[oa[0]], H.array[N + 1] = P[oa[1]], H.array[N + 2] = P[oa[2]], H.array[N + 3] = X[oa[0]], H.array[N + 4] = X[oa[1]], H.array[N + 5] = X[oa[2]], H.array[N + 6] = W[oa[0]],
- H.array[N + 7] = W[oa[1]], H.array[N + 8] = W[oa[2]], N += 9
- } else if ("faceVertices" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) Na = H.value[aa[C]], P = Na[0], X = Na[1], W = Na[2], H.array[N] = P[oa[0]], H.array[N + 1] = P[oa[1]], H.array[N + 2] = P[oa[2]], H.array[N + 3] = X[oa[0]], H.array[N + 4] = X[oa[1]], H.array[N + 5] = X[oa[2]], H.array[N + 6] = W[oa[0]], H.array[N + 7] = W[oa[1]], H.array[N + 8] = W[oa[2]], N += 9
- }
- } else if (4 === H.size) if (void 0 === H.boundTo || "vertices" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) M = kb[aa[C]], P = H.value[M.a], X = H.value[M.b], W = H.value[M.c],
- H.array[N] = P.x, H.array[N + 1] = P.y, H.array[N + 2] = P.z, H.array[N + 3] = P.w, H.array[N + 4] = X.x, H.array[N + 5] = X.y, H.array[N + 6] = X.z, H.array[N + 7] = X.w, H.array[N + 8] = W.x, H.array[N + 9] = W.y, H.array[N + 10] = W.z, H.array[N + 11] = W.w, N += 12
- } else if ("faces" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) W = X = P = Na = H.value[aa[C]], H.array[N] = P.x, H.array[N + 1] = P.y, H.array[N + 2] = P.z, H.array[N + 3] = P.w, H.array[N + 4] = X.x, H.array[N + 5] = X.y, H.array[N + 6] = X.z, H.array[N + 7] = X.w, H.array[N + 8] = W.x, H.array[N + 9] = W.y, H.array[N + 10] = W.z, H.array[N + 11] = W.w, N += 12
- } else if ("faceVertices" === H.boundTo) {
- C = 0;
- for (J = aa.length; C < J; C++) Na = H.value[aa[C]], P = Na[0], X = Na[1], W = Na[2], H.array[N] = P.x, H.array[N + 1] = P.y, H.array[N + 2] = P.z, H.array[N + 3] = P.w, H.array[N + 4] = X.x, H.array[N + 5] = X.y, H.array[N + 6] = X.z, H.array[N + 7] = X.w, H.array[N + 8] = W.x, H.array[N + 9] = W.y, H.array[N + 10] = W.z, H.array[N + 11] = W.w, N += 12
- }
- j.bindBuffer(j.ARRAY_BUFFER, H.buffer);
- j.bufferData(j.ARRAY_BUFFER, H.array, D)
- }
- }
- G && (delete w.__inittedArrays, delete w.__colorArray, delete w.__normalArray, delete w.__tangentArray, delete w.__uvArray, delete w.__uv2Array,
- delete w.__faceArray, delete w.__vertexArray, delete w.__lineArray, delete w.__skinIndexArray, delete w.__skinWeightArray)
- }
- }
- l.verticesNeedUpdate = !1;
- l.morphTargetsNeedUpdate = !1;
- l.elementsNeedUpdate = !1;
- l.uvsNeedUpdate = !1;
- l.normalsNeedUpdate = !1;
- l.colorsNeedUpdate = !1;
- l.tangentsNeedUpdate = !1;
- l.buffersNeedUpdate = !1;
- r.attributes && n(r)
- } else if (i instanceof THREE.Line) {
- r = d(i, l);
- p = r.attributes && q(r);
- if (l.verticesNeedUpdate || l.colorsNeedUpdate || l.lineDistancesNeedUpdate || p) {
- var Ya = l,
- Sb = j.DYNAMIC_DRAW,
- Ib = void 0,
- Jb = void 0,
- Kb = void 0,
- Tb = void 0,
- ma = void 0,
- Ub = void 0,
- Gb = Ya.vertices,
- Hb = Ya.colors,
- kc = Ya.lineDistances,
- Zb = Gb.length,
- $b = Hb.length,
- ac = kc.length,
- Vb = Ya.__vertexArray,
- Wb = Ya.__colorArray,
- lc = Ya.__lineDistanceArray,
- bc = Ya.colorsNeedUpdate,
- cc = Ya.lineDistancesNeedUpdate,
- gc = Ya.__webglCustomAttributesList,
- Xb = void 0,
- mc = void 0,
- ya = void 0,
- zb = void 0,
- Ia = void 0,
- ia = void 0;
- if (Ya.verticesNeedUpdate) {
- for (Ib = 0; Ib < Zb; Ib++) Tb = Gb[Ib], ma = 3 * Ib, Vb[ma] = Tb.x, Vb[ma + 1] = Tb.y, Vb[ma + 2] = Tb.z;
- j.bindBuffer(j.ARRAY_BUFFER, Ya.__webglVertexBuffer);
- j.bufferData(j.ARRAY_BUFFER, Vb, Sb)
- }
- if (bc) {
- for (Jb = 0; Jb < $b; Jb++) Ub = Hb[Jb], ma = 3 * Jb, Wb[ma] = Ub.r, Wb[ma + 1] = Ub.g, Wb[ma + 2] = Ub.b;
- j.bindBuffer(j.ARRAY_BUFFER, Ya.__webglColorBuffer);
- j.bufferData(j.ARRAY_BUFFER, Wb, Sb)
- }
- if (cc) {
- for (Kb = 0; Kb < ac; Kb++) lc[Kb] = kc[Kb];
- j.bindBuffer(j.ARRAY_BUFFER, Ya.__webglLineDistanceBuffer);
- j.bufferData(j.ARRAY_BUFFER, lc, Sb)
- }
- if (gc) {
- Xb = 0;
- for (mc = gc.length; Xb < mc; Xb++) if (ia = gc[Xb], ia.needsUpdate && (void 0 === ia.boundTo || "vertices" === ia.boundTo)) {
- ma = 0;
- zb = ia.value.length;
- if (1 === ia.size) for (ya = 0; ya < zb; ya++) ia.array[ya] = ia.value[ya];
- else if (2 === ia.size) for (ya = 0; ya < zb; ya++) Ia = ia.value[ya], ia.array[ma] = Ia.x, ia.array[ma + 1] = Ia.y, ma += 2;
- else if (3 === ia.size) if ("c" === ia.type) for (ya = 0; ya < zb; ya++) Ia = ia.value[ya], ia.array[ma] = Ia.r, ia.array[ma + 1] = Ia.g, ia.array[ma + 2] = Ia.b, ma += 3;
- else for (ya = 0; ya < zb; ya++) Ia = ia.value[ya], ia.array[ma] = Ia.x, ia.array[ma + 1] = Ia.y, ia.array[ma + 2] = Ia.z, ma += 3;
- else if (4 === ia.size) for (ya = 0; ya < zb; ya++) Ia = ia.value[ya], ia.array[ma] = Ia.x, ia.array[ma + 1] = Ia.y, ia.array[ma + 2] = Ia.z, ia.array[ma + 3] = Ia.w, ma += 4;
- j.bindBuffer(j.ARRAY_BUFFER, ia.buffer);
- j.bufferData(j.ARRAY_BUFFER, ia.array, Sb)
- }
- }
- }
- l.verticesNeedUpdate = !1;
- l.colorsNeedUpdate = !1;
- l.lineDistancesNeedUpdate = !1;
- r.attributes && n(r)
- } else if (i instanceof THREE.ParticleSystem) {
- r = d(i, l);
- p = r.attributes && q(r);
- if (l.verticesNeedUpdate || l.colorsNeedUpdate || i.sortParticles || p) {
- var lb = l,
- hc = j.DYNAMIC_DRAW,
- Lb = i,
- Ja = void 0,
- mb = void 0,
- nb = void 0,
- T = void 0,
- ob = void 0,
- ub = void 0,
- Yb = lb.vertices,
- ic = Yb.length,
- jc = lb.colors,
- nc = jc.length,
- wb = lb.__vertexArray,
- xb = lb.__colorArray,
- qb = lb.__sortArray,
- oc = lb.verticesNeedUpdate,
- pc = lb.colorsNeedUpdate,
- rb = lb.__webglCustomAttributesList,
- $a = void 0,
- Ab = void 0,
- Z = void 0,
- ab = void 0,
- ga = void 0,
- S = void 0;
- if (Lb.sortParticles) {
- gb.copy(Ea);
- gb.multiply(Lb.matrixWorld);
- for (Ja = 0; Ja < ic; Ja++) nb = Yb[Ja], ra.copy(nb), ra.applyProjection(gb), qb[Ja] = [ra.z, Ja];
- qb.sort(k);
- for (Ja = 0; Ja < ic; Ja++) nb = Yb[qb[Ja][1]], T = 3 * Ja, wb[T] = nb.x, wb[T + 1] = nb.y, wb[T + 2] = nb.z;
- for (mb = 0; mb < nc; mb++) T = 3 * mb, ub = jc[qb[mb][1]], xb[T] = ub.r, xb[T + 1] = ub.g, xb[T + 2] = ub.b;
- if (rb) {
- $a = 0;
- for (Ab = rb.length; $a < Ab; $a++) if (S = rb[$a], void 0 === S.boundTo || "vertices" === S.boundTo) if (T = 0, ab = S.value.length, 1 === S.size) for (Z = 0; Z < ab; Z++) ob = qb[Z][1], S.array[Z] = S.value[ob];
- else if (2 === S.size) for (Z = 0; Z < ab; Z++) ob = qb[Z][1], ga = S.value[ob], S.array[T] = ga.x, S.array[T + 1] = ga.y, T += 2;
- else if (3 === S.size) if ("c" === S.type) for (Z = 0; Z < ab; Z++) ob = qb[Z][1], ga = S.value[ob], S.array[T] = ga.r, S.array[T + 1] = ga.g, S.array[T + 2] = ga.b, T += 3;
- else for (Z = 0; Z < ab; Z++) ob = qb[Z][1], ga = S.value[ob], S.array[T] = ga.x, S.array[T + 1] = ga.y, S.array[T + 2] = ga.z, T += 3;
- else if (4 === S.size) for (Z = 0; Z < ab; Z++) ob = qb[Z][1], ga = S.value[ob], S.array[T] = ga.x, S.array[T + 1] = ga.y, S.array[T + 2] = ga.z, S.array[T + 3] = ga.w, T += 4
- }
- } else {
- if (oc) for (Ja = 0; Ja < ic; Ja++) nb = Yb[Ja], T = 3 * Ja, wb[T] = nb.x, wb[T + 1] = nb.y, wb[T + 2] = nb.z;
- if (pc) for (mb = 0; mb < nc; mb++) ub = jc[mb], T = 3 * mb, xb[T] = ub.r, xb[T + 1] = ub.g, xb[T + 2] = ub.b;
- if (rb) {
- $a = 0;
- for (Ab = rb.length; $a < Ab; $a++) if (S = rb[$a], S.needsUpdate && (void 0 === S.boundTo || "vertices" === S.boundTo)) if (ab = S.value.length, T = 0, 1 === S.size) for (Z = 0; Z < ab; Z++) S.array[Z] = S.value[Z];
- else if (2 === S.size) for (Z = 0; Z < ab; Z++) ga = S.value[Z], S.array[T] = ga.x, S.array[T + 1] = ga.y, T += 2;
- else if (3 === S.size) if ("c" === S.type) for (Z = 0; Z < ab; Z++) ga = S.value[Z], S.array[T] = ga.r, S.array[T + 1] = ga.g, S.array[T + 2] = ga.b, T += 3;
- else for (Z = 0; Z < ab; Z++) ga = S.value[Z], S.array[T] = ga.x, S.array[T + 1] = ga.y, S.array[T + 2] = ga.z, T += 3;
- else if (4 === S.size) for (Z = 0; Z < ab; Z++) ga = S.value[Z], S.array[T] = ga.x, S.array[T + 1] = ga.y, S.array[T + 2] = ga.z, S.array[T + 3] = ga.w, T += 4
- }
- }
- if (oc || Lb.sortParticles) j.bindBuffer(j.ARRAY_BUFFER, lb.__webglVertexBuffer), j.bufferData(j.ARRAY_BUFFER,
- wb, hc);
- if (pc || Lb.sortParticles) j.bindBuffer(j.ARRAY_BUFFER, lb.__webglColorBuffer), j.bufferData(j.ARRAY_BUFFER, xb, hc);
- if (rb) {
- $a = 0;
- for (Ab = rb.length; $a < Ab; $a++) if (S = rb[$a], S.needsUpdate || Lb.sortParticles) j.bindBuffer(j.ARRAY_BUFFER, S.buffer), j.bufferData(j.ARRAY_BUFFER, S.array, hc)
- }
- }
- l.verticesNeedUpdate = !1;
- l.colorsNeedUpdate = !1;
- r.attributes && n(r)
- }
- }
- };
- this.initMaterial = function(a, b, c, d) {
- var e, f, g, h;
- a.addEventListener("dispose", Fb);
- var i, k, l, m, n;
- a instanceof THREE.MeshDepthMaterial ? n = "depth" : a instanceof
- THREE.MeshNormalMaterial ? n = "normal" : a instanceof THREE.MeshBasicMaterial ? n = "basic" : a instanceof THREE.MeshLambertMaterial ? n = "lambert" : a instanceof THREE.MeshPhongMaterial ? n = "phong" : a instanceof THREE.LineBasicMaterial ? n = "basic" : a instanceof THREE.LineDashedMaterial ? n = "dashed" : a instanceof THREE.ParticleSystemMaterial && (n = "particle_basic");
- if (n) {
- var p = THREE.ShaderLib[n];
- a.uniforms = THREE.UniformsUtils.clone(p.uniforms);
- a.vertexShader = p.vertexShader;
- a.fragmentShader = p.fragmentShader
- }
- var q = e = 0,
- r = 0,
- t = p = 0;
- for (f = b.length; t < f; t++) g = b[t], g.onlyShadow || (g instanceof THREE.DirectionalLight && e++, g instanceof THREE.PointLight && q++, g instanceof THREE.SpotLight && r++, g instanceof THREE.HemisphereLight && p++);
- f = q;
- g = r;
- h = p;
- r = p = 0;
- for (q = b.length; r < q; r++) t = b[r], t.castShadow && (t instanceof THREE.SpotLight && p++, t instanceof THREE.DirectionalLight && !t.shadowCascade && p++);
- m = p;
- yb && d && d.useVertexTexture ? l = 1024 : (b = j.getParameter(j.MAX_VERTEX_UNIFORM_VECTORS), b = Math.floor((b - 20) / 4), void 0 !== d && d instanceof THREE.SkinnedMesh && (b = Math.min(d.bones.length, b), b < d.bones.length && console.warn("WebGLRenderer: too many bones - " + d.bones.length + ", this GPU supports just " + b + " (try OpenGL instead of ANGLE)")), l = b);
- a: {
- var r = a.fragmentShader,
- q = a.vertexShader,
- p = a.uniforms,
- b = a.attributes,
- t = a.defines,
- c = {
- map: !! a.map,
- envMap: !! a.envMap,
- lightMap: !! a.lightMap,
- bumpMap: !! a.bumpMap,
- normalMap: !! a.normalMap,
- specularMap: !! a.specularMap,
- vertexColors: a.vertexColors,
- fog: c,
- useFog: a.fog,
- fogExp: c instanceof THREE.FogExp2,
- sizeAttenuation: a.sizeAttenuation,
- skinning: a.skinning,
- maxBones: l,
- useVertexTexture: yb && d && d.useVertexTexture,
- morphTargets: a.morphTargets,
- morphNormals: a.morphNormals,
- maxMorphTargets: this.maxMorphTargets,
- maxMorphNormals: this.maxMorphNormals,
- maxDirLights: e,
- maxPointLights: f,
- maxSpotLights: g,
- maxHemiLights: h,
- maxShadows: m,
- shadowMapEnabled: this.shadowMapEnabled && d.receiveShadow,
- shadowMapType: this.shadowMapType,
- shadowMapDebug: this.shadowMapDebug,
- shadowMapCascade: this.shadowMapCascade,
- alphaTest: a.alphaTest,
- metal: a.metal,
- perPixel: a.perPixel,
- wrapAround: a.wrapAround,
- doubleSided: a.side === THREE.DoubleSide,
- flipSided: a.side === THREE.BackSide
- }, d = a.index0AttributeName,
- s, u, v;
- e = [];
- n ? e.push(n) : (e.push(r), e.push(q));
- for (u in t) e.push(u), e.push(t[u]);
- for (s in c) e.push(s), e.push(c[s]);
- n = e.join();
- s = 0;
- for (u = da.length; s < u; s++) if (e = da[s], e.code === n) {
- e.usedTimes++;
- k = e.program;
- break a
- }
- s = "SHADOWMAP_TYPE_BASIC";
- c.shadowMapType === THREE.PCFShadowMap ? s = "SHADOWMAP_TYPE_PCF" : c.shadowMapType === THREE.PCFSoftShadowMap && (s = "SHADOWMAP_TYPE_PCF_SOFT");
- u = [];
- for (v in t) e = t[v], !1 !== e && (e = "#define " + v + " " + e, u.push(e));
- e = u.join("\n");
- v = j.createProgram();
- u = ["precision " + M + " float;", "precision " + M + " int;", e, Bb ? "#define VERTEX_TEXTURES" : "", L.gammaInput ? "#define GAMMA_INPUT" : "", L.gammaOutput ? "#define GAMMA_OUTPUT" : "", L.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "", "#define MAX_DIR_LIGHTS " + c.maxDirLights, "#define MAX_POINT_LIGHTS " + c.maxPointLights, "#define MAX_SPOT_LIGHTS " + c.maxSpotLights, "#define MAX_HEMI_LIGHTS " + c.maxHemiLights, "#define MAX_SHADOWS " + c.maxShadows, "#define MAX_BONES " + c.maxBones, c.map ? "#define USE_MAP" : "", c.envMap ? "#define USE_ENVMAP" : "", c.lightMap ? "#define USE_LIGHTMAP" : "", c.bumpMap ? "#define USE_BUMPMAP" : "", c.normalMap ? "#define USE_NORMALMAP" : "", c.specularMap ? "#define USE_SPECULARMAP" : "", c.vertexColors ? "#define USE_COLOR" : "", c.skinning ? "#define USE_SKINNING" : "", c.useVertexTexture ? "#define BONE_TEXTURE" : "", c.morphTargets ? "#define USE_MORPHTARGETS" : "", c.morphNormals ? "#define USE_MORPHNORMALS" : "", c.perPixel ? "#define PHONG_PER_PIXEL" : "", c.wrapAround ? "#define WRAP_AROUND" : "", c.doubleSided ? "#define DOUBLE_SIDED" : "", c.flipSided ? "#define FLIP_SIDED" : "", c.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", c.shadowMapEnabled ? "#define " + s : "", c.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", c.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", c.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", "uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
- s = ["precision " + M + " float;", "precision " + M + " int;", c.bumpMap || c.normalMap ? "#extension GL_OES_standard_derivatives : enable" : "", e, "#define MAX_DIR_LIGHTS " + c.maxDirLights, "#define MAX_POINT_LIGHTS " + c.maxPointLights, "#define MAX_SPOT_LIGHTS " + c.maxSpotLights, "#define MAX_HEMI_LIGHTS " + c.maxHemiLights, "#define MAX_SHADOWS " + c.maxShadows, c.alphaTest ? "#define ALPHATEST " + c.alphaTest : "", L.gammaInput ? "#define GAMMA_INPUT" : "", L.gammaOutput ? "#define GAMMA_OUTPUT" : "", L.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "", c.useFog && c.fog ? "#define USE_FOG" : "", c.useFog && c.fogExp ? "#define FOG_EXP2" : "", c.map ? "#define USE_MAP" : "", c.envMap ? "#define USE_ENVMAP" : "", c.lightMap ? "#define USE_LIGHTMAP" : "", c.bumpMap ? "#define USE_BUMPMAP" : "", c.normalMap ? "#define USE_NORMALMAP" : "", c.specularMap ? "#define USE_SPECULARMAP" : "", c.vertexColors ? "#define USE_COLOR" : "", c.metal ? "#define METAL" : "", c.perPixel ? "#define PHONG_PER_PIXEL" : "", c.wrapAround ? "#define WRAP_AROUND" : "", c.doubleSided ? "#define DOUBLE_SIDED" : "", c.flipSided ? "#define FLIP_SIDED" : "", c.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", c.shadowMapEnabled ? "#define " + s : "", c.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", c.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", "uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");
- u = D("vertex", u + q);
- s = D("fragment", s + r);
- j.attachShader(v, u);
- j.attachShader(v, s);
- d && j.bindAttribLocation(v, 0, d);
- j.linkProgram(v);
- j.getProgramParameter(v, j.LINK_STATUS) || (console.error("Could not initialise shader\nVALIDATE_STATUS: " + j.getProgramParameter(v,
- j.VALIDATE_STATUS) + ", gl error [" + j.getError() + "]"), console.error("Program Info Log: " + j.getProgramInfoLog(v)));
- j.deleteShader(s);
- j.deleteShader(u);
- v.uniforms = {};
- v.attributes = {};
- var w;
- s = "viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences".split(" ");
- c.useVertexTexture ? (s.push("boneTexture"), s.push("boneTextureWidth"), s.push("boneTextureHeight")) : s.push("boneGlobalMatrices");
- for (w in p) s.push(w);
- w = s;
- s = 0;
- for (u = w.length; s < u; s++) p = w[s], v.uniforms[p] = j.getUniformLocation(v, p);
- s = "position normal uv uv2 tangent color skinIndex skinWeight lineDistance".split(" ");
- for (w = 0; w < c.maxMorphTargets; w++) s.push("morphTarget" + w);
- for (w = 0; w < c.maxMorphNormals; w++) s.push("morphNormal" + w);
- for (k in b) s.push(k);
- k = s;
- w = 0;
- for (b = k.length; w < b; w++) s = k[w], v.attributes[s] = j.getAttribLocation(v, s);
- v.id = za++;
- da.push({
- program: v,
- code: n,
- usedTimes: 1
- });
- L.info.memory.programs = da.length;
- k = v
- }
- a.program = k;
- w = a.program.attributes;
- if (a.morphTargets) {
- a.numSupportedMorphTargets = 0;
- b = "morphTarget";
- for (k = 0; k < this.maxMorphTargets; k++) v = b + k, 0 <= w[v] && a.numSupportedMorphTargets++
- }
- if (a.morphNormals) {
- a.numSupportedMorphNormals = 0;
- b = "morphNormal";
- for (k = 0; k < this.maxMorphNormals; k++) v = b + k, 0 <= w[v] && a.numSupportedMorphNormals++
- }
- a.uniformsList = [];
- for (i in a.uniforms) a.uniformsList.push([a.uniforms[i], i])
- };
- this.setFaceCulling = function(a, b) {
- a === THREE.CullFaceNone ? j.disable(j.CULL_FACE) : (b === THREE.FrontFaceDirectionCW ? j.frontFace(j.CW) : j.frontFace(j.CCW), a === THREE.CullFaceBack ? j.cullFace(j.BACK) : a === THREE.CullFaceFront ? j.cullFace(j.FRONT) : j.cullFace(j.FRONT_AND_BACK), j.enable(j.CULL_FACE))
- };
- this.setMaterialFaces = function(a) {
- var b = a.side === THREE.DoubleSide,
- a = a.side === THREE.BackSide;
- Y !== b && (b ? j.disable(j.CULL_FACE) : j.enable(j.CULL_FACE), Y = b);
- U !== a && (a ? j.frontFace(j.CW) : j.frontFace(j.CCW), U = a)
- };
- this.setDepthTest = function(a) {
- Ga !== a && (a ? j.enable(j.DEPTH_TEST) : j.disable(j.DEPTH_TEST), Ga = a)
- };
- this.setDepthWrite = function(a) {
- ka !== a && (j.depthMask(a), ka = a)
- };
- this.setBlending = function(a, b, c, d) {
- a !== ja && (a === THREE.NoBlending ? j.disable(j.BLEND) : a === THREE.AdditiveBlending ? (j.enable(j.BLEND), j.blendEquation(j.FUNC_ADD), j.blendFunc(j.SRC_ALPHA, j.ONE)) : a === THREE.SubtractiveBlending ? (j.enable(j.BLEND), j.blendEquation(j.FUNC_ADD), j.blendFunc(j.ZERO, j.ONE_MINUS_SRC_COLOR)) : a === THREE.MultiplyBlending ? (j.enable(j.BLEND), j.blendEquation(j.FUNC_ADD), j.blendFunc(j.ZERO, j.SRC_COLOR)) : a === THREE.CustomBlending ? j.enable(j.BLEND) : (j.enable(j.BLEND), j.blendEquationSeparate(j.FUNC_ADD, j.FUNC_ADD), j.blendFuncSeparate(j.SRC_ALPHA, j.ONE_MINUS_SRC_ALPHA, j.ONE,
- j.ONE_MINUS_SRC_ALPHA)), ja = a);
- if (a === THREE.CustomBlending) {
- if (b !== sa && (j.blendEquation(I(b)), sa = b), c !== ha || d !== Ka) j.blendFunc(I(c), I(d)), ha = c, Ka = d
- } else Ka = ha = sa = null
- };
- this.setTexture = function(a, b) {
- if (a.needsUpdate) {
- a.__webglInit || (a.__webglInit = !0, a.addEventListener("dispose", Db), a.__webglTexture = j.createTexture(), L.info.memory.textures++);
- j.activeTexture(j.TEXTURE0 + b);
- j.bindTexture(j.TEXTURE_2D, a.__webglTexture);
- j.pixelStorei(j.UNPACK_FLIP_Y_WEBGL, a.flipY);
- j.pixelStorei(j.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
- a.premultiplyAlpha);
- j.pixelStorei(j.UNPACK_ALIGNMENT, a.unpackAlignment);
- var c = a.image,
- d = 0 === (c.width & c.width - 1) && 0 === (c.height & c.height - 1),
- e = I(a.format),
- f = I(a.type);
- F(j.TEXTURE_2D, a, d);
- var g = a.mipmaps;
- if (a instanceof THREE.DataTexture) if (0 < g.length && d) {
- for (var h = 0, i = g.length; h < i; h++) c = g[h], j.texImage2D(j.TEXTURE_2D, h, e, c.width, c.height, 0, e, f, c.data);
- a.generateMipmaps = !1
- } else j.texImage2D(j.TEXTURE_2D, 0, e, c.width, c.height, 0, e, f, c.data);
- else if (a instanceof THREE.CompressedTexture) {
- h = 0;
- for (i = g.length; h < i; h++) c = g[h], a.format !== THREE.RGBAFormat ? j.compressedTexImage2D(j.TEXTURE_2D, h, e, c.width, c.height, 0, c.data) : j.texImage2D(j.TEXTURE_2D, h, e, c.width, c.height, 0, e, f, c.data)
- } else if (0 < g.length && d) {
- h = 0;
- for (i = g.length; h < i; h++) c = g[h], j.texImage2D(j.TEXTURE_2D, h, e, e, f, c);
- a.generateMipmaps = !1
- } else j.texImage2D(j.TEXTURE_2D, 0, e, e, f, a.image);
- a.generateMipmaps && d && j.generateMipmap(j.TEXTURE_2D);
- a.needsUpdate = !1;
- if (a.onUpdate) a.onUpdate()
- } else j.activeTexture(j.TEXTURE0 + b), j.bindTexture(j.TEXTURE_2D, a.__webglTexture)
- };
- this.setRenderTarget = function(a) {
- var b = a instanceof THREE.WebGLRenderTargetCube;
- if (a && !a.__webglFramebuffer) {
- void 0 === a.depthBuffer && (a.depthBuffer = !0);
- void 0 === a.stencilBuffer && (a.stencilBuffer = !0);
- a.addEventListener("dispose", Eb);
- a.__webglTexture = j.createTexture();
- L.info.memory.textures++;
- var c = 0 === (a.width & a.width - 1) && 0 === (a.height & a.height - 1),
- d = I(a.format),
- e = I(a.type);
- if (b) {
- a.__webglFramebuffer = [];
- a.__webglRenderbuffer = [];
- j.bindTexture(j.TEXTURE_CUBE_MAP, a.__webglTexture);
- F(j.TEXTURE_CUBE_MAP,
- a, c);
- for (var f = 0; 6 > f; f++) {
- a.__webglFramebuffer[f] = j.createFramebuffer();
- a.__webglRenderbuffer[f] = j.createRenderbuffer();
- j.texImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X + f, 0, d, a.width, a.height, 0, d, e, null);
- var g = a,
- h = j.TEXTURE_CUBE_MAP_POSITIVE_X + f;
- j.bindFramebuffer(j.FRAMEBUFFER, a.__webglFramebuffer[f]);
- j.framebufferTexture2D(j.FRAMEBUFFER, j.COLOR_ATTACHMENT0, h, g.__webglTexture, 0);
- O(a.__webglRenderbuffer[f], a)
- }
- c && j.generateMipmap(j.TEXTURE_CUBE_MAP)
- } else a.__webglFramebuffer = j.createFramebuffer(), a.__webglRenderbuffer = a.shareDepthFrom ? a.shareDepthFrom.__webglRenderbuffer : j.createRenderbuffer(), j.bindTexture(j.TEXTURE_2D, a.__webglTexture), F(j.TEXTURE_2D, a, c), j.texImage2D(j.TEXTURE_2D, 0, d, a.width, a.height, 0, d, e, null), d = j.TEXTURE_2D, j.bindFramebuffer(j.FRAMEBUFFER, a.__webglFramebuffer), j.framebufferTexture2D(j.FRAMEBUFFER, j.COLOR_ATTACHMENT0, d, a.__webglTexture, 0), a.shareDepthFrom ? a.depthBuffer && !a.stencilBuffer ? j.framebufferRenderbuffer(j.FRAMEBUFFER, j.DEPTH_ATTACHMENT, j.RENDERBUFFER, a.__webglRenderbuffer) : a.depthBuffer && a.stencilBuffer && j.framebufferRenderbuffer(j.FRAMEBUFFER, j.DEPTH_STENCIL_ATTACHMENT, j.RENDERBUFFER, a.__webglRenderbuffer) : O(a.__webglRenderbuffer, a), c && j.generateMipmap(j.TEXTURE_2D);
- b ? j.bindTexture(j.TEXTURE_CUBE_MAP, null) : j.bindTexture(j.TEXTURE_2D, null);
- j.bindRenderbuffer(j.RENDERBUFFER, null);
- j.bindFramebuffer(j.FRAMEBUFFER, null)
- }
- a ? (b = b ? a.__webglFramebuffer[a.activeCubeFace] : a.__webglFramebuffer, c = a.width, a = a.height, e = d = 0) : (b = null, c = Ma, a = fb, d = bb, e = cb);
- b !== ba && (j.bindFramebuffer(j.FRAMEBUFFER, b),
- j.viewport(d, e, c, a), ba = b);
- sb = c;
- pb = a
- };
- this.shadowMapPlugin = new THREE.ShadowMapPlugin;
- this.addPrePlugin(this.shadowMapPlugin);
- this.addPostPlugin(new THREE.SpritePlugin);
- this.addPostPlugin(new THREE.LensFlarePlugin)
-};
-THREE.WebGLRenderTarget = function(a, b, c) {
- this.width = a;
- this.height = b;
- c = c || {};
- this.wrapS = void 0 !== c.wrapS ? c.wrapS : THREE.ClampToEdgeWrapping;
- this.wrapT = void 0 !== c.wrapT ? c.wrapT : THREE.ClampToEdgeWrapping;
- this.magFilter = void 0 !== c.magFilter ? c.magFilter : THREE.LinearFilter;
- this.minFilter = void 0 !== c.minFilter ? c.minFilter : THREE.LinearMipMapLinearFilter;
- this.anisotropy = void 0 !== c.anisotropy ? c.anisotropy : 1;
- this.offset = new THREE.Vector2(0, 0);
- this.repeat = new THREE.Vector2(1, 1);
- this.format = void 0 !== c.format ? c.format : THREE.RGBAFormat;
- this.type = void 0 !== c.type ? c.type : THREE.UnsignedByteType;
- this.depthBuffer = void 0 !== c.depthBuffer ? c.depthBuffer : !0;
- this.stencilBuffer = void 0 !== c.stencilBuffer ? c.stencilBuffer : !0;
- this.generateMipmaps = !0;
- this.shareDepthFrom = null
-};
-THREE.WebGLRenderTarget.prototype = {
- constructor: THREE.WebGLRenderTarget,
- clone: function() {
- var a = new THREE.WebGLRenderTarget(this.width, this.height);
- a.wrapS = this.wrapS;
- a.wrapT = this.wrapT;
- a.magFilter = this.magFilter;
- a.minFilter = this.minFilter;
- a.anisotropy = this.anisotropy;
- a.offset.copy(this.offset);
- a.repeat.copy(this.repeat);
- a.format = this.format;
- a.type = this.type;
- a.depthBuffer = this.depthBuffer;
- a.stencilBuffer = this.stencilBuffer;
- a.generateMipmaps = this.generateMipmaps;
- a.shareDepthFrom = this.shareDepthFrom;
- return a
- },
- dispose: function() {
- this.dispatchEvent({
- type: "dispose"
- })
- }
-};
-THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);
-THREE.WebGLRenderTargetCube = function(a, b, c) {
- THREE.WebGLRenderTarget.call(this, a, b, c);
- this.activeCubeFace = 0
-};
-THREE.WebGLRenderTargetCube.prototype = Object.create(THREE.WebGLRenderTarget.prototype);
-THREE.RenderableVertex = function() {
- this.positionWorld = new THREE.Vector3;
- this.positionScreen = new THREE.Vector4;
- this.visible = !0
-};
-THREE.RenderableVertex.prototype.copy = function(a) {
- this.positionWorld.copy(a.positionWorld);
- this.positionScreen.copy(a.positionScreen)
-};
-THREE.RenderableFace3 = function() {
- this.id = 0;
- this.v1 = new THREE.RenderableVertex;
- this.v2 = new THREE.RenderableVertex;
- this.v3 = new THREE.RenderableVertex;
- this.centroidModel = new THREE.Vector3;
- this.normalModel = new THREE.Vector3;
- this.normalModelView = new THREE.Vector3;
- this.vertexNormalsLength = 0;
- this.vertexNormalsModel = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3];
- this.vertexNormalsModelView = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3];
- this.material = this.color = null;
- this.uvs = [
- []
- ];
- this.z = 0
-};
-THREE.RenderableObject = function() {
- this.id = 0;
- this.object = null;
- this.z = 0
-};
-THREE.RenderableSprite = function() {
- this.id = 0;
- this.object = null;
- this.rotation = this.z = this.y = this.x = 0;
- this.scale = new THREE.Vector2;
- this.material = null
-};
-THREE.RenderableLine = function() {
- this.id = 0;
- this.v1 = new THREE.RenderableVertex;
- this.v2 = new THREE.RenderableVertex;
- this.vertexColors = [new THREE.Color, new THREE.Color];
- this.material = null;
- this.z = 0
-};
-THREE.GeometryUtils = {
- merge: function(a, b, c) {
- var d, e, f = a.vertices.length,
- h = b instanceof THREE.Mesh ? b.geometry : b,
- g = a.vertices,
- i = h.vertices,
- k = a.faces,
- m = h.faces,
- a = a.faceVertexUvs[0],
- h = h.faceVertexUvs[0];
- void 0 === c && (c = 0);
- b instanceof THREE.Mesh && (b.matrixAutoUpdate && b.updateMatrix(), d = b.matrix, e = (new THREE.Matrix3).getNormalMatrix(d));
- for (var b = 0, l = i.length; b < l; b++) {
- var p = i[b].clone();
- d && p.applyMatrix4(d);
- g.push(p)
- }
- b = 0;
- for (l = m.length; b < l; b++) {
- var p = m[b],
- t, s, q = p.vertexNormals,
- n = p.vertexColors;
- t = new THREE.Face3(p.a + f, p.b + f, p.c + f);
- t.normal.copy(p.normal);
- e && t.normal.applyMatrix3(e).normalize();
- g = 0;
- for (i = q.length; g < i; g++) s = q[g].clone(), e && s.applyMatrix3(e).normalize(), t.vertexNormals.push(s);
- t.color.copy(p.color);
- g = 0;
- for (i = n.length; g < i; g++) s = n[g], t.vertexColors.push(s.clone());
- t.materialIndex = p.materialIndex + c;
- t.centroid.copy(p.centroid);
- d && t.centroid.applyMatrix4(d);
- k.push(t)
- }
- b = 0;
- for (l = h.length; b < l; b++) {
- c = h[b];
- d = [];
- g = 0;
- for (i = c.length; g < i; g++) d.push(new THREE.Vector2(c[g].x, c[g].y));
- a.push(d)
- }
- },
- randomPointInTriangle: function() {
- var a = new THREE.Vector3;
- return function(b, c, d) {
- var e = new THREE.Vector3,
- f = THREE.Math.random16(),
- h = THREE.Math.random16();
- 1 < f + h && (f = 1 - f, h = 1 - h);
- var g = 1 - f - h;
- e.copy(b);
- e.multiplyScalar(f);
- a.copy(c);
- a.multiplyScalar(h);
- e.add(a);
- a.copy(d);
- a.multiplyScalar(g);
- e.add(a);
- return e
- }
- }(),
- randomPointInFace: function(a, b) {
- return THREE.GeometryUtils.randomPointInTriangle(b.vertices[a.a], b.vertices[a.b], b.vertices[a.c])
- },
- randomPointsInGeometry: function(a, b) {
- function c(a) {
- function b(c, d) {
- if (d < c) return c;
- var e = c + Math.floor((d - c) / 2);
- return k[e] > a ? b(c, e - 1) : k[e] < a ? b(e + 1, d) : e
- }
- return b(0, k.length - 1)
- }
- var d, e, f = a.faces,
- h = a.vertices,
- g = f.length,
- i = 0,
- k = [],
- m, l, p;
- for (e = 0; e < g; e++) d = f[e], m = h[d.a], l = h[d.b], p = h[d.c], d._area = THREE.GeometryUtils.triangleArea(m, l, p), i += d._area, k[e] = i;
- d = [];
- for (e = 0; e < b; e++) h = THREE.Math.random16() * i, h = c(h), d[e] = THREE.GeometryUtils.randomPointInFace(f[h], a, !0);
- return d
- },
- triangleArea: function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function(c, d, e) {
- a.subVectors(d, c);
- b.subVectors(e, c);
- a.cross(b);
- return 0.5 * a.length()
- }
- }(),
- center: function(a) {
- a.computeBoundingBox();
- var b = a.boundingBox,
- c = new THREE.Vector3;
- c.addVectors(b.min, b.max);
- c.multiplyScalar(-0.5);
- a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x, c.y, c.z));
- a.computeBoundingBox();
- return c
- },
- triangulateQuads: function(a) {
- var b, c, d, e, f = [],
- h = [];
- b = 0;
- for (c = a.faceVertexUvs.length; b < c; b++) h[b] = [];
- b = 0;
- for (c = a.faces.length; b < c; b++) {
- f.push(a.faces[b]);
- d = 0;
- for (e = a.faceVertexUvs.length; d < e; d++) h[d].push(a.faceVertexUvs[d][b])
- }
- a.faces = f;
- a.faceVertexUvs = h;
- a.computeCentroids();
- a.computeFaceNormals();
- a.computeVertexNormals();
- a.hasTangents && a.computeTangents()
- }
-};
-THREE.ImageUtils = {
- crossOrigin: "anonymous",
- loadTexture: function(a, b, c) {
- var d = new THREE.ImageLoader;
- d.crossOrigin = this.crossOrigin;
- var e = new THREE.Texture(void 0, b),
- b = d.load(a, function() {
- e.needsUpdate = !0;
- c && c(e)
- });
- e.image = b;
- e.sourceFile = a;
- return e
- },
- loadCompressedTexture: function(a, b, c, d) {
- var e = new THREE.CompressedTexture;
- e.mapping = b;
- var f = new XMLHttpRequest;
- f.onload = function() {
- var a = THREE.ImageUtils.parseDDS(f.response, !0);
- e.format = a.format;
- e.mipmaps = a.mipmaps;
- e.image.width = a.width;
- e.image.height = a.height;
- e.generateMipmaps = !1;
- e.needsUpdate = !0;
- c && c(e)
- };
- f.onerror = d;
- f.open("GET", a, !0);
- f.responseType = "arraybuffer";
- f.send(null);
- return e
- },
- loadTextureCube: function(a, b, c, d) {
- var e = [];
- e.loadCount = 0;
- var f = new THREE.Texture;
- f.image = e;
- void 0 !== b && (f.mapping = b);
- f.flipY = !1;
- for (var b = 0, h = a.length; b < h; ++b) {
- var g = new Image;
- e[b] = g;
- g.onload = function() {
- e.loadCount += 1;
- 6 === e.loadCount && (f.needsUpdate = !0, c && c(f))
- };
- g.onerror = d;
- g.crossOrigin = this.crossOrigin;
- g.src = a[b]
- }
- return f
- },
- loadCompressedTextureCube: function(a, b, c, d) {
- var e = [];
- e.loadCount = 0;
- var f = new THREE.CompressedTexture;
- f.image = e;
- void 0 !== b && (f.mapping = b);
- f.flipY = !1;
- f.generateMipmaps = !1;
- b = function(a, b) {
- return function() {
- var d = THREE.ImageUtils.parseDDS(a.response, !0);
- b.format = d.format;
- b.mipmaps = d.mipmaps;
- b.width = d.width;
- b.height = d.height;
- e.loadCount += 1;
- 6 === e.loadCount && (f.format = d.format, f.needsUpdate = !0, c && c(f))
- }
- };
- if (a instanceof Array) for (var h = 0, g = a.length; h < g; ++h) {
- var i = {};
- e[h] = i;
- var k = new XMLHttpRequest;
- k.onload = b(k, i);
- k.onerror = d;
- i = a[h];
- k.open("GET", i, !0);
- k.responseType = "arraybuffer";
- k.send(null)
- } else k = new XMLHttpRequest, k.onload = function() {
- var a = THREE.ImageUtils.parseDDS(k.response, !0);
- if (a.isCubemap) {
- for (var b = a.mipmaps.length / a.mipmapCount, d = 0; d < b; d++) {
- e[d] = {
- mipmaps: []
- };
- for (var g = 0; g < a.mipmapCount; g++) e[d].mipmaps.push(a.mipmaps[d * a.mipmapCount + g]), e[d].format = a.format, e[d].width = a.width, e[d].height = a.height
- }
- f.format = a.format;
- f.needsUpdate = !0;
- c && c(f)
- }
- }, k.onerror = d, k.open("GET", a, !0), k.responseType = "arraybuffer", k.send(null);
- return f
- },
- loadDDSTexture: function(a,
- b, c, d) {
- var e = [];
- e.loadCount = 0;
- var f = new THREE.CompressedTexture;
- f.image = e;
- void 0 !== b && (f.mapping = b);
- f.flipY = !1;
- f.generateMipmaps = !1;
- var h = new XMLHttpRequest;
- h.onload = function() {
- var a = THREE.ImageUtils.parseDDS(h.response, !0);
- if (a.isCubemap) for (var b = a.mipmaps.length / a.mipmapCount, d = 0; d < b; d++) {
- e[d] = {
- mipmaps: []
- };
- for (var m = 0; m < a.mipmapCount; m++) e[d].mipmaps.push(a.mipmaps[d * a.mipmapCount + m]), e[d].format = a.format, e[d].width = a.width, e[d].height = a.height
- } else f.image.width = a.width, f.image.height = a.height,
- f.mipmaps = a.mipmaps;
- f.format = a.format;
- f.needsUpdate = !0;
- c && c(f)
- };
- h.onerror = d;
- h.open("GET", a, !0);
- h.responseType = "arraybuffer";
- h.send(null);
- return f
- },
- parseDDS: function(a, b) {
- function c(a) {
- return a.charCodeAt(0) + (a.charCodeAt(1) << 8) + (a.charCodeAt(2) << 16) + (a.charCodeAt(3) << 24)
- }
- var d = {
- mipmaps: [],
- width: 0,
- height: 0,
- format: null,
- mipmapCount: 1
- }, e = c("DXT1"),
- f = c("DXT3"),
- h = c("DXT5"),
- g = new Int32Array(a, 0, 31);
- if (542327876 !== g[0]) return console.error("ImageUtils.parseDDS(): Invalid magic number in DDS header"), d;
- if (!g[20] & 4) return console.error("ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code"), d;
- var i = g[21],
- k = !1;
- switch (i) {
- case e:
- e = 8;
- d.format = THREE.RGB_S3TC_DXT1_Format;
- break;
- case f:
- e = 16;
- d.format = THREE.RGBA_S3TC_DXT3_Format;
- break;
- case h:
- e = 16;
- d.format = THREE.RGBA_S3TC_DXT5_Format;
- break;
- default:
- if (32 == g[22] && g[23] & 16711680 && g[24] & 65280 && g[25] & 255 && g[26] & 4278190080) k = !0, e = 64, d.format = THREE.RGBAFormat;
- else return console.error("ImageUtils.parseDDS(): Unsupported FourCC code: ", String.fromCharCode(i & 255, i >> 8 & 255, i >> 16 & 255, i >> 24 & 255)), d
- }
- d.mipmapCount = 1;
- g[2] & 131072 && !1 !== b && (d.mipmapCount = Math.max(1, g[7]));
- d.isCubemap = g[28] & 512 ? !0 : !1;
- d.width = g[4];
- d.height = g[3];
- for (var g = g[1] + 4, f = d.width, h = d.height, i = d.isCubemap ? 6 : 1, m = 0; m < i; m++) {
- for (var l = 0; l < d.mipmapCount; l++) {
- if (k) {
- var p;
- p = f;
- for (var t = h, s = 4 * p * t, q = new Uint8Array(a, g, s), s = new Uint8Array(s), n = 0, u = 0, r = 0; r < t; r++) for (var v = 0; v < p; v++) {
- var z = q[u];
- u++;
- var G = q[u];
- u++;
- var w = q[u];
- u++;
- var y = q[u];
- u++;
- s[n] = w;
- n++;
- s[n] = G;
- n++;
- s[n] = z;
- n++;
- s[n] = y;
- n++
- }
- p = s;
- t = p.length
- } else t = Math.max(4, f) / 4 * Math.max(4, h) / 4 * e, p = new Uint8Array(a, g, t);
- d.mipmaps.push({
- data: p,
- width: f,
- height: h
- });
- g += t;
- f = Math.max(0.5 * f, 1);
- h = Math.max(0.5 * h, 1)
- }
- f = d.width;
- h = d.height
- }
- return d
- },
- getNormalMap: function(a, b) {
- var c = function(a) {
- var b = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);
- return [a[0] / b, a[1] / b, a[2] / b]
- }, b = b | 1,
- d = a.width,
- e = a.height,
- f = document.createElement("canvas");
- f.width = d;
- f.height = e;
- var h = f.getContext("2d");
- h.drawImage(a, 0, 0);
- for (var g = h.getImageData(0, 0, d, e).data, i = h.createImageData(d, e), k = i.data, m = 0; m < d; m++) for (var l = 0; l < e; l++) {
- var p = 0 > l - 1 ? 0 : l - 1,
- t = l + 1 > e - 1 ? e - 1 : l + 1,
- s = 0 > m - 1 ? 0 : m - 1,
- q = m + 1 > d - 1 ? d - 1 : m + 1,
- n = [],
- u = [0, 0, g[4 * (l * d + m)] / 255 * b];
- n.push([-1, 0, g[4 * (l * d + s)] / 255 * b]);
- n.push([-1, - 1, g[4 * (p * d + s)] / 255 * b]);
- n.push([0, - 1, g[4 * (p * d + m)] / 255 * b]);
- n.push([1, - 1, g[4 * (p * d + q)] / 255 * b]);
- n.push([1, 0, g[4 * (l * d + q)] / 255 * b]);
- n.push([1, 1, g[4 * (t * d + q)] / 255 * b]);
- n.push([0, 1, g[4 * (t * d + m)] / 255 * b]);
- n.push([-1, 1, g[4 * (t * d + s)] / 255 * b]);
- p = [];
- s = n.length;
- for (t = 0; t < s; t++) {
- var q = n[t],
- r = n[(t + 1) % s],
- q = [q[0] - u[0], q[1] - u[1], q[2] - u[2]],
- r = [r[0] - u[0],
- r[1] - u[1], r[2] - u[2]];
- p.push(c([q[1] * r[2] - q[2] * r[1], q[2] * r[0] - q[0] * r[2], q[0] * r[1] - q[1] * r[0]]))
- }
- n = [0, 0, 0];
- for (t = 0; t < p.length; t++) n[0] += p[t][0], n[1] += p[t][1], n[2] += p[t][2];
- n[0] /= p.length;
- n[1] /= p.length;
- n[2] /= p.length;
- u = 4 * (l * d + m);
- k[u] = 255 * ((n[0] + 1) / 2) | 0;
- k[u + 1] = 255 * ((n[1] + 1) / 2) | 0;
- k[u + 2] = 255 * n[2] | 0;
- k[u + 3] = 255
- }
- h.putImageData(i, 0, 0);
- return f
- },
- generateDataTexture: function(a, b, c) {
- for (var d = a * b, e = new Uint8Array(3 * d), f = Math.floor(255 * c.r), h = Math.floor(255 * c.g), c = Math.floor(255 * c.b), g = 0; g < d; g++) e[3 * g] = f, e[3 * g + 1] = h, e[3 * g + 2] = c;
- a = new THREE.DataTexture(e, a, b, THREE.RGBFormat);
- a.needsUpdate = !0;
- return a
- }
-};
-THREE.SceneUtils = {
- createMultiMaterialObject: function(a, b) {
- for (var c = new THREE.Object3D, d = 0, e = b.length; d < e; d++) c.add(new THREE.Mesh(a, b[d]));
- return c
- },
- detach: function(a, b, c) {
- a.applyMatrix(b.matrixWorld);
- b.remove(a);
- c.add(a)
- },
- attach: function(a, b, c) {
- var d = new THREE.Matrix4;
- d.getInverse(c.matrixWorld);
- a.applyMatrix(d);
- b.remove(a);
- c.add(a)
- }
-};
-THREE.FontUtils = {
- faces: {},
- face: "helvetiker",
- weight: "normal",
- style: "normal",
- size: 150,
- divisions: 10,
- getFace: function() {
- return this.faces[this.face][this.weight][this.style]
- },
- loadFace: function(a) {
- var b = a.familyName.toLowerCase();
- this.faces[b] = this.faces[b] || {};
- this.faces[b][a.cssFontWeight] = this.faces[b][a.cssFontWeight] || {};
- this.faces[b][a.cssFontWeight][a.cssFontStyle] = a;
- return this.faces[b][a.cssFontWeight][a.cssFontStyle] = a
- },
- drawText: function(a) {
- for (var b = this.getFace(), c = this.size / b.resolution, d = 0, e = String(a).split(""), f = e.length, h = [], a = 0; a < f; a++) {
- var g = new THREE.Path,
- g = this.extractGlyphPoints(e[a], b, c, d, g),
- d = d + g.offset;
- h.push(g.path)
- }
- return {
- paths: h,
- offset: d / 2
- }
- },
- extractGlyphPoints: function(a, b, c, d, e) {
- var f = [],
- h, g, i, k, m, l, p, t, s, q, n, u = b.glyphs[a] || b.glyphs["?"];
- if (u) {
- if (u.o) {
- b = u._cachedOutline || (u._cachedOutline = u.o.split(" "));
- k = b.length;
- for (a = 0; a < k;) switch (i = b[a++], i) {
- case "m":
- i = b[a++] * c + d;
- m = b[a++] * c;
- e.moveTo(i, m);
- break;
- case "l":
- i = b[a++] * c + d;
- m = b[a++] * c;
- e.lineTo(i, m);
- break;
- case "q":
- i = b[a++] * c + d;
- m = b[a++] * c;
- t = b[a++] * c + d;
- s = b[a++] * c;
- e.quadraticCurveTo(t, s, i, m);
- if (h = f[f.length - 1]) {
- l = h.x;
- p = h.y;
- h = 1;
- for (g = this.divisions; h <= g; h++) {
- var r = h / g;
- THREE.Shape.Utils.b2(r, l, t, i);
- THREE.Shape.Utils.b2(r, p, s, m)
- }
- }
- break;
- case "b":
- if (i = b[a++] * c + d, m = b[a++] * c, t = b[a++] * c + d, s = b[a++] * -c, q = b[a++] * c + d, n = b[a++] * -c, e.bezierCurveTo(i, m, t, s, q, n), h = f[f.length - 1]) {
- l = h.x;
- p = h.y;
- h = 1;
- for (g = this.divisions; h <= g; h++) r = h / g, THREE.Shape.Utils.b3(r, l, t, q, i), THREE.Shape.Utils.b3(r, p, s, n, m)
- }
- }
- }
- return {
- offset: u.ha * c,
- path: e
- }
- }
- }
-};
-THREE.FontUtils.generateShapes = function(a, b) {
- var b = b || {}, c = void 0 !== b.curveSegments ? b.curveSegments : 4,
- d = void 0 !== b.font ? b.font : "helvetiker",
- e = void 0 !== b.weight ? b.weight : "normal",
- f = void 0 !== b.style ? b.style : "normal";
- THREE.FontUtils.size = void 0 !== b.size ? b.size : 100;
- THREE.FontUtils.divisions = c;
- THREE.FontUtils.face = d;
- THREE.FontUtils.weight = e;
- THREE.FontUtils.style = f;
- c = THREE.FontUtils.drawText(a).paths;
- d = [];
- e = 0;
- for (f = c.length; e < f; e++) Array.prototype.push.apply(d, c[e].toShapes());
- return d
-};
-(function(a) {
- var b = function(a) {
- for (var b = a.length, e = 0, f = b - 1, h = 0; h < b; f = h++) e += a[f].x * a[h].y - a[h].x * a[f].y;
- return 0.5 * e
- };
- a.Triangulate = function(a, d) {
- var e = a.length;
- if (3 > e) return null;
- var f = [],
- h = [],
- g = [],
- i, k, m;
- if (0 < b(a)) for (k = 0; k < e; k++) h[k] = k;
- else for (k = 0; k < e; k++) h[k] = e - 1 - k;
- var l = 2 * e;
- for (k = e - 1; 2 < e;) {
- if (0 >= l--) {
- console.log("Warning, unable to triangulate polygon!");
- break
- }
- i = k;
- e <= i && (i = 0);
- k = i + 1;
- e <= k && (k = 0);
- m = k + 1;
- e <= m && (m = 0);
- var p;
- a: {
- var t = p = void 0,
- s = void 0,
- q = void 0,
- n = void 0,
- u = void 0,
- r = void 0,
- v = void 0,
- z = void 0,
- t = a[h[i]].x,
- s = a[h[i]].y,
- q = a[h[k]].x,
- n = a[h[k]].y,
- u = a[h[m]].x,
- r = a[h[m]].y;
- if (1E-10 > (q - t) * (r - s) - (n - s) * (u - t)) p = !1;
- else {
- var G = void 0,
- w = void 0,
- y = void 0,
- E = void 0,
- A = void 0,
- K = void 0,
- D = void 0,
- F = void 0,
- O = void 0,
- x = void 0,
- O = F = D = z = v = void 0,
- G = u - q,
- w = r - n,
- y = t - u,
- E = s - r,
- A = q - t,
- K = n - s;
- for (p = 0; p < e; p++) if (!(p === i || p === k || p === m)) if (v = a[h[p]].x, z = a[h[p]].y, D = v - t, F = z - s, O = v - q, x = z - n, v -= u, z -= r, O = G * x - w * O, D = A * F - K * D, F = y * z - E * v, - 1E-10 <= O && -1E-10 <= F && -1E-10 <= D) {
- p = !1;
- break a
- }
- p = !0
- }
- }
- if (p) {
- f.push([a[h[i]], a[h[k]], a[h[m]]]);
- g.push([h[i],
- h[k], h[m]]);
- i = k;
- for (m = k + 1; m < e; i++, m++) h[i] = h[m];
- e--;
- l = 2 * e
- }
- }
- return d ? g : f
- };
- a.Triangulate.area = b;
- return a
-})(THREE.FontUtils);
-self._typeface_js = {
- faces: THREE.FontUtils.faces,
- loadFace: THREE.FontUtils.loadFace
-};
-THREE.typeface_js = self._typeface_js;
-THREE.Curve = function() {};
-THREE.Curve.prototype.getPoint = function() {
- console.log("Warning, getPoint() not implemented!");
- return null
-};
-THREE.Curve.prototype.getPointAt = function(a) {
- a = this.getUtoTmapping(a);
- return this.getPoint(a)
-};
-THREE.Curve.prototype.getPoints = function(a) {
- a || (a = 5);
- var b, c = [];
- for (b = 0; b <= a; b++) c.push(this.getPoint(b / a));
- return c
-};
-THREE.Curve.prototype.getSpacedPoints = function(a) {
- a || (a = 5);
- var b, c = [];
- for (b = 0; b <= a; b++) c.push(this.getPointAt(b / a));
- return c
-};
-THREE.Curve.prototype.getLength = function() {
- var a = this.getLengths();
- return a[a.length - 1]
-};
-THREE.Curve.prototype.getLengths = function(a) {
- a || (a = this.__arcLengthDivisions ? this.__arcLengthDivisions : 200);
- if (this.cacheArcLengths && this.cacheArcLengths.length == a + 1 && !this.needsUpdate) return this.cacheArcLengths;
- this.needsUpdate = !1;
- var b = [],
- c, d = this.getPoint(0),
- e, f = 0;
- b.push(0);
- for (e = 1; e <= a; e++) c = this.getPoint(e / a), f += c.distanceTo(d), b.push(f), d = c;
- return this.cacheArcLengths = b
-};
-THREE.Curve.prototype.updateArcLengths = function() {
- this.needsUpdate = !0;
- this.getLengths()
-};
-THREE.Curve.prototype.getUtoTmapping = function(a, b) {
- var c = this.getLengths(),
- d = 0,
- e = c.length,
- f;
- f = b ? b : a * c[e - 1];
- for (var h = 0, g = e - 1, i; h <= g;) if (d = Math.floor(h + (g - h) / 2), i = c[d] - f, 0 > i) h = d + 1;
- else if (0 < i) g = d - 1;
- else {
- g = d;
- break
- }
- d = g;
- if (c[d] == f) return d / (e - 1);
- h = c[d];
- return c = (d + (f - h) / (c[d + 1] - h)) / (e - 1)
-};
-THREE.Curve.prototype.getTangent = function(a) {
- var b = a - 1E-4,
- a = a + 1E-4;
- 0 > b && (b = 0);
- 1 < a && (a = 1);
- b = this.getPoint(b);
- return this.getPoint(a).clone().sub(b).normalize()
-};
-THREE.Curve.prototype.getTangentAt = function(a) {
- a = this.getUtoTmapping(a);
- return this.getTangent(a)
-};
-THREE.Curve.Utils = {
- tangentQuadraticBezier: function(a, b, c, d) {
- return 2 * (1 - a) * (c - b) + 2 * a * (d - c)
- },
- tangentCubicBezier: function(a, b, c, d, e) {
- return -3 * b * (1 - a) * (1 - a) + 3 * c * (1 - a) * (1 - a) - 6 * a * c * (1 - a) + 6 * a * d * (1 - a) - 3 * a * a * d + 3 * a * a * e
- },
- tangentSpline: function(a) {
- return 6 * a * a - 6 * a + (3 * a * a - 4 * a + 1) + (-6 * a * a + 6 * a) + (3 * a * a - 2 * a)
- },
- interpolate: function(a, b, c, d, e) {
- var a = 0.5 * (c - a),
- d = 0.5 * (d - b),
- f = e * e;
- return (2 * b - 2 * c + a + d) * e * f + (-3 * b + 3 * c - 2 * a - d) * f + a * e + b
- }
-};
-THREE.Curve.create = function(a, b) {
- a.prototype = Object.create(THREE.Curve.prototype);
- a.prototype.getPoint = b;
- return a
-};
-THREE.CurvePath = function() {
- this.curves = [];
- this.bends = [];
- this.autoClose = !1
-};
-THREE.CurvePath.prototype = Object.create(THREE.Curve.prototype);
-THREE.CurvePath.prototype.add = function(a) {
- this.curves.push(a)
-};
-THREE.CurvePath.prototype.checkConnection = function() {};
-THREE.CurvePath.prototype.closePath = function() {
- var a = this.curves[0].getPoint(0),
- b = this.curves[this.curves.length - 1].getPoint(1);
- a.equals(b) || this.curves.push(new THREE.LineCurve(b, a))
-};
-THREE.CurvePath.prototype.getPoint = function(a) {
- for (var b = a * this.getLength(), c = this.getCurveLengths(), a = 0; a < c.length;) {
- if (c[a] >= b) return b = c[a] - b, a = this.curves[a], b = 1 - b / a.getLength(), a.getPointAt(b);
- a++
- }
- return null
-};
-THREE.CurvePath.prototype.getLength = function() {
- var a = this.getCurveLengths();
- return a[a.length - 1]
-};
-THREE.CurvePath.prototype.getCurveLengths = function() {
- if (this.cacheLengths && this.cacheLengths.length == this.curves.length) return this.cacheLengths;
- var a = [],
- b = 0,
- c, d = this.curves.length;
- for (c = 0; c < d; c++) b += this.curves[c].getLength(), a.push(b);
- return this.cacheLengths = a
-};
-THREE.CurvePath.prototype.getBoundingBox = function() {
- var a = this.getPoints(),
- b, c, d, e, f, h;
- b = c = Number.NEGATIVE_INFINITY;
- e = f = Number.POSITIVE_INFINITY;
- var g, i, k, m, l = a[0] instanceof THREE.Vector3;
- m = l ? new THREE.Vector3 : new THREE.Vector2;
- i = 0;
- for (k = a.length; i < k; i++) g = a[i], g.x > b ? b = g.x : g.x < e && (e = g.x), g.y > c ? c = g.y : g.y < f && (f = g.y), l && (g.z > d ? d = g.z : g.z < h && (h = g.z)), m.add(g);
- a = {
- minX: e,
- minY: f,
- maxX: b,
- maxY: c,
- centroid: m.divideScalar(k)
- };
- l && (a.maxZ = d, a.minZ = h);
- return a
-};
-THREE.CurvePath.prototype.createPointsGeometry = function(a) {
- a = this.getPoints(a, !0);
- return this.createGeometry(a)
-};
-THREE.CurvePath.prototype.createSpacedPointsGeometry = function(a) {
- a = this.getSpacedPoints(a, !0);
- return this.createGeometry(a)
-};
-THREE.CurvePath.prototype.createGeometry = function(a) {
- for (var b = new THREE.Geometry, c = 0; c < a.length; c++) b.vertices.push(new THREE.Vector3(a[c].x, a[c].y, a[c].z || 0));
- return b
-};
-THREE.CurvePath.prototype.addWrapPath = function(a) {
- this.bends.push(a)
-};
-THREE.CurvePath.prototype.getTransformedPoints = function(a, b) {
- var c = this.getPoints(a),
- d, e;
- b || (b = this.bends);
- d = 0;
- for (e = b.length; d < e; d++) c = this.getWrapPoints(c, b[d]);
- return c
-};
-THREE.CurvePath.prototype.getTransformedSpacedPoints = function(a, b) {
- var c = this.getSpacedPoints(a),
- d, e;
- b || (b = this.bends);
- d = 0;
- for (e = b.length; d < e; d++) c = this.getWrapPoints(c, b[d]);
- return c
-};
-THREE.CurvePath.prototype.getWrapPoints = function(a, b) {
- var c = this.getBoundingBox(),
- d, e, f, h, g, i;
- d = 0;
- for (e = a.length; d < e; d++) f = a[d], h = f.x, g = f.y, i = h / c.maxX, i = b.getUtoTmapping(i, h), h = b.getPoint(i), i = b.getTangent(i), i.set(-i.y, i.x).multiplyScalar(g), f.x = h.x + i.x, f.y = h.y + i.y;
- return a
-};
-THREE.Gyroscope = function() {
- THREE.Object3D.call(this)
-};
-THREE.Gyroscope.prototype = Object.create(THREE.Object3D.prototype);
-THREE.Gyroscope.prototype.updateMatrixWorld = function(a) {
- this.matrixAutoUpdate && this.updateMatrix();
- if (this.matrixWorldNeedsUpdate || a) this.parent ? (this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), this.matrixWorld.decompose(this.translationWorld, this.quaternionWorld, this.scaleWorld), this.matrix.decompose(this.translationObject, this.quaternionObject, this.scaleObject), this.matrixWorld.compose(this.translationWorld, this.quaternionObject, this.scaleWorld)) : this.matrixWorld.copy(this.matrix),
- this.matrixWorldNeedsUpdate = !1, a = !0;
- for (var b = 0, c = this.children.length; b < c; b++) this.children[b].updateMatrixWorld(a)
-};
-THREE.Gyroscope.prototype.translationWorld = new THREE.Vector3;
-THREE.Gyroscope.prototype.translationObject = new THREE.Vector3;
-THREE.Gyroscope.prototype.quaternionWorld = new THREE.Quaternion;
-THREE.Gyroscope.prototype.quaternionObject = new THREE.Quaternion;
-THREE.Gyroscope.prototype.scaleWorld = new THREE.Vector3;
-THREE.Gyroscope.prototype.scaleObject = new THREE.Vector3;
-THREE.Path = function(a) {
- THREE.CurvePath.call(this);
- this.actions = [];
- a && this.fromPoints(a)
-};
-THREE.Path.prototype = Object.create(THREE.CurvePath.prototype);
-THREE.PathActions = {
- MOVE_TO: "moveTo",
- LINE_TO: "lineTo",
- QUADRATIC_CURVE_TO: "quadraticCurveTo",
- BEZIER_CURVE_TO: "bezierCurveTo",
- CSPLINE_THRU: "splineThru",
- ARC: "arc",
- ELLIPSE: "ellipse"
-};
-THREE.Path.prototype.fromPoints = function(a) {
- this.moveTo(a[0].x, a[0].y);
- for (var b = 1, c = a.length; b < c; b++) this.lineTo(a[b].x, a[b].y)
-};
-THREE.Path.prototype.moveTo = function(a, b) {
- var c = Array.prototype.slice.call(arguments);
- this.actions.push({
- action: THREE.PathActions.MOVE_TO,
- args: c
- })
-};
-THREE.Path.prototype.lineTo = function(a, b) {
- var c = Array.prototype.slice.call(arguments),
- d = this.actions[this.actions.length - 1].args,
- d = new THREE.LineCurve(new THREE.Vector2(d[d.length - 2], d[d.length - 1]), new THREE.Vector2(a, b));
- this.curves.push(d);
- this.actions.push({
- action: THREE.PathActions.LINE_TO,
- args: c
- })
-};
-THREE.Path.prototype.quadraticCurveTo = function(a, b, c, d) {
- var e = Array.prototype.slice.call(arguments),
- f = this.actions[this.actions.length - 1].args,
- f = new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length - 2], f[f.length - 1]), new THREE.Vector2(a, b), new THREE.Vector2(c, d));
- this.curves.push(f);
- this.actions.push({
- action: THREE.PathActions.QUADRATIC_CURVE_TO,
- args: e
- })
-};
-THREE.Path.prototype.bezierCurveTo = function(a, b, c, d, e, f) {
- var h = Array.prototype.slice.call(arguments),
- g = this.actions[this.actions.length - 1].args,
- g = new THREE.CubicBezierCurve(new THREE.Vector2(g[g.length - 2], g[g.length - 1]), new THREE.Vector2(a, b), new THREE.Vector2(c, d), new THREE.Vector2(e, f));
- this.curves.push(g);
- this.actions.push({
- action: THREE.PathActions.BEZIER_CURVE_TO,
- args: h
- })
-};
-THREE.Path.prototype.splineThru = function(a) {
- var b = Array.prototype.slice.call(arguments),
- c = this.actions[this.actions.length - 1].args,
- c = [new THREE.Vector2(c[c.length - 2], c[c.length - 1])];
- Array.prototype.push.apply(c, a);
- c = new THREE.SplineCurve(c);
- this.curves.push(c);
- this.actions.push({
- action: THREE.PathActions.CSPLINE_THRU,
- args: b
- })
-};
-THREE.Path.prototype.arc = function(a, b, c, d, e, f) {
- var h = this.actions[this.actions.length - 1].args;
- this.absarc(a + h[h.length - 2], b + h[h.length - 1], c, d, e, f)
-};
-THREE.Path.prototype.absarc = function(a, b, c, d, e, f) {
- this.absellipse(a, b, c, c, d, e, f)
-};
-THREE.Path.prototype.ellipse = function(a, b, c, d, e, f, h) {
- var g = this.actions[this.actions.length - 1].args;
- this.absellipse(a + g[g.length - 2], b + g[g.length - 1], c, d, e, f, h)
-};
-THREE.Path.prototype.absellipse = function(a, b, c, d, e, f, h) {
- var g = Array.prototype.slice.call(arguments),
- i = new THREE.EllipseCurve(a, b, c, d, e, f, h);
- this.curves.push(i);
- i = i.getPoint(1);
- g.push(i.x);
- g.push(i.y);
- this.actions.push({
- action: THREE.PathActions.ELLIPSE,
- args: g
- })
-};
-THREE.Path.prototype.getSpacedPoints = function(a) {
- a || (a = 40);
- for (var b = [], c = 0; c < a; c++) b.push(this.getPoint(c / a));
- return b
-};
-THREE.Path.prototype.getPoints = function(a, b) {
- if (this.useSpacedPoints) return console.log("tata"), this.getSpacedPoints(a, b);
- var a = a || 12,
- c = [],
- d, e, f, h, g, i, k, m, l, p, t, s, q;
- d = 0;
- for (e = this.actions.length; d < e; d++) switch (f = this.actions[d], h = f.action, f = f.args, h) {
- case THREE.PathActions.MOVE_TO:
- c.push(new THREE.Vector2(f[0], f[1]));
- break;
- case THREE.PathActions.LINE_TO:
- c.push(new THREE.Vector2(f[0], f[1]));
- break;
- case THREE.PathActions.QUADRATIC_CURVE_TO:
- g = f[2];
- i = f[3];
- l = f[0];
- p = f[1];
- 0 < c.length ? (h = c[c.length - 1], t = h.x,
- s = h.y) : (h = this.actions[d - 1].args, t = h[h.length - 2], s = h[h.length - 1]);
- for (f = 1; f <= a; f++) q = f / a, h = THREE.Shape.Utils.b2(q, t, l, g), q = THREE.Shape.Utils.b2(q, s, p, i), c.push(new THREE.Vector2(h, q));
- break;
- case THREE.PathActions.BEZIER_CURVE_TO:
- g = f[4];
- i = f[5];
- l = f[0];
- p = f[1];
- k = f[2];
- m = f[3];
- 0 < c.length ? (h = c[c.length - 1], t = h.x, s = h.y) : (h = this.actions[d - 1].args, t = h[h.length - 2], s = h[h.length - 1]);
- for (f = 1; f <= a; f++) q = f / a, h = THREE.Shape.Utils.b3(q, t, l, k, g), q = THREE.Shape.Utils.b3(q, s, p, m, i), c.push(new THREE.Vector2(h, q));
- break;
- case THREE.PathActions.CSPLINE_THRU:
- h = this.actions[d - 1].args;
- q = [new THREE.Vector2(h[h.length - 2], h[h.length - 1])];
- h = a * f[0].length;
- q = q.concat(f[0]);
- q = new THREE.SplineCurve(q);
- for (f = 1; f <= h; f++) c.push(q.getPointAt(f / h));
- break;
- case THREE.PathActions.ARC:
- g = f[0];
- i = f[1];
- p = f[2];
- k = f[3];
- h = f[4];
- l = !! f[5];
- t = h - k;
- s = 2 * a;
- for (f = 1; f <= s; f++) q = f / s, l || (q = 1 - q), q = k + q * t, h = g + p * Math.cos(q), q = i + p * Math.sin(q), c.push(new THREE.Vector2(h, q));
- break;
- case THREE.PathActions.ELLIPSE:
- g = f[0];
- i = f[1];
- p = f[2];
- m = f[3];
- k = f[4];
- h = f[5];
- l = !! f[6];
- t = h - k;
- s = 2 * a;
- for (f = 1; f <= s; f++) q = f / s, l || (q = 1 - q), q = k + q * t, h = g + p * Math.cos(q), q = i + m * Math.sin(q), c.push(new THREE.Vector2(h, q))
- }
- d = c[c.length - 1];
- 1E-10 > Math.abs(d.x - c[0].x) && 1E-10 > Math.abs(d.y - c[0].y) && c.splice(c.length - 1, 1);
- b && c.push(c[0]);
- return c
-};
-THREE.Path.prototype.toShapes = function(a) {
- var b, c, d, e, f = [],
- h = new THREE.Path;
- b = 0;
- for (c = this.actions.length; b < c; b++) d = this.actions[b], e = d.args, d = d.action, d == THREE.PathActions.MOVE_TO && 0 != h.actions.length && (f.push(h), h = new THREE.Path), h[d].apply(h, e);
- 0 != h.actions.length && f.push(h);
- if (0 == f.length) return [];
- var g;
- e = [];
- if (1 == f.length) return d = f[0], g = new THREE.Shape, g.actions = d.actions, g.curves = d.curves, e.push(g), e;
- b = !THREE.Shape.Utils.isClockWise(f[0].getPoints());
- if (a ? !b : b) {
- g = new THREE.Shape;
- b = 0;
- for (c = f.length; b < c; b++) d = f[b], h = THREE.Shape.Utils.isClockWise(d.getPoints()), (h = a ? !h : h) ? (g.actions = d.actions, g.curves = d.curves, e.push(g), g = new THREE.Shape) : g.holes.push(d)
- } else {
- g = void 0;
- b = 0;
- for (c = f.length; b < c; b++) d = f[b], h = THREE.Shape.Utils.isClockWise(d.getPoints()), (h = a ? !h : h) ? (g && e.push(g), g = new THREE.Shape, g.actions = d.actions, g.curves = d.curves) : g.holes.push(d);
- e.push(g)
- }
- return e
-};
-THREE.Shape = function() {
- THREE.Path.apply(this, arguments);
- this.holes = []
-};
-THREE.Shape.prototype = Object.create(THREE.Path.prototype);
-THREE.Shape.prototype.extrude = function(a) {
- return new THREE.ExtrudeGeometry(this, a)
-};
-THREE.Shape.prototype.makeGeometry = function(a) {
- return new THREE.ShapeGeometry(this, a)
-};
-THREE.Shape.prototype.getPointsHoles = function(a) {
- var b, c = this.holes.length,
- d = [];
- for (b = 0; b < c; b++) d[b] = this.holes[b].getTransformedPoints(a, this.bends);
- return d
-};
-THREE.Shape.prototype.getSpacedPointsHoles = function(a) {
- var b, c = this.holes.length,
- d = [];
- for (b = 0; b < c; b++) d[b] = this.holes[b].getTransformedSpacedPoints(a, this.bends);
- return d
-};
-THREE.Shape.prototype.extractAllPoints = function(a) {
- return {
- shape: this.getTransformedPoints(a),
- holes: this.getPointsHoles(a)
- }
-};
-THREE.Shape.prototype.extractPoints = function(a) {
- return this.useSpacedPoints ? this.extractAllSpacedPoints(a) : this.extractAllPoints(a)
-};
-THREE.Shape.prototype.extractAllSpacedPoints = function(a) {
- return {
- shape: this.getTransformedSpacedPoints(a),
- holes: this.getSpacedPointsHoles(a)
- }
-};
-THREE.Shape.Utils = {
- removeHoles: function(a, b) {
- var c = a.concat(),
- d = c.concat(),
- e, f, h, g, i, k, m, l, p, t, s = [];
- for (i = 0; i < b.length; i++) {
- k = b[i];
- Array.prototype.push.apply(d, k);
- f = Number.POSITIVE_INFINITY;
- for (e = 0; e < k.length; e++) {
- p = k[e];
- t = [];
- for (l = 0; l < c.length; l++) m = c[l], m = p.distanceToSquared(m), t.push(m), m < f && (f = m, h = e, g = l)
- }
- e = 0 <= g - 1 ? g - 1 : c.length - 1;
- f = 0 <= h - 1 ? h - 1 : k.length - 1;
- var q = [k[h], c[g], c[e]];
- l = THREE.FontUtils.Triangulate.area(q);
- var n = [k[h], k[f], c[g]];
- p = THREE.FontUtils.Triangulate.area(n);
- t = g;
- m = h;
- g += 1;
- h += -1;
- 0 > g && (g += c.length);
- g %= c.length;
- 0 > h && (h += k.length);
- h %= k.length;
- e = 0 <= g - 1 ? g - 1 : c.length - 1;
- f = 0 <= h - 1 ? h - 1 : k.length - 1;
- q = [k[h], c[g], c[e]];
- q = THREE.FontUtils.Triangulate.area(q);
- n = [k[h], k[f], c[g]];
- n = THREE.FontUtils.Triangulate.area(n);
- l + p > q + n && (g = t, h = m, 0 > g && (g += c.length), g %= c.length, 0 > h && (h += k.length), h %= k.length, e = 0 <= g - 1 ? g - 1 : c.length - 1, f = 0 <= h - 1 ? h - 1 : k.length - 1);
- l = c.slice(0, g);
- p = c.slice(g);
- t = k.slice(h);
- m = k.slice(0, h);
- f = [k[h], k[f], c[g]];
- s.push([k[h], c[g], c[e]]);
- s.push(f);
- c = l.concat(t).concat(m).concat(p)
- }
- return {
- shape: c,
- isolatedPts: s,
- allpoints: d
- }
- },
- triangulateShape: function(a, b) {
- var c = THREE.Shape.Utils.removeHoles(a, b),
- d = c.allpoints,
- e = c.isolatedPts,
- c = THREE.FontUtils.Triangulate(c.shape, !1),
- f, h, g, i, k = {};
- f = 0;
- for (h = d.length; f < h; f++) i = d[f].x + ":" + d[f].y, void 0 !== k[i] && console.log("Duplicate point", i), k[i] = f;
- f = 0;
- for (h = c.length; f < h; f++) {
- g = c[f];
- for (d = 0; 3 > d; d++) i = g[d].x + ":" + g[d].y, i = k[i], void 0 !== i && (g[d] = i)
- }
- f = 0;
- for (h = e.length; f < h; f++) {
- g = e[f];
- for (d = 0; 3 > d; d++) i = g[d].x + ":" + g[d].y, i = k[i], void 0 !== i && (g[d] = i)
- }
- return c.concat(e)
- },
- isClockWise: function(a) {
- return 0 > THREE.FontUtils.Triangulate.area(a)
- },
- b2p0: function(a, b) {
- var c = 1 - a;
- return c * c * b
- },
- b2p1: function(a, b) {
- return 2 * (1 - a) * a * b
- },
- b2p2: function(a, b) {
- return a * a * b
- },
- b2: function(a, b, c, d) {
- return this.b2p0(a, b) + this.b2p1(a, c) + this.b2p2(a, d)
- },
- b3p0: function(a, b) {
- var c = 1 - a;
- return c * c * c * b
- },
- b3p1: function(a, b) {
- var c = 1 - a;
- return 3 * c * c * a * b
- },
- b3p2: function(a, b) {
- return 3 * (1 - a) * a * a * b
- },
- b3p3: function(a, b) {
- return a * a * a * b
- },
- b3: function(a, b, c, d, e) {
- return this.b3p0(a, b) + this.b3p1(a, c) + this.b3p2(a, d) + this.b3p3(a, e)
- }
-};
-THREE.LineCurve = function(a, b) {
- this.v1 = a;
- this.v2 = b
-};
-THREE.LineCurve.prototype = Object.create(THREE.Curve.prototype);
-THREE.LineCurve.prototype.getPoint = function(a) {
- var b = this.v2.clone().sub(this.v1);
- b.multiplyScalar(a).add(this.v1);
- return b
-};
-THREE.LineCurve.prototype.getPointAt = function(a) {
- return this.getPoint(a)
-};
-THREE.LineCurve.prototype.getTangent = function() {
- return this.v2.clone().sub(this.v1).normalize()
-};
-THREE.QuadraticBezierCurve = function(a, b, c) {
- this.v0 = a;
- this.v1 = b;
- this.v2 = c
-};
-THREE.QuadraticBezierCurve.prototype = Object.create(THREE.Curve.prototype);
-THREE.QuadraticBezierCurve.prototype.getPoint = function(a) {
- var b;
- b = THREE.Shape.Utils.b2(a, this.v0.x, this.v1.x, this.v2.x);
- a = THREE.Shape.Utils.b2(a, this.v0.y, this.v1.y, this.v2.y);
- return new THREE.Vector2(b, a)
-};
-THREE.QuadraticBezierCurve.prototype.getTangent = function(a) {
- var b;
- b = THREE.Curve.Utils.tangentQuadraticBezier(a, this.v0.x, this.v1.x, this.v2.x);
- a = THREE.Curve.Utils.tangentQuadraticBezier(a, this.v0.y, this.v1.y, this.v2.y);
- b = new THREE.Vector2(b, a);
- b.normalize();
- return b
-};
-THREE.CubicBezierCurve = function(a, b, c, d) {
- this.v0 = a;
- this.v1 = b;
- this.v2 = c;
- this.v3 = d
-};
-THREE.CubicBezierCurve.prototype = Object.create(THREE.Curve.prototype);
-THREE.CubicBezierCurve.prototype.getPoint = function(a) {
- var b;
- b = THREE.Shape.Utils.b3(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x);
- a = THREE.Shape.Utils.b3(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y);
- return new THREE.Vector2(b, a)
-};
-THREE.CubicBezierCurve.prototype.getTangent = function(a) {
- var b;
- b = THREE.Curve.Utils.tangentCubicBezier(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x);
- a = THREE.Curve.Utils.tangentCubicBezier(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y);
- b = new THREE.Vector2(b, a);
- b.normalize();
- return b
-};
-THREE.SplineCurve = function(a) {
- this.points = void 0 == a ? [] : a
-};
-THREE.SplineCurve.prototype = Object.create(THREE.Curve.prototype);
-THREE.SplineCurve.prototype.getPoint = function(a) {
- var b = new THREE.Vector2,
- c = [],
- d = this.points,
- e;
- e = (d.length - 1) * a;
- a = Math.floor(e);
- e -= a;
- c[0] = 0 == a ? a : a - 1;
- c[1] = a;
- c[2] = a > d.length - 2 ? d.length - 1 : a + 1;
- c[3] = a > d.length - 3 ? d.length - 1 : a + 2;
- b.x = THREE.Curve.Utils.interpolate(d[c[0]].x, d[c[1]].x, d[c[2]].x, d[c[3]].x, e);
- b.y = THREE.Curve.Utils.interpolate(d[c[0]].y, d[c[1]].y, d[c[2]].y, d[c[3]].y, e);
- return b
-};
-THREE.EllipseCurve = function(a, b, c, d, e, f, h) {
- this.aX = a;
- this.aY = b;
- this.xRadius = c;
- this.yRadius = d;
- this.aStartAngle = e;
- this.aEndAngle = f;
- this.aClockwise = h
-};
-THREE.EllipseCurve.prototype = Object.create(THREE.Curve.prototype);
-THREE.EllipseCurve.prototype.getPoint = function(a) {
- var b;
- b = this.aEndAngle - this.aStartAngle;
- 0 > b && (b += 2 * Math.PI);
- b > 2 * Math.PI && (b -= 2 * Math.PI);
- b = !0 === this.aClockwise ? this.aEndAngle + (1 - a) * (2 * Math.PI - b) : this.aStartAngle + a * b;
- a = this.aX + this.xRadius * Math.cos(b);
- b = this.aY + this.yRadius * Math.sin(b);
- return new THREE.Vector2(a, b)
-};
-THREE.ArcCurve = function(a, b, c, d, e, f) {
- THREE.EllipseCurve.call(this, a, b, c, c, d, e, f)
-};
-THREE.ArcCurve.prototype = Object.create(THREE.EllipseCurve.prototype);
-THREE.LineCurve3 = THREE.Curve.create(function(a, b) {
- this.v1 = a;
- this.v2 = b
-}, function(a) {
- var b = new THREE.Vector3;
- b.subVectors(this.v2, this.v1);
- b.multiplyScalar(a);
- b.add(this.v1);
- return b
-});
-THREE.QuadraticBezierCurve3 = THREE.Curve.create(function(a, b, c) {
- this.v0 = a;
- this.v1 = b;
- this.v2 = c
-}, function(a) {
- var b, c;
- b = THREE.Shape.Utils.b2(a, this.v0.x, this.v1.x, this.v2.x);
- c = THREE.Shape.Utils.b2(a, this.v0.y, this.v1.y, this.v2.y);
- a = THREE.Shape.Utils.b2(a, this.v0.z, this.v1.z, this.v2.z);
- return new THREE.Vector3(b, c, a)
-});
-THREE.CubicBezierCurve3 = THREE.Curve.create(function(a, b, c, d) {
- this.v0 = a;
- this.v1 = b;
- this.v2 = c;
- this.v3 = d
-}, function(a) {
- var b, c;
- b = THREE.Shape.Utils.b3(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x);
- c = THREE.Shape.Utils.b3(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y);
- a = THREE.Shape.Utils.b3(a, this.v0.z, this.v1.z, this.v2.z, this.v3.z);
- return new THREE.Vector3(b, c, a)
-});
-THREE.SplineCurve3 = THREE.Curve.create(function(a) {
- this.points = void 0 == a ? [] : a
-}, function(a) {
- var b = new THREE.Vector3,
- c = [],
- d = this.points,
- e, a = (d.length - 1) * a;
- e = Math.floor(a);
- a -= e;
- c[0] = 0 == e ? e : e - 1;
- c[1] = e;
- c[2] = e > d.length - 2 ? d.length - 1 : e + 1;
- c[3] = e > d.length - 3 ? d.length - 1 : e + 2;
- e = d[c[0]];
- var f = d[c[1]],
- h = d[c[2]],
- c = d[c[3]];
- b.x = THREE.Curve.Utils.interpolate(e.x, f.x, h.x, c.x, a);
- b.y = THREE.Curve.Utils.interpolate(e.y, f.y, h.y, c.y, a);
- b.z = THREE.Curve.Utils.interpolate(e.z, f.z, h.z, c.z, a);
- return b
-});
-THREE.ClosedSplineCurve3 = THREE.Curve.create(function(a) {
- this.points = void 0 == a ? [] : a
-}, function(a) {
- var b = new THREE.Vector3,
- c = [],
- d = this.points,
- e;
- e = (d.length - 0) * a;
- a = Math.floor(e);
- e -= a;
- a += 0 < a ? 0 : (Math.floor(Math.abs(a) / d.length) + 1) * d.length;
- c[0] = (a - 1) % d.length;
- c[1] = a % d.length;
- c[2] = (a + 1) % d.length;
- c[3] = (a + 2) % d.length;
- b.x = THREE.Curve.Utils.interpolate(d[c[0]].x, d[c[1]].x, d[c[2]].x, d[c[3]].x, e);
- b.y = THREE.Curve.Utils.interpolate(d[c[0]].y, d[c[1]].y, d[c[2]].y, d[c[3]].y, e);
- b.z = THREE.Curve.Utils.interpolate(d[c[0]].z,
- d[c[1]].z, d[c[2]].z, d[c[3]].z, e);
- return b
-});
-THREE.AnimationHandler = function() {
- var a = [],
- b = {}, c = {
- update: function(b) {
- for (var c = 0; c < a.length; c++) a[c].update(b)
- },
- addToUpdate: function(b) {
- -1 === a.indexOf(b) && a.push(b)
- },
- removeFromUpdate: function(b) {
- b = a.indexOf(b); - 1 !== b && a.splice(b, 1)
- },
- add: function(a) {
- void 0 !== b[a.name] && console.log("THREE.AnimationHandler.add: Warning! " + a.name + " already exists in library. Overwriting.");
- b[a.name] = a;
- if (!0 !== a.initialized) {
- for (var c = 0; c < a.hierarchy.length; c++) {
- for (var d = 0; d < a.hierarchy[c].keys.length; d++) if (0 > a.hierarchy[c].keys[d].time && (a.hierarchy[c].keys[d].time = 0), void 0 !== a.hierarchy[c].keys[d].rot && !(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)) {
- var g = a.hierarchy[c].keys[d].rot;
- a.hierarchy[c].keys[d].rot = new THREE.Quaternion(g[0], g[1], g[2], g[3])
- }
- if (a.hierarchy[c].keys.length && void 0 !== a.hierarchy[c].keys[0].morphTargets) {
- g = {};
- for (d = 0; d < a.hierarchy[c].keys.length; d++) for (var i = 0; i < a.hierarchy[c].keys[d].morphTargets.length; i++) {
- var k = a.hierarchy[c].keys[d].morphTargets[i];
- g[k] = -1
- }
- a.hierarchy[c].usedMorphTargets = g;
- for (d = 0; d < a.hierarchy[c].keys.length; d++) {
- var m = {};
- for (k in g) {
- for (i = 0; i < a.hierarchy[c].keys[d].morphTargets.length; i++) if (a.hierarchy[c].keys[d].morphTargets[i] === k) {
- m[k] = a.hierarchy[c].keys[d].morphTargetsInfluences[i];
- break
- }
- i === a.hierarchy[c].keys[d].morphTargets.length && (m[k] = 0)
- }
- a.hierarchy[c].keys[d].morphTargetsInfluences = m
- }
- }
- for (d = 1; d < a.hierarchy[c].keys.length; d++) a.hierarchy[c].keys[d].time === a.hierarchy[c].keys[d - 1].time && (a.hierarchy[c].keys.splice(d, 1), d--);
- for (d = 0; d < a.hierarchy[c].keys.length; d++) a.hierarchy[c].keys[d].index = d
- }
- d = parseInt(a.length * a.fps, 10);
- a.JIT = {};
- a.JIT.hierarchy = [];
- for (c = 0; c < a.hierarchy.length; c++) a.JIT.hierarchy.push(Array(d));
- a.initialized = !0
- }
- },
- get: function(a) {
- if ("string" === typeof a) {
- if (b[a]) return b[a];
- console.log("THREE.AnimationHandler.get: Couldn't find animation " + a);
- return null
- }
- },
- parse: function(a) {
- var b = [];
- if (a instanceof THREE.SkinnedMesh) for (var c = 0; c < a.bones.length; c++) b.push(a.bones[c]);
- else d(a, b);
- return b
- }
- }, d = function(a, b) {
- b.push(a);
- for (var c = 0; c < a.children.length; c++) d(a.children[c],
- b)
- };
- c.LINEAR = 0;
- c.CATMULLROM = 1;
- c.CATMULLROM_FORWARD = 2;
- return c
-}();
-THREE.Animation = function(a, b, c) {
- this.root = a;
- this.data = THREE.AnimationHandler.get(b);
- this.hierarchy = THREE.AnimationHandler.parse(a);
- this.currentTime = 0;
- this.timeScale = 1;
- this.isPlaying = !1;
- this.loop = this.isPaused = !0;
- this.interpolationType = void 0 !== c ? c : THREE.AnimationHandler.LINEAR;
- this.points = [];
- this.target = new THREE.Vector3
-};
-THREE.Animation.prototype.play = function(a, b) {
- if (!1 === this.isPlaying) {
- this.isPlaying = !0;
- this.loop = void 0 !== a ? a : !0;
- this.currentTime = void 0 !== b ? b : 0;
- var c, d = this.hierarchy.length,
- e;
- for (c = 0; c < d; c++) {
- e = this.hierarchy[c];
- e.matrixAutoUpdate = !0;
- void 0 === e.animationCache && (e.animationCache = {}, e.animationCache.prevKey = {
- pos: 0,
- rot: 0,
- scl: 0
- }, e.animationCache.nextKey = {
- pos: 0,
- rot: 0,
- scl: 0
- }, e.animationCache.originalMatrix = e instanceof THREE.Bone ? e.skinMatrix : e.matrix);
- var f = e.animationCache.prevKey;
- e = e.animationCache.nextKey;
- f.pos = this.data.hierarchy[c].keys[0];
- f.rot = this.data.hierarchy[c].keys[0];
- f.scl = this.data.hierarchy[c].keys[0];
- e.pos = this.getNextKeyWith("pos", c, 1);
- e.rot = this.getNextKeyWith("rot", c, 1);
- e.scl = this.getNextKeyWith("scl", c, 1)
- }
- this.update(0)
- }
- this.isPaused = !1;
- THREE.AnimationHandler.addToUpdate(this)
-};
-THREE.Animation.prototype.pause = function() {
- !0 === this.isPaused ? THREE.AnimationHandler.addToUpdate(this) : THREE.AnimationHandler.removeFromUpdate(this);
- this.isPaused = !this.isPaused
-};
-THREE.Animation.prototype.stop = function() {
- this.isPaused = this.isPlaying = !1;
- THREE.AnimationHandler.removeFromUpdate(this)
-};
-THREE.Animation.prototype.update = function(a) {
- if (!1 !== this.isPlaying) {
- var b = ["pos", "rot", "scl"],
- c, d, e, f, h, g, i, k, m;
- for (m = this.currentTime += a * this.timeScale; this.currentTime > this.data.length;) this.currentTime -= this.data.length;
- k = this.currentTime %= this.data.length;
- parseInt(Math.min(k * this.data.fps, this.data.length * this.data.fps), 10);
- for (var l = 0, p = this.hierarchy.length; l < p; l++) {
- a = this.hierarchy[l];
- i = a.animationCache;
- for (var t = 0; 3 > t; t++) {
- c = b[t];
- h = i.prevKey[c];
- g = i.nextKey[c];
- if (g.time <= m) {
- if (k <= m) if (this.loop) {
- h = this.data.hierarchy[l].keys[0];
- for (g = this.getNextKeyWith(c, l, 1); null !== g && g.time < k && g.index > h.index;) h = g, g = this.getNextKeyWith(c, l, g.index + 1)
- } else {
- this.stop();
- return
- } else {
- do h = g, g = this.getNextKeyWith(c, l, g.index + 1);
- while (null !== g && g.time < k && g.index > h.index)
- }
- i.prevKey[c] = h;
- i.nextKey[c] = g
- }
- a.matrixAutoUpdate = !0;
- a.matrixWorldNeedsUpdate = !0;
- d = (k - h.time) / (g.time - h.time);
- e = h[c];
- f = g[c];
- if (0 > d || 1 < d) console.log("THREE.Animation.update: Warning! Scale out of bounds:" + d + " on bone " + l), d = 0 > d ? 0 : 1;
- if ("pos" === c) if (c = a.position, this.interpolationType === THREE.AnimationHandler.LINEAR) c.x = e[0] + (f[0] - e[0]) * d, c.y = e[1] + (f[1] - e[1]) * d, c.z = e[2] + (f[2] - e[2]) * d;
- else {
- if (this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD) this.points[0] = this.getPrevKeyWith("pos", l, h.index - 1).pos, this.points[1] = e, this.points[2] = f, this.points[3] = this.getNextKeyWith("pos", l, g.index + 1).pos, d = 0.33 * d + 0.33, e = this.interpolateCatmullRom(this.points, d), c.x = e[0], c.y = e[1], c.z = e[2],
- this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD && (d = this.interpolateCatmullRom(this.points, 1.01 * d), this.target.set(d[0], d[1], d[2]), this.target.sub(c), this.target.y = 0, this.target.normalize(), d = Math.atan2(this.target.x, this.target.z), a.rotation.set(0, d, 0))
- } else "rot" === c ? THREE.Quaternion.slerp(e, f, a.quaternion, d) : "scl" === c && (c = a.scale, c.x = e[0] + (f[0] - e[0]) * d, c.y = e[1] + (f[1] - e[1]) * d, c.z = e[2] + (f[2] - e[2]) * d)
- }
- }
- }
-};
-THREE.Animation.prototype.interpolateCatmullRom = function(a, b) {
- var c = [],
- d = [],
- e, f, h, g, i, k;
- e = (a.length - 1) * b;
- f = Math.floor(e);
- e -= f;
- c[0] = 0 === f ? f : f - 1;
- c[1] = f;
- c[2] = f > a.length - 2 ? f : f + 1;
- c[3] = f > a.length - 3 ? f : f + 2;
- f = a[c[0]];
- g = a[c[1]];
- i = a[c[2]];
- k = a[c[3]];
- c = e * e;
- h = e * c;
- d[0] = this.interpolate(f[0], g[0], i[0], k[0], e, c, h);
- d[1] = this.interpolate(f[1], g[1], i[1], k[1], e, c, h);
- d[2] = this.interpolate(f[2], g[2], i[2], k[2], e, c, h);
- return d
-};
-THREE.Animation.prototype.interpolate = function(a, b, c, d, e, f, h) {
- a = 0.5 * (c - a);
- d = 0.5 * (d - b);
- return (2 * (b - c) + a + d) * h + (-3 * (b - c) - 2 * a - d) * f + a * e + b
-};
-THREE.Animation.prototype.getNextKeyWith = function(a, b, c) {
- for (var d = this.data.hierarchy[b].keys, c = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ? c < d.length - 1 ? c : d.length - 1 : c % d.length; c < d.length; c++) if (void 0 !== d[c][a]) return d[c];
- return this.data.hierarchy[b].keys[0]
-};
-THREE.Animation.prototype.getPrevKeyWith = function(a, b, c) {
- for (var d = this.data.hierarchy[b].keys, c = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ? 0 < c ? c : 0 : 0 <= c ? c : c + d.length; 0 <= c; c--) if (void 0 !== d[c][a]) return d[c];
- return this.data.hierarchy[b].keys[d.length - 1]
-};
-THREE.KeyFrameAnimation = function(a, b, c) {
- this.root = a;
- this.data = THREE.AnimationHandler.get(b);
- this.hierarchy = THREE.AnimationHandler.parse(a);
- this.currentTime = 0;
- this.timeScale = 0.001;
- this.isPlaying = !1;
- this.loop = this.isPaused = !0;
- this.JITCompile = void 0 !== c ? c : !0;
- a = 0;
- for (b = this.hierarchy.length; a < b; a++) {
- var c = this.data.hierarchy[a].sids,
- d = this.hierarchy[a];
- if (this.data.hierarchy[a].keys.length && c) {
- for (var e = 0; e < c.length; e++) {
- var f = c[e],
- h = this.getNextKeyWith(f, a, 0);
- h && h.apply(f)
- }
- d.matrixAutoUpdate = !1;
- this.data.hierarchy[a].node.updateMatrix();
- d.matrixWorldNeedsUpdate = !0
- }
- }
-};
-THREE.KeyFrameAnimation.prototype.play = function(a, b) {
- if (!this.isPlaying) {
- this.isPlaying = !0;
- this.loop = void 0 !== a ? a : !0;
- this.currentTime = void 0 !== b ? b : 0;
- this.startTimeMs = b;
- this.startTime = 1E7;
- this.endTime = -this.startTime;
- var c, d = this.hierarchy.length,
- e, f;
- for (c = 0; c < d; c++) e = this.hierarchy[c], f = this.data.hierarchy[c], void 0 === f.animationCache && (f.animationCache = {}, f.animationCache.prevKey = null, f.animationCache.nextKey = null, f.animationCache.originalMatrix = e instanceof THREE.Bone ? e.skinMatrix : e.matrix), e = this.data.hierarchy[c].keys,
- e.length && (f.animationCache.prevKey = e[0], f.animationCache.nextKey = e[1], this.startTime = Math.min(e[0].time, this.startTime), this.endTime = Math.max(e[e.length - 1].time, this.endTime));
- this.update(0)
- }
- this.isPaused = !1;
- THREE.AnimationHandler.addToUpdate(this)
-};
-THREE.KeyFrameAnimation.prototype.pause = function() {
- this.isPaused ? THREE.AnimationHandler.addToUpdate(this) : THREE.AnimationHandler.removeFromUpdate(this);
- this.isPaused = !this.isPaused
-};
-THREE.KeyFrameAnimation.prototype.stop = function() {
- this.isPaused = this.isPlaying = !1;
- THREE.AnimationHandler.removeFromUpdate(this);
- for (var a = 0; a < this.data.hierarchy.length; a++) {
- var b = this.hierarchy[a],
- c = this.data.hierarchy[a];
- if (void 0 !== c.animationCache) {
- var d = c.animationCache.originalMatrix;
- b instanceof THREE.Bone ? (d.copy(b.skinMatrix), b.skinMatrix = d) : (d.copy(b.matrix), b.matrix = d);
- delete c.animationCache
- }
- }
-};
-THREE.KeyFrameAnimation.prototype.update = function(a) {
- if (this.isPlaying) {
- var b, c, d, e, f = this.data.JIT.hierarchy,
- h, g, i;
- g = this.currentTime += a * this.timeScale;
- h = this.currentTime %= this.data.length;
- h < this.startTimeMs && (h = this.currentTime = this.startTimeMs + h);
- e = parseInt(Math.min(h * this.data.fps, this.data.length * this.data.fps), 10);
- if ((i = h < g) && !this.loop) {
- for (var a = 0, k = this.hierarchy.length; a < k; a++) {
- var m = this.data.hierarchy[a].keys,
- f = this.data.hierarchy[a].sids;
- d = m.length - 1;
- e = this.hierarchy[a];
- if (m.length) {
- for (m = 0; m < f.length; m++) h = f[m], (g = this.getPrevKeyWith(h, a, d)) && g.apply(h);
- this.data.hierarchy[a].node.updateMatrix();
- e.matrixWorldNeedsUpdate = !0
- }
- }
- this.stop()
- } else if (!(h < this.startTime)) {
- a = 0;
- for (k = this.hierarchy.length; a < k; a++) {
- d = this.hierarchy[a];
- b = this.data.hierarchy[a];
- var m = b.keys,
- l = b.animationCache;
- if (this.JITCompile && void 0 !== f[a][e]) d instanceof THREE.Bone ? (d.skinMatrix = f[a][e], d.matrixWorldNeedsUpdate = !1) : (d.matrix = f[a][e], d.matrixWorldNeedsUpdate = !0);
- else if (m.length) {
- this.JITCompile && l && (d instanceof
- THREE.Bone ? d.skinMatrix = l.originalMatrix : d.matrix = l.originalMatrix);
- b = l.prevKey;
- c = l.nextKey;
- if (b && c) {
- if (c.time <= g) {
- if (i && this.loop) {
- b = m[0];
- for (c = m[1]; c.time < h;) b = c, c = m[b.index + 1]
- } else if (!i) for (var p = m.length - 1; c.time < h && c.index !== p;) b = c, c = m[b.index + 1];
- l.prevKey = b;
- l.nextKey = c
- }
- c.time >= h ? b.interpolate(c, h) : b.interpolate(c, c.time)
- }
- this.data.hierarchy[a].node.updateMatrix();
- d.matrixWorldNeedsUpdate = !0
- }
- }
- if (this.JITCompile && void 0 === f[0][e]) {
- this.hierarchy[0].updateMatrixWorld(!0);
- for (a = 0; a < this.hierarchy.length; a++) f[a][e] = this.hierarchy[a] instanceof THREE.Bone ? this.hierarchy[a].skinMatrix.clone() : this.hierarchy[a].matrix.clone()
- }
- }
- }
-};
-THREE.KeyFrameAnimation.prototype.getNextKeyWith = function(a, b, c) {
- b = this.data.hierarchy[b].keys;
- for (c %= b.length; c < b.length; c++) if (b[c].hasTarget(a)) return b[c];
- return b[0]
-};
-THREE.KeyFrameAnimation.prototype.getPrevKeyWith = function(a, b, c) {
- b = this.data.hierarchy[b].keys;
- for (c = 0 <= c ? c : c + b.length; 0 <= c; c--) if (b[c].hasTarget(a)) return b[c];
- return b[b.length - 1]
-};
-THREE.CubeCamera = function(a, b, c) {
- THREE.Object3D.call(this);
- var d = new THREE.PerspectiveCamera(90, 1, a, b);
- d.up.set(0, - 1, 0);
- d.lookAt(new THREE.Vector3(1, 0, 0));
- this.add(d);
- var e = new THREE.PerspectiveCamera(90, 1, a, b);
- e.up.set(0, - 1, 0);
- e.lookAt(new THREE.Vector3(-1, 0, 0));
- this.add(e);
- var f = new THREE.PerspectiveCamera(90, 1, a, b);
- f.up.set(0, 0, 1);
- f.lookAt(new THREE.Vector3(0, 1, 0));
- this.add(f);
- var h = new THREE.PerspectiveCamera(90, 1, a, b);
- h.up.set(0, 0, - 1);
- h.lookAt(new THREE.Vector3(0, - 1, 0));
- this.add(h);
- var g = new THREE.PerspectiveCamera(90,
- 1, a, b);
- g.up.set(0, - 1, 0);
- g.lookAt(new THREE.Vector3(0, 0, 1));
- this.add(g);
- var i = new THREE.PerspectiveCamera(90, 1, a, b);
- i.up.set(0, - 1, 0);
- i.lookAt(new THREE.Vector3(0, 0, - 1));
- this.add(i);
- this.renderTarget = new THREE.WebGLRenderTargetCube(c, c, {
- format: THREE.RGBFormat,
- magFilter: THREE.LinearFilter,
- minFilter: THREE.LinearFilter
- });
- this.updateCubeMap = function(a, b) {
- var c = this.renderTarget,
- p = c.generateMipmaps;
- c.generateMipmaps = !1;
- c.activeCubeFace = 0;
- a.render(b, d, c);
- c.activeCubeFace = 1;
- a.render(b, e, c);
- c.activeCubeFace = 2;
- a.render(b, f, c);
- c.activeCubeFace = 3;
- a.render(b, h, c);
- c.activeCubeFace = 4;
- a.render(b, g, c);
- c.generateMipmaps = p;
- c.activeCubeFace = 5;
- a.render(b, i, c)
- }
-};
-THREE.CubeCamera.prototype = Object.create(THREE.Object3D.prototype);
-THREE.CombinedCamera = function(a, b, c, d, e, f, h) {
- THREE.Camera.call(this);
- this.fov = c;
- this.left = -a / 2;
- this.right = a / 2;
- this.top = b / 2;
- this.bottom = -b / 2;
- this.cameraO = new THREE.OrthographicCamera(a / -2, a / 2, b / 2, b / -2, f, h);
- this.cameraP = new THREE.PerspectiveCamera(c, a / b, d, e);
- this.zoom = 1;
- this.toPerspective()
-};
-THREE.CombinedCamera.prototype = Object.create(THREE.Camera.prototype);
-THREE.CombinedCamera.prototype.toPerspective = function() {
- this.near = this.cameraP.near;
- this.far = this.cameraP.far;
- this.cameraP.fov = this.fov / this.zoom;
- this.cameraP.updateProjectionMatrix();
- this.projectionMatrix = this.cameraP.projectionMatrix;
- this.inPerspectiveMode = !0;
- this.inOrthographicMode = !1
-};
-THREE.CombinedCamera.prototype.toOrthographic = function() {
- var a = this.cameraP.aspect,
- b = (this.cameraP.near + this.cameraP.far) / 2,
- b = Math.tan(this.fov / 2) * b,
- a = 2 * b * a / 2,
- b = b / this.zoom,
- a = a / this.zoom;
- this.cameraO.left = -a;
- this.cameraO.right = a;
- this.cameraO.top = b;
- this.cameraO.bottom = -b;
- this.cameraO.updateProjectionMatrix();
- this.near = this.cameraO.near;
- this.far = this.cameraO.far;
- this.projectionMatrix = this.cameraO.projectionMatrix;
- this.inPerspectiveMode = !1;
- this.inOrthographicMode = !0
-};
-THREE.CombinedCamera.prototype.setSize = function(a, b) {
- this.cameraP.aspect = a / b;
- this.left = -a / 2;
- this.right = a / 2;
- this.top = b / 2;
- this.bottom = -b / 2
-};
-THREE.CombinedCamera.prototype.setFov = function(a) {
- this.fov = a;
- this.inPerspectiveMode ? this.toPerspective() : this.toOrthographic()
-};
-THREE.CombinedCamera.prototype.updateProjectionMatrix = function() {
- this.inPerspectiveMode ? this.toPerspective() : (this.toPerspective(), this.toOrthographic())
-};
-THREE.CombinedCamera.prototype.setLens = function(a, b) {
- void 0 === b && (b = 24);
- var c = 2 * THREE.Math.radToDeg(Math.atan(b / (2 * a)));
- this.setFov(c);
- return c
-};
-THREE.CombinedCamera.prototype.setZoom = function(a) {
- this.zoom = a;
- this.inPerspectiveMode ? this.toPerspective() : this.toOrthographic()
-};
-THREE.CombinedCamera.prototype.toFrontView = function() {
- this.rotation.x = 0;
- this.rotation.y = 0;
- this.rotation.z = 0;
- this.rotationAutoUpdate = !1
-};
-THREE.CombinedCamera.prototype.toBackView = function() {
- this.rotation.x = 0;
- this.rotation.y = Math.PI;
- this.rotation.z = 0;
- this.rotationAutoUpdate = !1
-};
-THREE.CombinedCamera.prototype.toLeftView = function() {
- this.rotation.x = 0;
- this.rotation.y = -Math.PI / 2;
- this.rotation.z = 0;
- this.rotationAutoUpdate = !1
-};
-THREE.CombinedCamera.prototype.toRightView = function() {
- this.rotation.x = 0;
- this.rotation.y = Math.PI / 2;
- this.rotation.z = 0;
- this.rotationAutoUpdate = !1
-};
-THREE.CombinedCamera.prototype.toTopView = function() {
- this.rotation.x = -Math.PI / 2;
- this.rotation.y = 0;
- this.rotation.z = 0;
- this.rotationAutoUpdate = !1
-};
-THREE.CombinedCamera.prototype.toBottomView = function() {
- this.rotation.x = Math.PI / 2;
- this.rotation.y = 0;
- this.rotation.z = 0;
- this.rotationAutoUpdate = !1
-};
-THREE.CircleGeometry = function(a, b, c, d) {
- THREE.Geometry.call(this);
- this.radius = a = a || 50;
- this.segments = b = void 0 !== b ? Math.max(3, b) : 8;
- this.thetaStart = c = void 0 !== c ? c : 0;
- this.thetaLength = d = void 0 !== d ? d : 2 * Math.PI;
- var e, f = [];
- e = new THREE.Vector3;
- var h = new THREE.Vector2(0.5, 0.5);
- this.vertices.push(e);
- f.push(h);
- for (e = 0; e <= b; e++) {
- var g = new THREE.Vector3,
- i = c + e / b * d;
- g.x = a * Math.cos(i);
- g.y = a * Math.sin(i);
- this.vertices.push(g);
- f.push(new THREE.Vector2((g.x / a + 1) / 2, (g.y / a + 1) / 2))
- }
- c = new THREE.Vector3(0, 0, 1);
- for (e = 1; e <= b; e++) this.faces.push(new THREE.Face3(e,
- e + 1, 0, [c.clone(), c.clone(), c.clone()])), this.faceVertexUvs[0].push([f[e].clone(), f[e + 1].clone(), h.clone()]);
- this.computeCentroids();
- this.computeFaceNormals();
- this.boundingSphere = new THREE.Sphere(new THREE.Vector3, a)
-};
-THREE.CircleGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.CubeGeometry = function(a, b, c, d, e, f) {
- function h(a, b, c, d, e, f, h, q) {
- var n, u = g.widthSegments,
- r = g.heightSegments,
- v = e / 2,
- z = f / 2,
- G = g.vertices.length;
- if ("x" === a && "y" === b || "y" === a && "x" === b) n = "z";
- else if ("x" === a && "z" === b || "z" === a && "x" === b) n = "y", r = g.depthSegments;
- else if ("z" === a && "y" === b || "y" === a && "z" === b) n = "x", u = g.depthSegments;
- var w = u + 1,
- y = r + 1,
- E = e / u,
- A = f / r,
- K = new THREE.Vector3;
- K[n] = 0 < h ? 1 : -1;
- for (e = 0; e < y; e++) for (f = 0; f < w; f++) {
- var D = new THREE.Vector3;
- D[a] = (f * E - v) * c;
- D[b] = (e * A - z) * d;
- D[n] = h;
- g.vertices.push(D)
- }
- for (e = 0; e < r; e++) for (f = 0; f < u; f++) z = f + w * e, a = f + w * (e + 1), b = f + 1 + w * (e + 1), c = f + 1 + w * e, d = new THREE.Vector2(f / u, 1 - e / r), h = new THREE.Vector2(f / u, 1 - (e + 1) / r), n = new THREE.Vector2((f + 1) / u, 1 - (e + 1) / r), v = new THREE.Vector2((f + 1) / u, 1 - e / r), z = new THREE.Face3(z + G, a + G, c + G), z.normal.copy(K), z.vertexNormals.push(K.clone(), K.clone(), K.clone()), z.materialIndex = q, g.faces.push(z), g.faceVertexUvs[0].push([d, h, v]), z = new THREE.Face3(a + G, b + G, c + G), z.normal.copy(K), z.vertexNormals.push(K.clone(), K.clone(), K.clone()), z.materialIndex = q, g.faces.push(z),
- g.faceVertexUvs[0].push([h.clone(), n, v.clone()])
- }
- THREE.Geometry.call(this);
- var g = this;
- this.width = a;
- this.height = b;
- this.depth = c;
- this.widthSegments = d || 1;
- this.heightSegments = e || 1;
- this.depthSegments = f || 1;
- a = this.width / 2;
- b = this.height / 2;
- c = this.depth / 2;
- h("z", "y", - 1, - 1, this.depth, this.height, a, 0);
- h("z", "y", 1, - 1, this.depth, this.height, - a, 1);
- h("x", "z", 1, 1, this.width, this.depth, b, 2);
- h("x", "z", 1, - 1, this.width, this.depth, - b, 3);
- h("x", "y", 1, - 1, this.width, this.height, c, 4);
- h("x", "y", - 1, - 1, this.width, this.height, - c,
- 5);
- this.computeCentroids();
- this.mergeVertices()
-};
-THREE.CubeGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.CylinderGeometry = function(a, b, c, d, e, f) {
- THREE.Geometry.call(this);
- this.radiusTop = a = void 0 !== a ? a : 20;
- this.radiusBottom = b = void 0 !== b ? b : 20;
- this.height = c = void 0 !== c ? c : 100;
- this.radialSegments = d = d || 8;
- this.heightSegments = e = e || 1;
- this.openEnded = f = void 0 !== f ? f : !1;
- var h = c / 2,
- g, i, k = [],
- m = [];
- for (i = 0; i <= e; i++) {
- var l = [],
- p = [],
- t = i / e,
- s = t * (b - a) + a;
- for (g = 0; g <= d; g++) {
- var q = g / d,
- n = new THREE.Vector3;
- n.x = s * Math.sin(2 * q * Math.PI);
- n.y = -t * c + h;
- n.z = s * Math.cos(2 * q * Math.PI);
- this.vertices.push(n);
- l.push(this.vertices.length - 1);
- p.push(new THREE.Vector2(q,
- 1 - t))
- }
- k.push(l);
- m.push(p)
- }
- c = (b - a) / c;
- for (g = 0; g < d; g++) {
- 0 !== a ? (l = this.vertices[k[0][g]].clone(), p = this.vertices[k[0][g + 1]].clone()) : (l = this.vertices[k[1][g]].clone(), p = this.vertices[k[1][g + 1]].clone());
- l.setY(Math.sqrt(l.x * l.x + l.z * l.z) * c).normalize();
- p.setY(Math.sqrt(p.x * p.x + p.z * p.z) * c).normalize();
- for (i = 0; i < e; i++) {
- var t = k[i][g],
- s = k[i + 1][g],
- q = k[i + 1][g + 1],
- n = k[i][g + 1],
- u = l.clone(),
- r = l.clone(),
- v = p.clone(),
- z = p.clone(),
- G = m[i][g].clone(),
- w = m[i + 1][g].clone(),
- y = m[i + 1][g + 1].clone(),
- E = m[i][g + 1].clone();
- this.faces.push(new THREE.Face3(t,
- s, n, [u, r, z]));
- this.faceVertexUvs[0].push([G, w, E]);
- this.faces.push(new THREE.Face3(s, q, n, [r.clone(), v, z.clone()]));
- this.faceVertexUvs[0].push([w.clone(), y, E.clone()])
- }
- }
- if (!1 === f && 0 < a) {
- this.vertices.push(new THREE.Vector3(0, h, 0));
- for (g = 0; g < d; g++) t = k[0][g], s = k[0][g + 1], q = this.vertices.length - 1, u = new THREE.Vector3(0, 1, 0), r = new THREE.Vector3(0, 1, 0), v = new THREE.Vector3(0, 1, 0), G = m[0][g].clone(), w = m[0][g + 1].clone(), y = new THREE.Vector2(w.x, 0), this.faces.push(new THREE.Face3(t, s, q, [u, r, v])), this.faceVertexUvs[0].push([G,
- w, y])
- }
- if (!1 === f && 0 < b) {
- this.vertices.push(new THREE.Vector3(0, - h, 0));
- for (g = 0; g < d; g++) t = k[i][g + 1], s = k[i][g], q = this.vertices.length - 1, u = new THREE.Vector3(0, - 1, 0), r = new THREE.Vector3(0, - 1, 0), v = new THREE.Vector3(0, - 1, 0), G = m[i][g + 1].clone(), w = m[i][g].clone(), y = new THREE.Vector2(w.x, 1), this.faces.push(new THREE.Face3(t, s, q, [u, r, v])), this.faceVertexUvs[0].push([G, w, y])
- }
- this.computeCentroids();
- this.computeFaceNormals()
-};
-THREE.CylinderGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.ExtrudeGeometry = function(a, b) {
- "undefined" !== typeof a && (THREE.Geometry.call(this), a = a instanceof Array ? a : [a], this.shapebb = a[a.length - 1].getBoundingBox(), this.addShapeList(a, b), this.computeCentroids(), this.computeFaceNormals())
-};
-THREE.ExtrudeGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.ExtrudeGeometry.prototype.addShapeList = function(a, b) {
- for (var c = a.length, d = 0; d < c; d++) this.addShape(a[d], b)
-};
-THREE.ExtrudeGeometry.prototype.addShape = function(a, b) {
- function c(a, b, c) {
- b || console.log("die");
- return b.clone().multiplyScalar(c).add(a)
- }
- function d(a, b, c) {
- var d = THREE.ExtrudeGeometry.__v1,
- e = THREE.ExtrudeGeometry.__v2,
- f = THREE.ExtrudeGeometry.__v3,
- g = THREE.ExtrudeGeometry.__v4,
- h = THREE.ExtrudeGeometry.__v5,
- i = THREE.ExtrudeGeometry.__v6;
- d.set(a.x - b.x, a.y - b.y);
- e.set(a.x - c.x, a.y - c.y);
- d = d.normalize();
- e = e.normalize();
- f.set(-d.y, d.x);
- g.set(e.y, - e.x);
- h.copy(a).add(f);
- i.copy(a).add(g);
- if (h.equals(i)) return g.clone();
- h.copy(b).add(f);
- i.copy(c).add(g);
- f = d.dot(g);
- g = i.sub(h).dot(g);
- 0 === f && (console.log("Either infinite or no solutions!"), 0 === g ? console.log("Its finite solutions.") : console.log("Too bad, no solutions."));
- g /= f;
- return 0 > g ? (b = Math.atan2(b.y - a.y, b.x - a.x), a = Math.atan2(c.y - a.y, c.x - a.x), b > a && (a += 2 * Math.PI), c = (b + a) / 2, a = -Math.cos(c), c = -Math.sin(c), new THREE.Vector2(a, c)) : d.multiplyScalar(g).add(h).sub(a).clone()
- }
- function e(c, d) {
- var e, f;
- for (C = c.length; 0 <= --C;) {
- e = C;
- f = C - 1;
- 0 > f && (f = c.length - 1);
- for (var g = 0, h = t + 2 * m,
- g = 0; g < h; g++) {
- var i = ca * g,
- k = ca * (g + 1),
- l = d + e + i,
- i = d + f + i,
- n = d + f + k,
- k = d + e + k,
- p = c,
- q = g,
- s = h,
- u = e,
- w = f,
- l = l + F,
- i = i + F,
- n = n + F,
- k = k + F;
- D.faces.push(new THREE.Face3(l, i, k, null, null, r));
- D.faces.push(new THREE.Face3(i, n, k, null, null, r));
- l = v.generateSideWallUV(D, a, p, b, l, i, n, k, q, s, u, w);
- D.faceVertexUvs[0].push([l[0], l[1], l[3]]);
- D.faceVertexUvs[0].push([l[1], l[2], l[3]])
- }
- }
- }
- function f(a, b, c) {
- D.vertices.push(new THREE.Vector3(a, b, c))
- }
- function h(c, d, e, f) {
- c += F;
- d += F;
- e += F;
- D.faces.push(new THREE.Face3(c, d, e, null, null, u));
- c = f ? v.generateBottomUV(D,
- a, b, c, d, e) : v.generateTopUV(D, a, b, c, d, e);
- D.faceVertexUvs[0].push(c)
- }
- var g = void 0 !== b.amount ? b.amount : 100,
- i = void 0 !== b.bevelThickness ? b.bevelThickness : 6,
- k = void 0 !== b.bevelSize ? b.bevelSize : i - 2,
- m = void 0 !== b.bevelSegments ? b.bevelSegments : 3,
- l = void 0 !== b.bevelEnabled ? b.bevelEnabled : !0,
- p = void 0 !== b.curveSegments ? b.curveSegments : 12,
- t = void 0 !== b.steps ? b.steps : 1,
- s = b.extrudePath,
- q, n = !1,
- u = b.material,
- r = b.extrudeMaterial,
- v = void 0 !== b.UVGenerator ? b.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator,
- z, G, w, y;
- s && (q = s.getSpacedPoints(t), n = !0, l = !1, z = void 0 !== b.frames ? b.frames : new THREE.TubeGeometry.FrenetFrames(s, t, !1), G = new THREE.Vector3, w = new THREE.Vector3, y = new THREE.Vector3);
- l || (k = i = m = 0);
- var E, A, K, D = this,
- F = this.vertices.length,
- p = a.extractPoints(p),
- O = p.shape,
- p = p.holes;
- if (s = !THREE.Shape.Utils.isClockWise(O)) {
- O = O.reverse();
- A = 0;
- for (K = p.length; A < K; A++) E = p[A], THREE.Shape.Utils.isClockWise(E) && (p[A] = E.reverse());
- s = !1
- }
- var x = THREE.Shape.Utils.triangulateShape(O, p),
- s = O;
- A = 0;
- for (K = p.length; A < K; A++) E = p[A], O = O.concat(E);
- var I, B, M, J, ca = O.length,
- na = x.length,
- pa = [],
- C = 0,
- Q = s.length;
- I = Q - 1;
- for (B = C + 1; C < Q; C++, I++, B++) I === Q && (I = 0), B === Q && (B = 0), pa[C] = d(s[C], s[I], s[B]);
- var R = [],
- L, da = pa.concat();
- A = 0;
- for (K = p.length; A < K; A++) {
- E = p[A];
- L = [];
- C = 0;
- Q = E.length;
- I = Q - 1;
- for (B = C + 1; C < Q; C++, I++, B++) I === Q && (I = 0), B === Q && (B = 0), L[C] = d(E[C], E[I], E[B]);
- R.push(L);
- da = da.concat(L)
- }
- for (I = 0; I < m; I++) {
- E = I / m;
- M = i * (1 - E);
- B = k * Math.sin(E * Math.PI / 2);
- C = 0;
- for (Q = s.length; C < Q; C++) J = c(s[C], pa[C], B), f(J.x, J.y, - M);
- A = 0;
- for (K = p.length; A < K; A++) {
- E = p[A];
- L = R[A];
- C = 0;
- for (Q = E.length; C < Q; C++) J = c(E[C], L[C], B), f(J.x, J.y, - M)
- }
- }
- B = k;
- for (C = 0; C < ca; C++) J = l ? c(O[C], da[C], B) : O[C], n ? (w.copy(z.normals[0]).multiplyScalar(J.x), G.copy(z.binormals[0]).multiplyScalar(J.y), y.copy(q[0]).add(w).add(G), f(y.x, y.y, y.z)) : f(J.x, J.y, 0);
- for (E = 1; E <= t; E++) for (C = 0; C < ca; C++) J = l ? c(O[C], da[C], B) : O[C], n ? (w.copy(z.normals[E]).multiplyScalar(J.x), G.copy(z.binormals[E]).multiplyScalar(J.y), y.copy(q[E]).add(w).add(G), f(y.x, y.y, y.z)) : f(J.x, J.y, g / t * E);
- for (I = m - 1; 0 <= I; I--) {
- E = I / m;
- M = i * (1 - E);
- B = k * Math.sin(E * Math.PI / 2);
- C = 0;
- for (Q = s.length; C < Q; C++) J = c(s[C], pa[C], B), f(J.x, J.y, g + M);
- A = 0;
- for (K = p.length; A < K; A++) {
- E = p[A];
- L = R[A];
- C = 0;
- for (Q = E.length; C < Q; C++) J = c(E[C], L[C], B), n ? f(J.x, J.y + q[t - 1].y, q[t - 1].x + M) : f(J.x, J.y, g + M)
- }
- }
- if (l) {
- i = 0 * ca;
- for (C = 0; C < na; C++) g = x[C], h(g[2] + i, g[1] + i, g[0] + i, !0);
- i = ca * (t + 2 * m);
- for (C = 0; C < na; C++) g = x[C], h(g[0] + i, g[1] + i, g[2] + i, !1)
- } else {
- for (C = 0; C < na; C++) g = x[C], h(g[2], g[1], g[0], !0);
- for (C = 0; C < na; C++) g = x[C], h(g[0] + ca * t, g[1] + ca * t, g[2] + ca * t, !1)
- }
- g = 0;
- e(s, g);
- g += s.length;
- A = 0;
- for (K = p.length; A < K; A++) E = p[A], e(E, g), g += E.length
-};
-THREE.ExtrudeGeometry.WorldUVGenerator = {
- generateTopUV: function(a, b, c, d, e, f) {
- b = a.vertices[e].x;
- e = a.vertices[e].y;
- c = a.vertices[f].x;
- f = a.vertices[f].y;
- return [new THREE.Vector2(a.vertices[d].x, a.vertices[d].y), new THREE.Vector2(b, e), new THREE.Vector2(c, f)]
- },
- generateBottomUV: function(a, b, c, d, e, f) {
- return this.generateTopUV(a, b, c, d, e, f)
- },
- generateSideWallUV: function(a, b, c, d, e, f, h, g) {
- var b = a.vertices[e].x,
- c = a.vertices[e].y,
- e = a.vertices[e].z,
- d = a.vertices[f].x,
- i = a.vertices[f].y,
- f = a.vertices[f].z,
- k = a.vertices[h].x,
- m = a.vertices[h].y,
- h = a.vertices[h].z,
- l = a.vertices[g].x,
- p = a.vertices[g].y,
- a = a.vertices[g].z;
- return 0.01 > Math.abs(c - i) ? [new THREE.Vector2(b, 1 - e), new THREE.Vector2(d, 1 - f), new THREE.Vector2(k, 1 - h), new THREE.Vector2(l, 1 - a)] : [new THREE.Vector2(c, 1 - e), new THREE.Vector2(i, 1 - f), new THREE.Vector2(m, 1 - h), new THREE.Vector2(p, 1 - a)]
- }
-};
-THREE.ExtrudeGeometry.__v1 = new THREE.Vector2;
-THREE.ExtrudeGeometry.__v2 = new THREE.Vector2;
-THREE.ExtrudeGeometry.__v3 = new THREE.Vector2;
-THREE.ExtrudeGeometry.__v4 = new THREE.Vector2;
-THREE.ExtrudeGeometry.__v5 = new THREE.Vector2;
-THREE.ExtrudeGeometry.__v6 = new THREE.Vector2;
-THREE.ShapeGeometry = function(a, b) {
- THREE.Geometry.call(this);
- !1 === a instanceof Array && (a = [a]);
- this.shapebb = a[a.length - 1].getBoundingBox();
- this.addShapeList(a, b);
- this.computeCentroids();
- this.computeFaceNormals()
-};
-THREE.ShapeGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.ShapeGeometry.prototype.addShapeList = function(a, b) {
- for (var c = 0, d = a.length; c < d; c++) this.addShape(a[c], b);
- return this
-};
-THREE.ShapeGeometry.prototype.addShape = function(a, b) {
- void 0 === b && (b = {});
- var c = b.material,
- d = void 0 === b.UVGenerator ? THREE.ExtrudeGeometry.WorldUVGenerator : b.UVGenerator,
- e, f, h, g = this.vertices.length;
- e = a.extractPoints(void 0 !== b.curveSegments ? b.curveSegments : 12);
- var i = e.shape,
- k = e.holes;
- if (!THREE.Shape.Utils.isClockWise(i)) {
- i = i.reverse();
- e = 0;
- for (f = k.length; e < f; e++) h = k[e], THREE.Shape.Utils.isClockWise(h) && (k[e] = h.reverse())
- }
- var m = THREE.Shape.Utils.triangulateShape(i, k);
- e = 0;
- for (f = k.length; e < f; e++) h = k[e],
- i = i.concat(h);
- k = i.length;
- f = m.length;
- for (e = 0; e < k; e++) h = i[e], this.vertices.push(new THREE.Vector3(h.x, h.y, 0));
- for (e = 0; e < f; e++) k = m[e], i = k[0] + g, h = k[1] + g, k = k[2] + g, this.faces.push(new THREE.Face3(i, h, k, null, null, c)), this.faceVertexUvs[0].push(d.generateBottomUV(this, a, b, i, h, k))
-};
-THREE.LatheGeometry = function(a, b, c, d) {
- THREE.Geometry.call(this);
- for (var b = b || 12, c = c || 0, d = d || 2 * Math.PI, e = 1 / (a.length - 1), f = 1 / b, h = 0, g = b; h <= g; h++) for (var i = c + h * f * d, k = Math.cos(i), m = Math.sin(i), i = 0, l = a.length; i < l; i++) {
- var p = a[i],
- t = new THREE.Vector3;
- t.x = k * p.x - m * p.y;
- t.y = m * p.x + k * p.y;
- t.z = p.z;
- this.vertices.push(t)
- }
- c = a.length;
- h = 0;
- for (g = b; h < g; h++) {
- i = 0;
- for (l = a.length - 1; i < l; i++) {
- var b = m = i + c * h,
- d = m + c,
- k = m + 1 + c,
- m = m + 1,
- p = h * f,
- t = i * e,
- s = p + f,
- q = t + e;
- this.faces.push(new THREE.Face3(b, d, m));
- this.faceVertexUvs[0].push([new THREE.Vector2(p,
- t), new THREE.Vector2(s, t), new THREE.Vector2(p, q)]);
- this.faces.push(new THREE.Face3(d, k, m));
- this.faceVertexUvs[0].push([new THREE.Vector2(s, t), new THREE.Vector2(s, q), new THREE.Vector2(p, q)])
- }
- }
- this.mergeVertices();
- this.computeCentroids();
- this.computeFaceNormals();
- this.computeVertexNormals()
-};
-THREE.LatheGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.PlaneGeometry = function(a, b, c, d) {
- THREE.Geometry.call(this);
- this.width = a;
- this.height = b;
- this.widthSegments = c || 1;
- this.heightSegments = d || 1;
- for (var e = a / 2, f = b / 2, c = this.widthSegments, d = this.heightSegments, h = c + 1, g = d + 1, i = this.width / c, k = this.height / d, m = new THREE.Vector3(0, 0, 1), a = 0; a < g; a++) for (b = 0; b < h; b++) this.vertices.push(new THREE.Vector3(b * i - e, - (a * k - f), 0));
- for (a = 0; a < d; a++) for (b = 0; b < c; b++) {
- var l = b + h * a,
- e = b + h * (a + 1),
- f = b + 1 + h * (a + 1),
- g = b + 1 + h * a,
- i = new THREE.Vector2(b / c, 1 - a / d),
- k = new THREE.Vector2(b / c, 1 - (a + 1) / d),
- p = new THREE.Vector2((b + 1) / c, 1 - (a + 1) / d),
- t = new THREE.Vector2((b + 1) / c, 1 - a / d),
- l = new THREE.Face3(l, e, g);
- l.normal.copy(m);
- l.vertexNormals.push(m.clone(), m.clone(), m.clone());
- this.faces.push(l);
- this.faceVertexUvs[0].push([i, k, t]);
- l = new THREE.Face3(e, f, g);
- l.normal.copy(m);
- l.vertexNormals.push(m.clone(), m.clone(), m.clone());
- this.faces.push(l);
- this.faceVertexUvs[0].push([k.clone(), p, t.clone()])
- }
- this.computeCentroids()
-};
-THREE.PlaneGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.RingGeometry = function(a, b, c, d, e, f) {
- THREE.Geometry.call(this);
- for (var a = a || 0, b = b || 50, e = void 0 !== e ? e : 0, f = void 0 !== f ? f : 2 * Math.PI, c = void 0 !== c ? Math.max(3, c) : 8, d = void 0 !== d ? Math.max(3, d) : 8, h, g = [], i = a, k = (b - a) / d, a = 0; a <= d; a++) {
- for (h = 0; h <= c; h++) {
- var m = new THREE.Vector3,
- l = e + h / c * f;
- m.x = i * Math.cos(l);
- m.y = i * Math.sin(l);
- this.vertices.push(m);
- g.push(new THREE.Vector2((m.x / b + 1) / 2, (m.y / b + 1) / 2))
- }
- i += k
- }
- b = new THREE.Vector3(0, 0, 1);
- for (a = 0; a < d; a++) {
- e = a * c;
- for (h = 0; h <= c; h++) l = h + e, f = l + a, k = l + c + a, m = l + c + 1 + a, this.faces.push(new THREE.Face3(f,
- k, m, [b.clone(), b.clone(), b.clone()])), this.faceVertexUvs[0].push([g[f].clone(), g[k].clone(), g[m].clone()]), f = l + a, k = l + c + 1 + a, m = l + 1 + a, this.faces.push(new THREE.Face3(f, k, m, [b.clone(), b.clone(), b.clone()])), this.faceVertexUvs[0].push([g[f].clone(), g[k].clone(), g[m].clone()])
- }
- this.computeCentroids();
- this.computeFaceNormals();
- this.boundingSphere = new THREE.Sphere(new THREE.Vector3, i)
-};
-THREE.RingGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.SphereGeometry = function(a, b, c, d, e, f, h) {
- THREE.Geometry.call(this);
- this.radius = a = a || 50;
- this.widthSegments = b = Math.max(3, Math.floor(b) || 8);
- this.heightSegments = c = Math.max(2, Math.floor(c) || 6);
- this.phiStart = d = void 0 !== d ? d : 0;
- this.phiLength = e = void 0 !== e ? e : 2 * Math.PI;
- this.thetaStart = f = void 0 !== f ? f : 0;
- this.thetaLength = h = void 0 !== h ? h : Math.PI;
- var g, i, k = [],
- m = [];
- for (i = 0; i <= c; i++) {
- var l = [],
- p = [];
- for (g = 0; g <= b; g++) {
- var t = g / b,
- s = i / c,
- q = new THREE.Vector3;
- q.x = -a * Math.cos(d + t * e) * Math.sin(f + s * h);
- q.y = a * Math.cos(f + s * h);
- q.z = a * Math.sin(d + t * e) * Math.sin(f + s * h);
- this.vertices.push(q);
- l.push(this.vertices.length - 1);
- p.push(new THREE.Vector2(t, 1 - s))
- }
- k.push(l);
- m.push(p)
- }
- for (i = 0; i < this.heightSegments; i++) for (g = 0; g < this.widthSegments; g++) {
- var b = k[i][g + 1],
- c = k[i][g],
- d = k[i + 1][g],
- e = k[i + 1][g + 1],
- f = this.vertices[b].clone().normalize(),
- h = this.vertices[c].clone().normalize(),
- l = this.vertices[d].clone().normalize(),
- p = this.vertices[e].clone().normalize(),
- t = m[i][g + 1].clone(),
- s = m[i][g].clone(),
- q = m[i + 1][g].clone(),
- n = m[i + 1][g + 1].clone();
- Math.abs(this.vertices[b].y) === this.radius ? (t.x = (t.x + s.x) / 2, this.faces.push(new THREE.Face3(b, d, e, [f, l, p])), this.faceVertexUvs[0].push([t, q, n])) : Math.abs(this.vertices[d].y) === this.radius ? (q.x = (q.x + n.x) / 2, this.faces.push(new THREE.Face3(b, c, d, [f, h, l])), this.faceVertexUvs[0].push([t, s, q])) : (this.faces.push(new THREE.Face3(b, c, e, [f, h, p])), this.faceVertexUvs[0].push([t, s, n]), this.faces.push(new THREE.Face3(c, d, e, [h.clone(), l, p.clone()])), this.faceVertexUvs[0].push([s.clone(), q, n.clone()]))
- }
- this.computeCentroids();
- this.computeFaceNormals();
- this.boundingSphere = new THREE.Sphere(new THREE.Vector3, a)
-};
-THREE.SphereGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.TextGeometry = function(a, b) {
- var b = b || {}, c = THREE.FontUtils.generateShapes(a, b);
- b.amount = void 0 !== b.height ? b.height : 50;
- void 0 === b.bevelThickness && (b.bevelThickness = 10);
- void 0 === b.bevelSize && (b.bevelSize = 8);
- void 0 === b.bevelEnabled && (b.bevelEnabled = !1);
- THREE.ExtrudeGeometry.call(this, c, b)
-};
-THREE.TextGeometry.prototype = Object.create(THREE.ExtrudeGeometry.prototype);
-THREE.TorusGeometry = function(a, b, c, d, e) {
- THREE.Geometry.call(this);
- this.radius = a || 100;
- this.tube = b || 40;
- this.radialSegments = c || 8;
- this.tubularSegments = d || 6;
- this.arc = e || 2 * Math.PI;
- e = new THREE.Vector3;
- a = [];
- b = [];
- for (c = 0; c <= this.radialSegments; c++) for (d = 0; d <= this.tubularSegments; d++) {
- var f = d / this.tubularSegments * this.arc,
- h = 2 * c / this.radialSegments * Math.PI;
- e.x = this.radius * Math.cos(f);
- e.y = this.radius * Math.sin(f);
- var g = new THREE.Vector3;
- g.x = (this.radius + this.tube * Math.cos(h)) * Math.cos(f);
- g.y = (this.radius + this.tube * Math.cos(h)) * Math.sin(f);
- g.z = this.tube * Math.sin(h);
- this.vertices.push(g);
- a.push(new THREE.Vector2(d / this.tubularSegments, c / this.radialSegments));
- b.push(g.clone().sub(e).normalize())
- }
- for (c = 1; c <= this.radialSegments; c++) for (d = 1; d <= this.tubularSegments; d++) {
- var e = (this.tubularSegments + 1) * c + d - 1,
- f = (this.tubularSegments + 1) * (c - 1) + d - 1,
- h = (this.tubularSegments + 1) * (c - 1) + d,
- g = (this.tubularSegments + 1) * c + d,
- i = new THREE.Face3(e, f, g, [b[e], b[f], b[g]]);
- i.normal.add(b[e]);
- i.normal.add(b[f]);
- i.normal.add(b[g]);
- i.normal.normalize();
- this.faces.push(i);
- this.faceVertexUvs[0].push([a[e].clone(), a[f].clone(), a[g].clone()]);
- i = new THREE.Face3(f, h, g, [b[f], b[h], b[g]]);
- i.normal.add(b[f]);
- i.normal.add(b[h]);
- i.normal.add(b[g]);
- i.normal.normalize();
- this.faces.push(i);
- this.faceVertexUvs[0].push([a[f].clone(), a[h].clone(), a[g].clone()])
- }
- this.computeCentroids()
-};
-THREE.TorusGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.TorusKnotGeometry = function(a, b, c, d, e, f, h) {
- function g(a, b, c, d, e) {
- var f = Math.cos(a),
- g = Math.sin(a),
- a = b / c * a,
- b = Math.cos(a),
- f = 0.5 * (d * (2 + b)) * f,
- g = 0.5 * d * (2 + b) * g,
- d = 0.5 * e * d * Math.sin(a);
- return new THREE.Vector3(f, g, d)
- }
- THREE.Geometry.call(this);
- this.radius = a || 100;
- this.tube = b || 40;
- this.radialSegments = c || 64;
- this.tubularSegments = d || 8;
- this.p = e || 2;
- this.q = f || 3;
- this.heightScale = h || 1;
- this.grid = Array(this.radialSegments);
- c = new THREE.Vector3;
- d = new THREE.Vector3;
- e = new THREE.Vector3;
- for (a = 0; a < this.radialSegments; ++a) {
- this.grid[a] = Array(this.tubularSegments);
- b = 2 * (a / this.radialSegments) * this.p * Math.PI;
- f = g(b, this.q, this.p, this.radius, this.heightScale);
- b = g(b + 0.01, this.q, this.p, this.radius, this.heightScale);
- c.subVectors(b, f);
- d.addVectors(b, f);
- e.crossVectors(c, d);
- d.crossVectors(e, c);
- e.normalize();
- d.normalize();
- for (b = 0; b < this.tubularSegments; ++b) {
- var i = 2 * (b / this.tubularSegments) * Math.PI,
- h = -this.tube * Math.cos(i),
- i = this.tube * Math.sin(i),
- k = new THREE.Vector3;
- k.x = f.x + h * d.x + i * e.x;
- k.y = f.y + h * d.y + i * e.y;
- k.z = f.z + h * d.z + i * e.z;
- this.grid[a][b] = this.vertices.push(k) - 1
- }
- }
- for (a = 0; a < this.radialSegments; ++a) for (b = 0; b < this.tubularSegments; ++b) {
- var e = (a + 1) % this.radialSegments,
- f = (b + 1) % this.tubularSegments,
- c = this.grid[a][b],
- d = this.grid[e][b],
- e = this.grid[e][f],
- f = this.grid[a][f],
- h = new THREE.Vector2(a / this.radialSegments, b / this.tubularSegments),
- i = new THREE.Vector2((a + 1) / this.radialSegments, b / this.tubularSegments),
- k = new THREE.Vector2((a + 1) / this.radialSegments, (b + 1) / this.tubularSegments),
- m = new THREE.Vector2(a / this.radialSegments, (b + 1) / this.tubularSegments);
- this.faces.push(new THREE.Face3(c, d, f));
- this.faceVertexUvs[0].push([h, i, m]);
- this.faces.push(new THREE.Face3(d, e, f));
- this.faceVertexUvs[0].push([i.clone(), k, m.clone()])
- }
- this.computeCentroids();
- this.computeFaceNormals();
- this.computeVertexNormals()
-};
-THREE.TorusKnotGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.TubeGeometry = function(a, b, c, d, e) {
- THREE.Geometry.call(this);
- this.path = a;
- this.segments = b || 64;
- this.radius = c || 1;
- this.radialSegments = d || 8;
- this.closed = e || !1;
- this.grid = [];
- var f, h, d = this.segments + 1,
- g, i, k, e = new THREE.Vector3,
- m, l, b = new THREE.TubeGeometry.FrenetFrames(this.path, this.segments, this.closed);
- m = b.normals;
- l = b.binormals;
- this.tangents = b.tangents;
- this.normals = m;
- this.binormals = l;
- for (b = 0; b < d; b++) {
- this.grid[b] = [];
- c = b / (d - 1);
- k = a.getPointAt(c);
- f = m[b];
- h = l[b];
- for (c = 0; c < this.radialSegments; c++) g = 2 * (c / this.radialSegments) * Math.PI, i = -this.radius * Math.cos(g), g = this.radius * Math.sin(g), e.copy(k), e.x += i * f.x + g * h.x, e.y += i * f.y + g * h.y, e.z += i * f.z + g * h.z, this.grid[b][c] = this.vertices.push(new THREE.Vector3(e.x, e.y, e.z)) - 1
- }
- for (b = 0; b < this.segments; b++) for (c = 0; c < this.radialSegments; c++) e = this.closed ? (b + 1) % this.segments : b + 1, m = (c + 1) % this.radialSegments, a = this.grid[b][c], d = this.grid[e][c], e = this.grid[e][m], m = this.grid[b][m], l = new THREE.Vector2(b / this.segments, c / this.radialSegments), f = new THREE.Vector2((b + 1) / this.segments, c / this.radialSegments),
- h = new THREE.Vector2((b + 1) / this.segments, (c + 1) / this.radialSegments), i = new THREE.Vector2(b / this.segments, (c + 1) / this.radialSegments), this.faces.push(new THREE.Face3(a, d, m)), this.faceVertexUvs[0].push([l, f, i]), this.faces.push(new THREE.Face3(d, e, m)), this.faceVertexUvs[0].push([f.clone(), h, i.clone()]);
- this.computeCentroids();
- this.computeFaceNormals();
- this.computeVertexNormals()
-};
-THREE.TubeGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.TubeGeometry.FrenetFrames = function(a, b, c) {
- new THREE.Vector3;
- var d = new THREE.Vector3;
- new THREE.Vector3;
- var e = [],
- f = [],
- h = [],
- g = new THREE.Vector3,
- i = new THREE.Matrix4,
- b = b + 1,
- k, m, l;
- this.tangents = e;
- this.normals = f;
- this.binormals = h;
- for (k = 0; k < b; k++) m = k / (b - 1), e[k] = a.getTangentAt(m), e[k].normalize();
- f[0] = new THREE.Vector3;
- h[0] = new THREE.Vector3;
- a = Number.MAX_VALUE;
- k = Math.abs(e[0].x);
- m = Math.abs(e[0].y);
- l = Math.abs(e[0].z);
- k <= a && (a = k, d.set(1, 0, 0));
- m <= a && (a = m, d.set(0, 1, 0));
- l <= a && d.set(0, 0, 1);
- g.crossVectors(e[0],
- d).normalize();
- f[0].crossVectors(e[0], g);
- h[0].crossVectors(e[0], f[0]);
- for (k = 1; k < b; k++) f[k] = f[k - 1].clone(), h[k] = h[k - 1].clone(), g.crossVectors(e[k - 1], e[k]), 1E-4 < g.length() && (g.normalize(), d = Math.acos(THREE.Math.clamp(e[k - 1].dot(e[k]), - 1, 1)), f[k].applyMatrix4(i.makeRotationAxis(g, d))), h[k].crossVectors(e[k], f[k]);
- if (c) {
- d = Math.acos(THREE.Math.clamp(f[0].dot(f[b - 1]), - 1, 1));
- d /= b - 1;
- 0 < e[0].dot(g.crossVectors(f[0], f[b - 1])) && (d = -d);
- for (k = 1; k < b; k++) f[k].applyMatrix4(i.makeRotationAxis(e[k], d * k)), h[k].crossVectors(e[k],
- f[k])
- }
-};
-THREE.PolyhedronGeometry = function(a, b, c, d) {
- function e(a) {
- var b = a.normalize().clone();
- b.index = g.vertices.push(b) - 1;
- var c = Math.atan2(a.z, - a.x) / 2 / Math.PI + 0.5,
- a = Math.atan2(-a.y, Math.sqrt(a.x * a.x + a.z * a.z)) / Math.PI + 0.5;
- b.uv = new THREE.Vector2(c, 1 - a);
- return b
- }
- function f(a, b, c) {
- var d = new THREE.Face3(a.index, b.index, c.index, [a.clone(), b.clone(), c.clone()]);
- d.centroid.add(a).add(b).add(c).divideScalar(3);
- g.faces.push(d);
- d = Math.atan2(d.centroid.z, - d.centroid.x);
- g.faceVertexUvs[0].push([h(a.uv, a, d), h(b.uv, b, d),
- h(c.uv, c, d)])
- }
- function h(a, b, c) {
- 0 > c && 1 === a.x && (a = new THREE.Vector2(a.x - 1, a.y));
- 0 === b.x && 0 === b.z && (a = new THREE.Vector2(c / 2 / Math.PI + 0.5, a.y));
- return a.clone()
- }
- THREE.Geometry.call(this);
- for (var c = c || 1, d = d || 0, g = this, i = 0, k = a.length; i < k; i++) e(new THREE.Vector3(a[i][0], a[i][1], a[i][2]));
- for (var m = this.vertices, a = [], i = 0, k = b.length; i < k; i++) {
- var l = m[b[i][0]],
- p = m[b[i][1]],
- t = m[b[i][2]];
- a[i] = new THREE.Face3(l.index, p.index, t.index, [l.clone(), p.clone(), t.clone()])
- }
- i = 0;
- for (k = a.length; i < k; i++) {
- p = a[i];
- m = d;
- b = Math.pow(2,
- m);
- Math.pow(4, m);
- for (var m = e(g.vertices[p.a]), l = e(g.vertices[p.b]), s = e(g.vertices[p.c]), p = [], t = 0; t <= b; t++) {
- p[t] = [];
- for (var q = e(m.clone().lerp(s, t / b)), n = e(l.clone().lerp(s, t / b)), u = b - t, r = 0; r <= u; r++) p[t][r] = 0 == r && t == b ? q : e(q.clone().lerp(n, r / u))
- }
- for (t = 0; t < b; t++) for (r = 0; r < 2 * (b - t) - 1; r++) m = Math.floor(r / 2), 0 == r % 2 ? f(p[t][m + 1], p[t + 1][m], p[t][m]) : f(p[t][m + 1], p[t + 1][m + 1], p[t + 1][m])
- }
- i = 0;
- for (k = this.faceVertexUvs[0].length; i < k; i++) d = this.faceVertexUvs[0][i], a = d[0].x, b = d[1].x, m = d[2].x, l = Math.max(a, Math.max(b, m)),
- p = Math.min(a, Math.min(b, m)), 0.9 < l && 0.1 > p && (0.2 > a && (d[0].x += 1), 0.2 > b && (d[1].x += 1), 0.2 > m && (d[2].x += 1));
- i = 0;
- for (k = this.vertices.length; i < k; i++) this.vertices[i].multiplyScalar(c);
- this.mergeVertices();
- this.computeCentroids();
- this.computeFaceNormals();
- this.boundingSphere = new THREE.Sphere(new THREE.Vector3, c)
-};
-THREE.PolyhedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.IcosahedronGeometry = function(a, b) {
- this.radius = a;
- this.detail = b;
- var c = (1 + Math.sqrt(5)) / 2;
- THREE.PolyhedronGeometry.call(this, [
- [-1, c, 0],
- [1, c, 0],
- [-1, - c, 0],
- [1, - c, 0],
- [0, - 1, c],
- [0, 1, c],
- [0, - 1, - c],
- [0, 1, - c],
- [c, 0, - 1],
- [c, 0, 1],
- [-c, 0, - 1],
- [-c, 0, 1]
- ], [
- [0, 11, 5],
- [0, 5, 1],
- [0, 1, 7],
- [0, 7, 10],
- [0, 10, 11],
- [1, 5, 9],
- [5, 11, 4],
- [11, 10, 2],
- [10, 7, 6],
- [7, 1, 8],
- [3, 9, 4],
- [3, 4, 2],
- [3, 2, 6],
- [3, 6, 8],
- [3, 8, 9],
- [4, 9, 5],
- [2, 4, 11],
- [6, 2, 10],
- [8, 6, 7],
- [9, 8, 1]
- ], a, b)
-};
-THREE.IcosahedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.OctahedronGeometry = function(a, b) {
- THREE.PolyhedronGeometry.call(this, [
- [1, 0, 0],
- [-1, 0, 0],
- [0, 1, 0],
- [0, - 1, 0],
- [0, 0, 1],
- [0, 0, - 1]
- ], [
- [0, 2, 4],
- [0, 4, 3],
- [0, 3, 5],
- [0, 5, 2],
- [1, 2, 5],
- [1, 5, 3],
- [1, 3, 4],
- [1, 4, 2]
- ], a, b)
-};
-THREE.OctahedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.TetrahedronGeometry = function(a, b) {
- THREE.PolyhedronGeometry.call(this, [
- [1, 1, 1],
- [-1, - 1, 1],
- [-1, 1, - 1],
- [1, - 1, - 1]
- ], [
- [2, 1, 0],
- [0, 3, 2],
- [1, 3, 0],
- [2, 3, 1]
- ], a, b)
-};
-THREE.TetrahedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.ParametricGeometry = function(a, b, c) {
- THREE.Geometry.call(this);
- var d = this.vertices,
- e = this.faces,
- f = this.faceVertexUvs[0],
- h, g, i, k, m = b + 1;
- for (h = 0; h <= c; h++) {
- k = h / c;
- for (g = 0; g <= b; g++) i = g / b, i = a(i, k), d.push(i)
- }
- var l, p, t, s;
- for (h = 0; h < c; h++) for (g = 0; g < b; g++) a = h * m + g, d = h * m + g + 1, k = (h + 1) * m + g + 1, i = (h + 1) * m + g, l = new THREE.Vector2(g / b, h / c), p = new THREE.Vector2((g + 1) / b, h / c), t = new THREE.Vector2((g + 1) / b, (h + 1) / c), s = new THREE.Vector2(g / b, (h + 1) / c), e.push(new THREE.Face3(a, d, i)), f.push([l, p, s]), e.push(new THREE.Face3(d, k, i)),
- f.push([p.clone(), t, s.clone()]);
- this.computeCentroids();
- this.computeFaceNormals();
- this.computeVertexNormals()
-};
-THREE.ParametricGeometry.prototype = Object.create(THREE.Geometry.prototype);
-THREE.AxisHelper = function(a) {
- var a = a || 1,
- b = new THREE.Geometry;
- b.vertices.push(new THREE.Vector3, new THREE.Vector3(a, 0, 0), new THREE.Vector3, new THREE.Vector3(0, a, 0), new THREE.Vector3, new THREE.Vector3(0, 0, a));
- b.colors.push(new THREE.Color(16711680), new THREE.Color(16755200), new THREE.Color(65280), new THREE.Color(11206400), new THREE.Color(255), new THREE.Color(43775));
- a = new THREE.LineBasicMaterial({
- vertexColors: THREE.VertexColors
- });
- THREE.Line.call(this, b, a, THREE.LinePieces)
-};
-THREE.AxisHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.ArrowHelper = function(a, b, c, d, e, f) {
- THREE.Object3D.call(this);
- void 0 === d && (d = 16776960);
- void 0 === c && (c = 1);
- void 0 === e && (e = 0.2 * c);
- void 0 === f && (f = 0.2 * e);
- this.position = b;
- b = new THREE.Geometry;
- b.vertices.push(new THREE.Vector3(0, 0, 0));
- b.vertices.push(new THREE.Vector3(0, 1, 0));
- this.line = new THREE.Line(b, new THREE.LineBasicMaterial({
- color: d
- }));
- this.line.matrixAutoUpdate = !1;
- this.add(this.line);
- b = new THREE.CylinderGeometry(0, 0.5, 1, 5, 1);
- b.applyMatrix((new THREE.Matrix4).makeTranslation(0, - 0.5, 0));
- this.cone = new THREE.Mesh(b, new THREE.MeshBasicMaterial({
- color: d
- }));
- this.cone.matrixAutoUpdate = !1;
- this.add(this.cone);
- this.setDirection(a);
- this.setLength(c, e, f)
-};
-THREE.ArrowHelper.prototype = Object.create(THREE.Object3D.prototype);
-THREE.ArrowHelper.prototype.setDirection = function() {
- var a = new THREE.Vector3,
- b;
- return function(c) {
- 0.99999 < c.y ? this.quaternion.set(0, 0, 0, 1) : -0.99999 > c.y ? this.quaternion.set(1, 0, 0, 0) : (a.set(c.z, 0, - c.x).normalize(), b = Math.acos(c.y), this.quaternion.setFromAxisAngle(a, b))
- }
-}();
-THREE.ArrowHelper.prototype.setLength = function(a, b, c) {
- void 0 === b && (b = 0.2 * a);
- void 0 === c && (c = 0.2 * b);
- this.line.scale.set(1, a, 1);
- this.line.updateMatrix();
- this.cone.scale.set(c, b, c);
- this.cone.position.y = a;
- this.cone.updateMatrix()
-};
-THREE.ArrowHelper.prototype.setColor = function(a) {
- this.line.material.color.setHex(a);
- this.cone.material.color.setHex(a)
-};
-THREE.BoxHelper = function(a) {
- var b = [new THREE.Vector3(1, 1, 1), new THREE.Vector3(-1, 1, 1), new THREE.Vector3(-1, - 1, 1), new THREE.Vector3(1, - 1, 1), new THREE.Vector3(1, 1, - 1), new THREE.Vector3(-1, 1, - 1), new THREE.Vector3(-1, - 1, - 1), new THREE.Vector3(1, - 1, - 1)];
- this.vertices = b;
- var c = new THREE.Geometry;
- c.vertices.push(b[0], b[1], b[1], b[2], b[2], b[3], b[3], b[0], b[4], b[5], b[5], b[6], b[6], b[7], b[7], b[4], b[0], b[4], b[1], b[5], b[2], b[6], b[3], b[7]);
- THREE.Line.call(this, c, new THREE.LineBasicMaterial({
- color: 16776960
- }), THREE.LinePieces);
- void 0 !== a && this.update(a)
-};
-THREE.BoxHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.BoxHelper.prototype.update = function(a) {
- var b = a.geometry;
- null === b.boundingBox && b.computeBoundingBox();
- var c = b.boundingBox.min,
- b = b.boundingBox.max,
- d = this.vertices;
- d[0].set(b.x, b.y, b.z);
- d[1].set(c.x, b.y, b.z);
- d[2].set(c.x, c.y, b.z);
- d[3].set(b.x, c.y, b.z);
- d[4].set(b.x, b.y, c.z);
- d[5].set(c.x, b.y, c.z);
- d[6].set(c.x, c.y, c.z);
- d[7].set(b.x, c.y, c.z);
- this.geometry.computeBoundingSphere();
- this.geometry.verticesNeedUpdate = !0;
- this.matrixAutoUpdate = !1;
- this.matrixWorld = a.matrixWorld
-};
-THREE.BoundingBoxHelper = function(a, b) {
- var c = b || 8947848;
- this.object = a;
- this.box = new THREE.Box3;
- THREE.Mesh.call(this, new THREE.CubeGeometry(1, 1, 1), new THREE.MeshBasicMaterial({
- color: c,
- wireframe: !0
- }))
-};
-THREE.BoundingBoxHelper.prototype = Object.create(THREE.Mesh.prototype);
-THREE.BoundingBoxHelper.prototype.update = function() {
- this.box.setFromObject(this.object);
- this.box.size(this.scale);
- this.box.center(this.position)
-};
-THREE.CameraHelper = function(a) {
- function b(a, b, d) {
- c(a, d);
- c(b, d)
- }
- function c(a, b) {
- d.vertices.push(new THREE.Vector3);
- d.colors.push(new THREE.Color(b));
- void 0 === f[a] && (f[a] = []);
- f[a].push(d.vertices.length - 1)
- }
- var d = new THREE.Geometry,
- e = new THREE.LineBasicMaterial({
- color: 16777215,
- vertexColors: THREE.FaceColors
- }),
- f = {};
- b("n1", "n2", 16755200);
- b("n2", "n4", 16755200);
- b("n4", "n3", 16755200);
- b("n3", "n1", 16755200);
- b("f1", "f2", 16755200);
- b("f2", "f4", 16755200);
- b("f4", "f3", 16755200);
- b("f3", "f1", 16755200);
- b("n1", "f1", 16755200);
- b("n2", "f2", 16755200);
- b("n3", "f3", 16755200);
- b("n4", "f4", 16755200);
- b("p", "n1", 16711680);
- b("p", "n2", 16711680);
- b("p", "n3", 16711680);
- b("p", "n4", 16711680);
- b("u1", "u2", 43775);
- b("u2", "u3", 43775);
- b("u3", "u1", 43775);
- b("c", "t", 16777215);
- b("p", "c", 3355443);
- b("cn1", "cn2", 3355443);
- b("cn3", "cn4", 3355443);
- b("cf1", "cf2", 3355443);
- b("cf3", "cf4", 3355443);
- THREE.Line.call(this, d, e, THREE.LinePieces);
- this.camera = a;
- this.matrixWorld = a.matrixWorld;
- this.matrixAutoUpdate = !1;
- this.pointMap = f;
- this.update()
-};
-THREE.CameraHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.CameraHelper.prototype.update = function() {
- var a = new THREE.Vector3,
- b = new THREE.Camera,
- c = new THREE.Projector;
- return function() {
- function d(d, h, g, i) {
- a.set(h, g, i);
- c.unprojectVector(a, b);
- d = e.pointMap[d];
- if (void 0 !== d) {
- h = 0;
- for (g = d.length; h < g; h++) e.geometry.vertices[d[h]].copy(a)
- }
- }
- var e = this;
- b.projectionMatrix.copy(this.camera.projectionMatrix);
- d("c", 0, 0, - 1);
- d("t", 0, 0, 1);
- d("n1", - 1, - 1, - 1);
- d("n2", 1, - 1, - 1);
- d("n3", - 1, 1, - 1);
- d("n4", 1, 1, - 1);
- d("f1", - 1, - 1, 1);
- d("f2", 1, - 1, 1);
- d("f3", - 1, 1, 1);
- d("f4", 1, 1, 1);
- d("u1",
- 0.7, 1.1, - 1);
- d("u2", - 0.7, 1.1, - 1);
- d("u3", 0, 2, - 1);
- d("cf1", - 1, 0, 1);
- d("cf2", 1, 0, 1);
- d("cf3", 0, - 1, 1);
- d("cf4", 0, 1, 1);
- d("cn1", - 1, 0, - 1);
- d("cn2", 1, 0, - 1);
- d("cn3", 0, - 1, - 1);
- d("cn4", 0, 1, - 1);
- this.geometry.verticesNeedUpdate = !0
- }
-}();
-THREE.DirectionalLightHelper = function(a, b) {
- THREE.Object3D.call(this);
- this.light = a;
- this.light.updateMatrixWorld();
- this.matrixWorld = a.matrixWorld;
- this.matrixAutoUpdate = !1;
- var b = b || 1,
- c = new THREE.PlaneGeometry(b, b),
- d = new THREE.MeshBasicMaterial({
- wireframe: !0,
- fog: !1
- });
- d.color.copy(this.light.color).multiplyScalar(this.light.intensity);
- this.lightPlane = new THREE.Mesh(c, d);
- this.add(this.lightPlane);
- c = new THREE.Geometry;
- c.vertices.push(new THREE.Vector3);
- c.vertices.push(new THREE.Vector3);
- d = new THREE.LineBasicMaterial({
- fog: !1
- });
- d.color.copy(this.light.color).multiplyScalar(this.light.intensity);
- this.targetLine = new THREE.Line(c, d);
- this.add(this.targetLine);
- this.update()
-};
-THREE.DirectionalLightHelper.prototype = Object.create(THREE.Object3D.prototype);
-THREE.DirectionalLightHelper.prototype.dispose = function() {
- this.lightPlane.geometry.dispose();
- this.lightPlane.material.dispose();
- this.targetLine.geometry.dispose();
- this.targetLine.material.dispose()
-};
-THREE.DirectionalLightHelper.prototype.update = function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3,
- c = new THREE.Vector3;
- return function() {
- a.setFromMatrixPosition(this.light.matrixWorld);
- b.setFromMatrixPosition(this.light.target.matrixWorld);
- c.subVectors(b, a);
- this.lightPlane.lookAt(c);
- this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
- this.targetLine.geometry.vertices[1].copy(c);
- this.targetLine.geometry.verticesNeedUpdate = !0;
- this.targetLine.material.color.copy(this.lightPlane.material.color)
- }
-}();
-THREE.FaceNormalsHelper = function(a, b, c, d) {
- this.object = a;
- this.size = b || 1;
- for (var a = c || 16776960, d = d || 1, b = new THREE.Geometry, c = 0, e = this.object.geometry.faces.length; c < e; c++) b.vertices.push(new THREE.Vector3), b.vertices.push(new THREE.Vector3);
- THREE.Line.call(this, b, new THREE.LineBasicMaterial({
- color: a,
- linewidth: d
- }), THREE.LinePieces);
- this.matrixAutoUpdate = !1;
- this.normalMatrix = new THREE.Matrix3;
- this.update()
-};
-THREE.FaceNormalsHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.FaceNormalsHelper.prototype.update = function() {
- var a = new THREE.Vector3;
- return function() {
- this.object.updateMatrixWorld(!0);
- this.normalMatrix.getNormalMatrix(this.object.matrixWorld);
- for (var b = this.geometry.vertices, c = this.object.geometry.faces, d = this.object.matrixWorld, e = 0, f = c.length; e < f; e++) {
- var h = c[e];
- a.copy(h.normal).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size);
- var g = 2 * e;
- b[g].copy(h.centroid).applyMatrix4(d);
- b[g + 1].addVectors(b[g], a)
- }
- this.geometry.verticesNeedUpdate = !0;
- return this
- }
-}();
-THREE.GridHelper = function(a, b) {
- var c = new THREE.Geometry,
- d = new THREE.LineBasicMaterial({
- vertexColors: THREE.VertexColors
- });
- this.color1 = new THREE.Color(4473924);
- this.color2 = new THREE.Color(8947848);
- for (var e = -a; e <= a; e += b) {
- c.vertices.push(new THREE.Vector3(-a, 0, e), new THREE.Vector3(a, 0, e), new THREE.Vector3(e, 0, - a), new THREE.Vector3(e, 0, a));
- var f = 0 === e ? this.color1 : this.color2;
- c.colors.push(f, f, f, f)
- }
- THREE.Line.call(this, c, d, THREE.LinePieces)
-};
-THREE.GridHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.GridHelper.prototype.setColors = function(a, b) {
- this.color1.set(a);
- this.color2.set(b);
- this.geometry.colorsNeedUpdate = !0
-};
-THREE.HemisphereLightHelper = function(a, b) {
- THREE.Object3D.call(this);
- this.light = a;
- this.light.updateMatrixWorld();
- this.matrixWorld = a.matrixWorld;
- this.matrixAutoUpdate = !1;
- this.colors = [new THREE.Color, new THREE.Color];
- var c = new THREE.SphereGeometry(b, 4, 2);
- c.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI / 2));
- for (var d = 0; 8 > d; d++) c.faces[d].color = this.colors[4 > d ? 0 : 1];
- d = new THREE.MeshBasicMaterial({
- vertexColors: THREE.FaceColors,
- wireframe: !0
- });
- this.lightSphere = new THREE.Mesh(c, d);
- this.add(this.lightSphere);
- this.update()
-};
-THREE.HemisphereLightHelper.prototype = Object.create(THREE.Object3D.prototype);
-THREE.HemisphereLightHelper.prototype.dispose = function() {
- this.lightSphere.geometry.dispose();
- this.lightSphere.material.dispose()
-};
-THREE.HemisphereLightHelper.prototype.update = function() {
- var a = new THREE.Vector3;
- return function() {
- this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);
- this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);
- this.lightSphere.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());
- this.lightSphere.geometry.colorsNeedUpdate = !0
- }
-}();
-THREE.PointLightHelper = function(a, b) {
- this.light = a;
- this.light.updateMatrixWorld();
- var c = new THREE.SphereGeometry(b, 4, 2),
- d = new THREE.MeshBasicMaterial({
- wireframe: !0,
- fog: !1
- });
- d.color.copy(this.light.color).multiplyScalar(this.light.intensity);
- THREE.Mesh.call(this, c, d);
- this.matrixWorld = this.light.matrixWorld;
- this.matrixAutoUpdate = !1
-};
-THREE.PointLightHelper.prototype = Object.create(THREE.Mesh.prototype);
-THREE.PointLightHelper.prototype.dispose = function() {
- this.geometry.dispose();
- this.material.dispose()
-};
-THREE.PointLightHelper.prototype.update = function() {
- this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)
-};
-THREE.SpotLightHelper = function(a) {
- THREE.Object3D.call(this);
- this.light = a;
- this.light.updateMatrixWorld();
- this.matrixWorld = a.matrixWorld;
- this.matrixAutoUpdate = !1;
- a = new THREE.CylinderGeometry(0, 1, 1, 8, 1, !0);
- a.applyMatrix((new THREE.Matrix4).makeTranslation(0, - 0.5, 0));
- a.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI / 2));
- var b = new THREE.MeshBasicMaterial({
- wireframe: !0,
- fog: !1
- });
- this.cone = new THREE.Mesh(a, b);
- this.add(this.cone);
- this.update()
-};
-THREE.SpotLightHelper.prototype = Object.create(THREE.Object3D.prototype);
-THREE.SpotLightHelper.prototype.dispose = function() {
- this.cone.geometry.dispose();
- this.cone.material.dispose()
-};
-THREE.SpotLightHelper.prototype.update = function() {
- var a = new THREE.Vector3,
- b = new THREE.Vector3;
- return function() {
- var c = this.light.distance ? this.light.distance : 1E4,
- d = c * Math.tan(this.light.angle);
- this.cone.scale.set(d, d, c);
- a.setFromMatrixPosition(this.light.matrixWorld);
- b.setFromMatrixPosition(this.light.target.matrixWorld);
- this.cone.lookAt(b.sub(a));
- this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)
- }
-}();
-THREE.VertexNormalsHelper = function(a, b, c, d) {
- this.object = a;
- this.size = b || 1;
- for (var b = c || 16711680, d = d || 1, c = new THREE.Geometry, a = a.geometry.faces, e = 0, f = a.length; e < f; e++) for (var h = 0, g = a[e].vertexNormals.length; h < g; h++) c.vertices.push(new THREE.Vector3), c.vertices.push(new THREE.Vector3);
- THREE.Line.call(this, c, new THREE.LineBasicMaterial({
- color: b,
- linewidth: d
- }), THREE.LinePieces);
- this.matrixAutoUpdate = !1;
- this.normalMatrix = new THREE.Matrix3;
- this.update()
-};
-THREE.VertexNormalsHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.VertexNormalsHelper.prototype.update = function() {
- var a = new THREE.Vector3;
- return function() {
- var b = ["a", "b", "c", "d"];
- this.object.updateMatrixWorld(!0);
- this.normalMatrix.getNormalMatrix(this.object.matrixWorld);
- for (var c = this.geometry.vertices, d = this.object.geometry.vertices, e = this.object.geometry.faces, f = this.object.matrixWorld, h = 0, g = 0, i = e.length; g < i; g++) for (var k = e[g], m = 0, l = k.vertexNormals.length; m < l; m++) {
- var p = k.vertexNormals[m];
- c[h].copy(d[k[b[m]]]).applyMatrix4(f);
- a.copy(p).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size);
- a.add(c[h]);
- h += 1;
- c[h].copy(a);
- h += 1
- }
- this.geometry.verticesNeedUpdate = !0;
- return this
- }
-}();
-THREE.VertexTangentsHelper = function(a, b, c, d) {
- this.object = a;
- this.size = b || 1;
- for (var b = c || 255, d = d || 1, c = new THREE.Geometry, a = a.geometry.faces, e = 0, f = a.length; e < f; e++) for (var h = 0, g = a[e].vertexTangents.length; h < g; h++) c.vertices.push(new THREE.Vector3), c.vertices.push(new THREE.Vector3);
- THREE.Line.call(this, c, new THREE.LineBasicMaterial({
- color: b,
- linewidth: d
- }), THREE.LinePieces);
- this.matrixAutoUpdate = !1;
- this.update()
-};
-THREE.VertexTangentsHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.VertexTangentsHelper.prototype.update = function() {
- var a = new THREE.Vector3;
- return function() {
- var b = ["a", "b", "c", "d"];
- this.object.updateMatrixWorld(!0);
- for (var c = this.geometry.vertices, d = this.object.geometry.vertices, e = this.object.geometry.faces, f = this.object.matrixWorld, h = 0, g = 0, i = e.length; g < i; g++) for (var k = e[g], m = 0, l = k.vertexTangents.length; m < l; m++) {
- var p = k.vertexTangents[m];
- c[h].copy(d[k[b[m]]]).applyMatrix4(f);
- a.copy(p).transformDirection(f).multiplyScalar(this.size);
- a.add(c[h]);
- h += 1;
- c[h].copy(a);
- h += 1
- }
- this.geometry.verticesNeedUpdate = !0;
- return this
- }
-}();
-THREE.WireframeHelper = function(a) {
- var b = [0, 0],
- c = {}, d = function(a, b) {
- return a - b
- }, e = ["a", "b", "c", "d"],
- f = new THREE.BufferGeometry,
- h = 0;
- if (a.geometry instanceof THREE.Geometry) {
- for (var g = a.geometry.vertices, i = a.geometry.faces, k = new Uint32Array(6 * i.length), m = 0, l = i.length; m < l; m++) for (var p = i[m], t = 0; 3 > t; t++) {
- b[0] = p[e[t]];
- b[1] = p[e[(t + 1) % 3]];
- b.sort(d);
- var s = b.toString();
- void 0 === c[s] && (k[2 * h] = b[0], k[2 * h + 1] = b[1], c[s] = !0, h++)
- }
- f.addAttribute("position", Float32Array, 2 * h, 3);
- b = f.attributes.position.array;
- m = 0;
- for (l = h; m < l; m++) for (t = 0; 2 > t; t++) h = g[k[2 * m + t]], e = 6 * m + 3 * t, b[e + 0] = h.x, b[e + 1] = h.y, b[e + 2] = h.z
- } else {
- g = a.geometry.attributes.position.array;
- i = a.geometry.attributes.index.array;
- k = new Uint32Array(2 * i.length);
- m = 0;
- for (l = i.length / 3; m < l; m++) for (t = 0; 3 > t; t++) e = 3 * m, b[0] = i[e + t], b[1] = i[e + (t + 1) % 3], b.sort(d), s = b.toString(), void 0 === c[s] && (k[2 * h] = b[0], k[2 * h + 1] = b[1], c[s] = !0, h++);
- f.addAttribute("position", Float32Array, 2 * h, 3);
- b = f.attributes.position.array;
- m = 0;
- for (l = h; m < l; m++) for (t = 0; 2 > t; t++) e = 6 * m + 3 * t, h = 3 * k[2 * m + t], b[e + 0] = g[h],
- b[e + 1] = g[h + 1], b[e + 2] = g[h + 2]
- }
- THREE.Line.call(this, f, new THREE.LineBasicMaterial({
- color: 16777215
- }), THREE.LinePieces);
- this.matrixAutoUpdate = !1;
- this.matrixWorld = a.matrixWorld
-};
-THREE.WireframeHelper.prototype = Object.create(THREE.Line.prototype);
-THREE.ImmediateRenderObject = function() {
- THREE.Object3D.call(this);
- this.render = function() {}
-};
-THREE.ImmediateRenderObject.prototype = Object.create(THREE.Object3D.prototype);
-THREE.LensFlare = function(a, b, c, d, e) {
- THREE.Object3D.call(this);
- this.lensFlares = [];
- this.positionScreen = new THREE.Vector3;
- this.customUpdateCallback = void 0;
- void 0 !== a && this.add(a, b, c, d, e)
-};
-THREE.LensFlare.prototype = Object.create(THREE.Object3D.prototype);
-THREE.LensFlare.prototype.add = function(a, b, c, d, e, f) {
- void 0 === b && (b = -1);
- void 0 === c && (c = 0);
- void 0 === f && (f = 1);
- void 0 === e && (e = new THREE.Color(16777215));
- void 0 === d && (d = THREE.NormalBlending);
- c = Math.min(c, Math.max(0, c));
- this.lensFlares.push({
- texture: a,
- size: b,
- distance: c,
- x: 0,
- y: 0,
- z: 0,
- scale: 1,
- rotation: 1,
- opacity: f,
- color: e,
- blending: d
- })
-};
-THREE.LensFlare.prototype.updateLensFlares = function() {
- var a, b = this.lensFlares.length,
- c, d = 2 * -this.positionScreen.x,
- e = 2 * -this.positionScreen.y;
- for (a = 0; a < b; a++) c = this.lensFlares[a], c.x = this.positionScreen.x + d * c.distance, c.y = this.positionScreen.y + e * c.distance, c.wantedRotation = 0.25 * c.x * Math.PI, c.rotation += 0.25 * (c.wantedRotation - c.rotation)
-};
-THREE.MorphBlendMesh = function(a, b) {
- THREE.Mesh.call(this, a, b);
- this.animationsMap = {};
- this.animationsList = [];
- var c = this.geometry.morphTargets.length;
- this.createAnimation("__default", 0, c - 1, c / 1);
- this.setAnimationWeight("__default", 1)
-};
-THREE.MorphBlendMesh.prototype = Object.create(THREE.Mesh.prototype);
-THREE.MorphBlendMesh.prototype.createAnimation = function(a, b, c, d) {
- b = {
- startFrame: b,
- endFrame: c,
- length: c - b + 1,
- fps: d,
- duration: (c - b) / d,
- lastFrame: 0,
- currentFrame: 0,
- active: !1,
- time: 0,
- direction: 1,
- weight: 1,
- directionBackwards: !1,
- mirroredLoop: !1
- };
- this.animationsMap[a] = b;
- this.animationsList.push(b)
-};
-THREE.MorphBlendMesh.prototype.autoCreateAnimations = function(a) {
- for (var b = /([a-z]+)(\d+)/, c, d = {}, e = this.geometry, f = 0, h = e.morphTargets.length; f < h; f++) {
- var g = e.morphTargets[f].name.match(b);
- if (g && 1 < g.length) {
- var i = g[1];
- d[i] || (d[i] = {
- start: Infinity,
- end: -Infinity
- });
- g = d[i];
- f < g.start && (g.start = f);
- f > g.end && (g.end = f);
- c || (c = i)
- }
- }
- for (i in d) g = d[i], this.createAnimation(i, g.start, g.end, a);
- this.firstAnimation = c
-};
-THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function(a) {
- if (a = this.animationsMap[a]) a.direction = 1, a.directionBackwards = !1
-};
-THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function(a) {
- if (a = this.animationsMap[a]) a.direction = -1, a.directionBackwards = !0
-};
-THREE.MorphBlendMesh.prototype.setAnimationFPS = function(a, b) {
- var c = this.animationsMap[a];
- c && (c.fps = b, c.duration = (c.end - c.start) / c.fps)
-};
-THREE.MorphBlendMesh.prototype.setAnimationDuration = function(a, b) {
- var c = this.animationsMap[a];
- c && (c.duration = b, c.fps = (c.end - c.start) / c.duration)
-};
-THREE.MorphBlendMesh.prototype.setAnimationWeight = function(a, b) {
- var c = this.animationsMap[a];
- c && (c.weight = b)
-};
-THREE.MorphBlendMesh.prototype.setAnimationTime = function(a, b) {
- var c = this.animationsMap[a];
- c && (c.time = b)
-};
-THREE.MorphBlendMesh.prototype.getAnimationTime = function(a) {
- var b = 0;
- if (a = this.animationsMap[a]) b = a.time;
- return b
-};
-THREE.MorphBlendMesh.prototype.getAnimationDuration = function(a) {
- var b = -1;
- if (a = this.animationsMap[a]) b = a.duration;
- return b
-};
-THREE.MorphBlendMesh.prototype.playAnimation = function(a) {
- var b = this.animationsMap[a];
- b ? (b.time = 0, b.active = !0) : console.warn("animation[" + a + "] undefined")
-};
-THREE.MorphBlendMesh.prototype.stopAnimation = function(a) {
- if (a = this.animationsMap[a]) a.active = !1
-};
-THREE.MorphBlendMesh.prototype.update = function(a) {
- for (var b = 0, c = this.animationsList.length; b < c; b++) {
- var d = this.animationsList[b];
- if (d.active) {
- var e = d.duration / d.length;
- d.time += d.direction * a;
- if (d.mirroredLoop) {
- if (d.time > d.duration || 0 > d.time) d.direction *= -1, d.time > d.duration && (d.time = d.duration, d.directionBackwards = !0), 0 > d.time && (d.time = 0, d.directionBackwards = !1)
- } else d.time %= d.duration, 0 > d.time && (d.time += d.duration);
- var f = d.startFrame + THREE.Math.clamp(Math.floor(d.time / e), 0, d.length - 1),
- h = d.weight;
- f !== d.currentFrame && (this.morphTargetInfluences[d.lastFrame] = 0, this.morphTargetInfluences[d.currentFrame] = 1 * h, this.morphTargetInfluences[f] = 0, d.lastFrame = d.currentFrame, d.currentFrame = f);
- e = d.time % e / e;
- d.directionBackwards && (e = 1 - e);
- this.morphTargetInfluences[d.currentFrame] = e * h;
- this.morphTargetInfluences[d.lastFrame] = (1 - e) * h
- }
- }
-};
-THREE.LensFlarePlugin = function() {
- function a(a, c) {
- var d = b.createProgram(),
- e = b.createShader(b.FRAGMENT_SHADER),
- f = b.createShader(b.VERTEX_SHADER),
- g = "precision " + c + " float;\n";
- b.shaderSource(e, g + a.fragmentShader);
- b.shaderSource(f, g + a.vertexShader);
- b.compileShader(e);
- b.compileShader(f);
- b.attachShader(d, e);
- b.attachShader(d, f);
- b.linkProgram(d);
- return d
- }
- var b, c, d, e, f, h, g, i, k, m, l, p, t;
- this.init = function(s) {
- b = s.context;
- c = s;
- d = s.getPrecision();
- e = new Float32Array(16);
- f = new Uint16Array(6);
- s = 0;
- e[s++] = -1;
- e[s++] = -1;
- e[s++] = 0;
- e[s++] = 0;
- e[s++] = 1;
- e[s++] = -1;
- e[s++] = 1;
- e[s++] = 0;
- e[s++] = 1;
- e[s++] = 1;
- e[s++] = 1;
- e[s++] = 1;
- e[s++] = -1;
- e[s++] = 1;
- e[s++] = 0;
- e[s++] = 1;
- s = 0;
- f[s++] = 0;
- f[s++] = 1;
- f[s++] = 2;
- f[s++] = 0;
- f[s++] = 2;
- f[s++] = 3;
- h = b.createBuffer();
- g = b.createBuffer();
- b.bindBuffer(b.ARRAY_BUFFER, h);
- b.bufferData(b.ARRAY_BUFFER, e, b.STATIC_DRAW);
- b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, g);
- b.bufferData(b.ELEMENT_ARRAY_BUFFER, f, b.STATIC_DRAW);
- i = b.createTexture();
- k = b.createTexture();
- b.bindTexture(b.TEXTURE_2D, i);
- b.texImage2D(b.TEXTURE_2D, 0, b.RGB, 16, 16,
- 0, b.RGB, b.UNSIGNED_BYTE, null);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_S, b.CLAMP_TO_EDGE);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_T, b.CLAMP_TO_EDGE);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MAG_FILTER, b.NEAREST);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MIN_FILTER, b.NEAREST);
- b.bindTexture(b.TEXTURE_2D, k);
- b.texImage2D(b.TEXTURE_2D, 0, b.RGBA, 16, 16, 0, b.RGBA, b.UNSIGNED_BYTE, null);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_S, b.CLAMP_TO_EDGE);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_T, b.CLAMP_TO_EDGE);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MAG_FILTER, b.NEAREST);
- b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MIN_FILTER, b.NEAREST);
- 0 >= b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS) ? (m = !1, l = a(THREE.ShaderFlares.lensFlare, d)) : (m = !0, l = a(THREE.ShaderFlares.lensFlareVertexTexture, d));
- p = {};
- t = {};
- p.vertex = b.getAttribLocation(l, "position");
- p.uv = b.getAttribLocation(l, "uv");
- t.renderType = b.getUniformLocation(l, "renderType");
- t.map = b.getUniformLocation(l, "map");
- t.occlusionMap = b.getUniformLocation(l, "occlusionMap");
- t.opacity = b.getUniformLocation(l, "opacity");
- t.color = b.getUniformLocation(l, "color");
- t.scale = b.getUniformLocation(l, "scale");
- t.rotation = b.getUniformLocation(l, "rotation");
- t.screenPosition = b.getUniformLocation(l, "screenPosition")
- };
- this.render = function(a, d, e, f) {
- var a = a.__webglFlares,
- r = a.length;
- if (r) {
- var v = new THREE.Vector3,
- z = f / e,
- G = 0.5 * e,
- w = 0.5 * f,
- y = 16 / f,
- E = new THREE.Vector2(y * z, y),
- A = new THREE.Vector3(1, 1, 0),
- K = new THREE.Vector2(1, 1),
- D = t,
- y = p;
- b.useProgram(l);
- b.enableVertexAttribArray(p.vertex);
- b.enableVertexAttribArray(p.uv);
- b.uniform1i(D.occlusionMap, 0);
- b.uniform1i(D.map, 1);
- b.bindBuffer(b.ARRAY_BUFFER, h);
- b.vertexAttribPointer(y.vertex, 2, b.FLOAT, !1, 16, 0);
- b.vertexAttribPointer(y.uv, 2, b.FLOAT, !1, 16, 8);
- b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, g);
- b.disable(b.CULL_FACE);
- b.depthMask(!1);
- var F, O, x, I, B;
- for (F = 0; F < r; F++) if (y = 16 / f, E.set(y * z, y), I = a[F], v.set(I.matrixWorld.elements[12], I.matrixWorld.elements[13], I.matrixWorld.elements[14]), v.applyMatrix4(d.matrixWorldInverse), v.applyProjection(d.projectionMatrix), A.copy(v), K.x = A.x * G + G,
- K.y = A.y * w + w, m || 0 < K.x && K.x < e && 0 < K.y && K.y < f) {
- b.activeTexture(b.TEXTURE1);
- b.bindTexture(b.TEXTURE_2D, i);
- b.copyTexImage2D(b.TEXTURE_2D, 0, b.RGB, K.x - 8, K.y - 8, 16, 16, 0);
- b.uniform1i(D.renderType, 0);
- b.uniform2f(D.scale, E.x, E.y);
- b.uniform3f(D.screenPosition, A.x, A.y, A.z);
- b.disable(b.BLEND);
- b.enable(b.DEPTH_TEST);
- b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0);
- b.activeTexture(b.TEXTURE0);
- b.bindTexture(b.TEXTURE_2D, k);
- b.copyTexImage2D(b.TEXTURE_2D, 0, b.RGBA, K.x - 8, K.y - 8, 16, 16, 0);
- b.uniform1i(D.renderType, 1);
- b.disable(b.DEPTH_TEST);
- b.activeTexture(b.TEXTURE1);
- b.bindTexture(b.TEXTURE_2D, i);
- b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0);
- I.positionScreen.copy(A);
- I.customUpdateCallback ? I.customUpdateCallback(I) : I.updateLensFlares();
- b.uniform1i(D.renderType, 2);
- b.enable(b.BLEND);
- O = 0;
- for (x = I.lensFlares.length; O < x; O++) B = I.lensFlares[O], 0.001 < B.opacity && 0.001 < B.scale && (A.x = B.x, A.y = B.y, A.z = B.z, y = B.size * B.scale / f, E.x = y * z, E.y = y, b.uniform3f(D.screenPosition, A.x, A.y, A.z), b.uniform2f(D.scale, E.x, E.y), b.uniform1f(D.rotation, B.rotation), b.uniform1f(D.opacity,
- B.opacity), b.uniform3f(D.color, B.color.r, B.color.g, B.color.b), c.setBlending(B.blending, B.blendEquation, B.blendSrc, B.blendDst), c.setTexture(B.texture, 1), b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0))
- }
- b.enable(b.CULL_FACE);
- b.enable(b.DEPTH_TEST);
- b.depthMask(!0)
- }
- }
-};
-THREE.ShadowMapPlugin = function() {
- var a, b, c, d, e, f, h = new THREE.Frustum,
- g = new THREE.Matrix4,
- i = new THREE.Vector3,
- k = new THREE.Vector3,
- m = new THREE.Vector3;
- this.init = function(g) {
- a = g.context;
- b = g;
- var g = THREE.ShaderLib.depthRGBA,
- h = THREE.UniformsUtils.clone(g.uniforms);
- c = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h
- });
- d = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h,
- morphTargets: !0
- });
- e = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h,
- skinning: !0
- });
- f = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h,
- morphTargets: !0,
- skinning: !0
- });
- c._shadowPass = !0;
- d._shadowPass = !0;
- e._shadowPass = !0;
- f._shadowPass = !0
- };
- this.render = function(a, c) {
- b.shadowMapEnabled && b.shadowMapAutoUpdate && this.update(a, c)
- };
- this.update = function(l, p) {
- var t, s, q, n, u, r, v, z, G, w = [];
- n = 0;
- a.clearColor(1, 1, 1, 1);
- a.disable(a.BLEND);
- a.enable(a.CULL_FACE);
- a.frontFace(a.CCW);
- b.shadowMapCullFace === THREE.CullFaceFront ? a.cullFace(a.FRONT) : a.cullFace(a.BACK);
- b.setDepthTest(!0);
- t = 0;
- for (s = l.__lights.length; t < s; t++) if (q = l.__lights[t], q.castShadow) if (q instanceof THREE.DirectionalLight && q.shadowCascade) for (u = 0; u < q.shadowCascadeCount; u++) {
- var y;
- if (q.shadowCascadeArray[u]) y = q.shadowCascadeArray[u];
- else {
- G = q;
- v = u;
- y = new THREE.DirectionalLight;
- y.isVirtual = !0;
- y.onlyShadow = !0;
- y.castShadow = !0;
- y.shadowCameraNear = G.shadowCameraNear;
- y.shadowCameraFar = G.shadowCameraFar;
- y.shadowCameraLeft = G.shadowCameraLeft;
- y.shadowCameraRight = G.shadowCameraRight;
- y.shadowCameraBottom = G.shadowCameraBottom;
- y.shadowCameraTop = G.shadowCameraTop;
- y.shadowCameraVisible = G.shadowCameraVisible;
- y.shadowDarkness = G.shadowDarkness;
- y.shadowBias = G.shadowCascadeBias[v];
- y.shadowMapWidth = G.shadowCascadeWidth[v];
- y.shadowMapHeight = G.shadowCascadeHeight[v];
- y.pointsWorld = [];
- y.pointsFrustum = [];
- z = y.pointsWorld;
- r = y.pointsFrustum;
- for (var E = 0; 8 > E; E++) z[E] = new THREE.Vector3, r[E] = new THREE.Vector3;
- z = G.shadowCascadeNearZ[v];
- G = G.shadowCascadeFarZ[v];
- r[0].set(-1, - 1, z);
- r[1].set(1, - 1, z);
- r[2].set(-1,
- 1, z);
- r[3].set(1, 1, z);
- r[4].set(-1, - 1, G);
- r[5].set(1, - 1, G);
- r[6].set(-1, 1, G);
- r[7].set(1, 1, G);
- y.originalCamera = p;
- r = new THREE.Gyroscope;
- r.position = q.shadowCascadeOffset;
- r.add(y);
- r.add(y.target);
- p.add(r);
- q.shadowCascadeArray[u] = y;
- console.log("Created virtualLight", y)
- }
- v = q;
- z = u;
- G = v.shadowCascadeArray[z];
- G.position.copy(v.position);
- G.target.position.copy(v.target.position);
- G.lookAt(G.target);
- G.shadowCameraVisible = v.shadowCameraVisible;
- G.shadowDarkness = v.shadowDarkness;
- G.shadowBias = v.shadowCascadeBias[z];
- r = v.shadowCascadeNearZ[z];
- v = v.shadowCascadeFarZ[z];
- G = G.pointsFrustum;
- G[0].z = r;
- G[1].z = r;
- G[2].z = r;
- G[3].z = r;
- G[4].z = v;
- G[5].z = v;
- G[6].z = v;
- G[7].z = v;
- w[n] = y;
- n++
- } else w[n] = q, n++;
- t = 0;
- for (s = w.length; t < s; t++) {
- q = w[t];
- q.shadowMap || (u = THREE.LinearFilter, b.shadowMapType === THREE.PCFSoftShadowMap && (u = THREE.NearestFilter), q.shadowMap = new THREE.WebGLRenderTarget(q.shadowMapWidth, q.shadowMapHeight, {
- minFilter: u,
- magFilter: u,
- format: THREE.RGBAFormat
- }), q.shadowMapSize = new THREE.Vector2(q.shadowMapWidth, q.shadowMapHeight), q.shadowMatrix = new THREE.Matrix4);
- if (!q.shadowCamera) {
- if (q instanceof THREE.SpotLight) q.shadowCamera = new THREE.PerspectiveCamera(q.shadowCameraFov, q.shadowMapWidth / q.shadowMapHeight, q.shadowCameraNear, q.shadowCameraFar);
- else if (q instanceof THREE.DirectionalLight) q.shadowCamera = new THREE.OrthographicCamera(q.shadowCameraLeft, q.shadowCameraRight, q.shadowCameraTop, q.shadowCameraBottom, q.shadowCameraNear, q.shadowCameraFar);
- else {
- console.error("Unsupported light type for shadow");
- continue
- }
- l.add(q.shadowCamera);
- !0 === l.autoUpdate && l.updateMatrixWorld()
- }
- q.shadowCameraVisible && !q.cameraHelper && (q.cameraHelper = new THREE.CameraHelper(q.shadowCamera), q.shadowCamera.add(q.cameraHelper));
- if (q.isVirtual && y.originalCamera == p) {
- u = p;
- n = q.shadowCamera;
- r = q.pointsFrustum;
- G = q.pointsWorld;
- i.set(Infinity, Infinity, Infinity);
- k.set(-Infinity, - Infinity, - Infinity);
- for (v = 0; 8 > v; v++) z = G[v], z.copy(r[v]), THREE.ShadowMapPlugin.__projector.unprojectVector(z, u), z.applyMatrix4(n.matrixWorldInverse), z.x < i.x && (i.x = z.x), z.x > k.x && (k.x = z.x), z.y < i.y && (i.y = z.y), z.y > k.y && (k.y = z.y), z.z < i.z && (i.z = z.z), z.z > k.z && (k.z = z.z);
- n.left = i.x;
- n.right = k.x;
- n.top = k.y;
- n.bottom = i.y;
- n.updateProjectionMatrix()
- }
- n = q.shadowMap;
- r = q.shadowMatrix;
- u = q.shadowCamera;
- u.position.setFromMatrixPosition(q.matrixWorld);
- m.setFromMatrixPosition(q.target.matrixWorld);
- u.lookAt(m);
- u.updateMatrixWorld();
- u.matrixWorldInverse.getInverse(u.matrixWorld);
- q.cameraHelper && (q.cameraHelper.visible = q.shadowCameraVisible);
- q.shadowCameraVisible && q.cameraHelper.update();
- r.set(0.5, 0, 0, 0.5, 0, 0.5, 0, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 1);
- r.multiply(u.projectionMatrix);
- r.multiply(u.matrixWorldInverse);
- g.multiplyMatrices(u.projectionMatrix, u.matrixWorldInverse);
- h.setFromMatrix(g);
- b.setRenderTarget(n);
- b.clear();
- G = l.__webglObjects;
- q = 0;
- for (n = G.length; q < n; q++) if (v = G[q], r = v.object, v.render = !1, r.visible && r.castShadow && (!(r instanceof THREE.Mesh || r instanceof THREE.ParticleSystem) || !r.frustumCulled || h.intersectsObject(r))) r._modelViewMatrix.multiplyMatrices(u.matrixWorldInverse, r.matrixWorld), v.render = !0;
- q = 0;
- for (n = G.length; q < n; q++) v = G[q], v.render && (r = v.object, v = v.buffer, E = r.material instanceof THREE.MeshFaceMaterial ? r.material.materials[0] : r.material, z = 0 < r.geometry.morphTargets.length && E.morphTargets, E = r instanceof THREE.SkinnedMesh && E.skinning, z = r.customDepthMaterial ? r.customDepthMaterial : E ? z ? f : e : z ? d : c, v instanceof THREE.BufferGeometry ? b.renderBufferDirect(u, l.__lights, null, z, v, r) : b.renderBuffer(u, l.__lights, null, z, v, r));
- G = l.__webglObjectsImmediate;
- q = 0;
- for (n = G.length; q < n; q++) v = G[q], r = v.object, r.visible && r.castShadow && (r._modelViewMatrix.multiplyMatrices(u.matrixWorldInverse, r.matrixWorld), b.renderImmediateObject(u,
- l.__lights, null, c, r))
- }
- t = b.getClearColor();
- s = b.getClearAlpha();
- a.clearColor(t.r, t.g, t.b, s);
- a.enable(a.BLEND);
- b.shadowMapCullFace === THREE.CullFaceFront && a.cullFace(a.BACK)
- }
-};
-THREE.ShadowMapPlugin.__projector = new THREE.Projector;
-THREE.SpritePlugin = function() {
- var a, b, c, d, e, f, h, g, i, k, m, l, p, t, s, q, n;
-
- function u(a, b) {
- return a.z !== b.z ? b.z - a.z : b.id - a.id
- }
- var r, v, z, G, w, y, E, A;
- this.init = function(u) {
- r = u.context;
- v = u;
- G = new Float32Array([-0.5, - 0.5, 0, 0, 0.5, - 0.5, 1, 0, 0.5, 0.5, 1, 1, - 0.5, 0.5, 0, 1]);
- w = new Uint16Array([0, 1, 2, 0, 2, 3]);
- y = r.createBuffer();
- E = r.createBuffer();
- r.bindBuffer(r.ARRAY_BUFFER, y);
- r.bufferData(r.ARRAY_BUFFER, G, r.STATIC_DRAW);
- r.bindBuffer(r.ELEMENT_ARRAY_BUFFER, E);
- r.bufferData(r.ELEMENT_ARRAY_BUFFER, w, r.STATIC_DRAW);
- var u = r.createProgram(),
- D = r.createShader(r.VERTEX_SHADER),
- F = r.createShader(r.FRAGMENT_SHADER);
- r.shaderSource(D, ["precision " + v.getPrecision() + " float;", "uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
- r.shaderSource(F, ["precision " + v.getPrecision() + " float;", "uniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
- r.compileShader(D);
- r.compileShader(F);
- r.attachShader(u, D);
- r.attachShader(u, F);
- r.linkProgram(u);
- A = u;
- q = r.getAttribLocation(A, "position");
- n = r.getAttribLocation(A, "uv");
- a = r.getUniformLocation(A, "uvOffset");
- b = r.getUniformLocation(A, "uvScale");
- c = r.getUniformLocation(A, "rotation");
- d = r.getUniformLocation(A, "scale");
- e = r.getUniformLocation(A, "color");
- f = r.getUniformLocation(A, "map");
- h = r.getUniformLocation(A, "opacity");
- g = r.getUniformLocation(A, "modelViewMatrix");
- i = r.getUniformLocation(A, "projectionMatrix");
- k = r.getUniformLocation(A, "fogType");
- m = r.getUniformLocation(A, "fogDensity");
- l = r.getUniformLocation(A, "fogNear");
- p = r.getUniformLocation(A, "fogFar");
- t = r.getUniformLocation(A, "fogColor");
- s = r.getUniformLocation(A, "alphaTest");
- u = document.createElement("canvas");
- u.width = 8;
- u.height = 8;
- D = u.getContext("2d");
- D.fillStyle = "#ffffff";
- D.fillRect(0, 0, u.width, u.height);
- z = new THREE.Texture(u);
- z.needsUpdate = !0
- };
- this.render = function(w, D) {
- var F = w.__webglSprites,
- G = F.length;
- if (G) {
- r.useProgram(A);
- r.enableVertexAttribArray(q);
- r.enableVertexAttribArray(n);
- r.disable(r.CULL_FACE);
- r.enable(r.BLEND);
- r.bindBuffer(r.ARRAY_BUFFER, y);
- r.vertexAttribPointer(q, 2, r.FLOAT, !1, 16, 0);
- r.vertexAttribPointer(n, 2, r.FLOAT, !1, 16, 8);
- r.bindBuffer(r.ELEMENT_ARRAY_BUFFER, E);
- r.uniformMatrix4fv(i, !1, D.projectionMatrix.elements);
- r.activeTexture(r.TEXTURE0);
- r.uniform1i(f, 0);
- var x = 0,
- I = 0,
- B = w.fog;
- B ? (r.uniform3f(t, B.color.r, B.color.g, B.color.b), B instanceof THREE.Fog ? (r.uniform1f(l, B.near), r.uniform1f(p, B.far), r.uniform1i(k, 1), I = x = 1) : B instanceof THREE.FogExp2 && (r.uniform1f(m, B.density), r.uniform1i(k, 2), I = x = 2)) : (r.uniform1i(k, 0), I = x = 0);
- for (var M, J, ca = [], B = 0; B < G; B++) M = F[B], !1 !== M.visible && (M._modelViewMatrix.multiplyMatrices(D.matrixWorldInverse, M.matrixWorld), M.z = -M._modelViewMatrix.elements[14]);
- F.sort(u);
- for (B = 0; B < G; B++) M = F[B], !1 !== M.visible && (J = M.material, r.uniform1f(s, J.alphaTest), r.uniformMatrix4fv(g, !1, M._modelViewMatrix.elements), ca[0] = M.scale.x, ca[1] = M.scale.y, M = w.fog && J.fog ? I : 0, x !== M && (r.uniform1i(k, M), x = M), r.uniform2f(b, J.uvScale.x, J.uvScale.y),
- r.uniform2f(a, J.uvOffset.x, J.uvOffset.y), r.uniform1f(h, J.opacity), r.uniform3f(e, J.color.r, J.color.g, J.color.b), r.uniform1f(c, J.rotation), r.uniform2fv(d, ca), v.setBlending(J.blending, J.blendEquation, J.blendSrc, J.blendDst), v.setDepthTest(J.depthTest), v.setDepthWrite(J.depthWrite), J.map && J.map.image && J.map.image.width ? v.setTexture(J.map, 0) : v.setTexture(z, 0), r.drawElements(r.TRIANGLES, 6, r.UNSIGNED_SHORT, 0));
- r.enable(r.CULL_FACE)
- }
- }
-};
-THREE.DepthPassPlugin = function() {
- this.enabled = !1;
- this.renderTarget = null;
- var a, b, c, d, e, f, h = new THREE.Frustum,
- g = new THREE.Matrix4;
- this.init = function(g) {
- a = g.context;
- b = g;
- var g = THREE.ShaderLib.depthRGBA,
- h = THREE.UniformsUtils.clone(g.uniforms);
- c = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h
- });
- d = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h,
- morphTargets: !0
- });
- e = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h,
- skinning: !0
- });
- f = new THREE.ShaderMaterial({
- fragmentShader: g.fragmentShader,
- vertexShader: g.vertexShader,
- uniforms: h,
- morphTargets: !0,
- skinning: !0
- });
- c._shadowPass = !0;
- d._shadowPass = !0;
- e._shadowPass = !0;
- f._shadowPass = !0
- };
- this.render = function(a, b) {
- this.enabled && this.update(a, b)
- };
- this.update = function(i, k) {
- var m, l, p, t, s, q;
- a.clearColor(1, 1, 1, 1);
- a.disable(a.BLEND);
- b.setDepthTest(!0);
- !0 === i.autoUpdate && i.updateMatrixWorld();
- k.matrixWorldInverse.getInverse(k.matrixWorld);
- g.multiplyMatrices(k.projectionMatrix,
- k.matrixWorldInverse);
- h.setFromMatrix(g);
- b.setRenderTarget(this.renderTarget);
- b.clear();
- q = i.__webglObjects;
- m = 0;
- for (l = q.length; m < l; m++) if (p = q[m], s = p.object, p.render = !1, s.visible && (!(s instanceof THREE.Mesh || s instanceof THREE.ParticleSystem) || !s.frustumCulled || h.intersectsObject(s))) s._modelViewMatrix.multiplyMatrices(k.matrixWorldInverse, s.matrixWorld), p.render = !0;
- var n;
- m = 0;
- for (l = q.length; m < l; m++) if (p = q[m], p.render && (s = p.object, p = p.buffer, !(s instanceof THREE.ParticleSystem) || s.customDepthMaterial))(n = s.material instanceof THREE.MeshFaceMaterial ? s.material.materials[0] : s.material) && b.setMaterialFaces(s.material), t = 0 < s.geometry.morphTargets.length && n.morphTargets, n = s instanceof THREE.SkinnedMesh && n.skinning, t = s.customDepthMaterial ? s.customDepthMaterial : n ? t ? f : e : t ? d : c, p instanceof THREE.BufferGeometry ? b.renderBufferDirect(k, i.__lights, null, t, p, s) : b.renderBuffer(k, i.__lights, null, t, p, s);
- q = i.__webglObjectsImmediate;
- m = 0;
- for (l = q.length; m < l; m++) p = q[m], s = p.object, s.visible && (s._modelViewMatrix.multiplyMatrices(k.matrixWorldInverse,
- s.matrixWorld), b.renderImmediateObject(k, i.__lights, null, c, s));
- m = b.getClearColor();
- l = b.getClearAlpha();
- a.clearColor(m.r, m.g, m.b, l);
- a.enable(a.BLEND)
- }
-};
-THREE.ShaderFlares = {
- lensFlareVertexTexture: {
- vertexShader: "uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility = visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *= visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
- fragmentShader: "uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"
- },
- lensFlare: {
- vertexShader: "uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
- fragmentShader: "precision mediump float;\nuniform lowp int renderType;\nuniform sampler2D map;\nuniform sampler2D occlusionMap;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * visibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"
- }
-};
\ No newline at end of file
+// threejs.org/license
+(function(k,ha){"object"===typeof exports&&"undefined"!==typeof module?ha(exports):"function"===typeof define&&define.amd?define(["exports"],ha):ha(k.THREE={})})(this,function(k){function ha(){}function y(a,b){this.x=a||0;this.y=b||0}function F(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0b&&(b=a[c]);return b}function G(){Object.defineProperty(this,"id",{value:Hf+=2});this.uuid=P.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};this.userData={}}function Nb(a,b,c,d,e,f){J.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,
+depthSegments:f};this.fromBufferGeometry(new pb(a,b,c,d,e,f));this.mergeVertices()}function pb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,k,Q,E,Bc){var t=f/Q,u=g/E,V=f/2,z=g/2,w=k/2;g=Q+1;var x=E+1,H=f=0,C,y,A=new p;for(y=0;ym;m++){if(n=d[m])if(h=n[0],l=n[1]){v&&e.addAttribute("morphTarget"+m,v[h]);f&&e.addAttribute("morphNormal"+m,f[h]);c[m]=l;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Tf(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),
+a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function cb(a,b,c,d,e,f,g,h,l,m){a=void 0!==a?a:[];ca.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,l,m);this.flipY=!1}function Pb(a,b,c){var d=a[0];if(0>=d||0/gm,function(a,c){a=W[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Yd(a)})}function Xe(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,
+function(a,c,d,e){a="";for(c=parseInt(c);c 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n"));
+b.compileShader(Da);b.compileShader(ia);b.attachShader(S,Da);b.attachShader(S,ia);b.linkProgram(S);y=S;V=b.getAttribLocation(y,"position");Q=b.getAttribLocation(y,"uv");f=b.getUniformLocation(y,"uvOffset");g=b.getUniformLocation(y,"uvScale");h=b.getUniformLocation(y,"rotation");l=b.getUniformLocation(y,"center");m=b.getUniformLocation(y,"scale");v=b.getUniformLocation(y,"color");n=b.getUniformLocation(y,"map");r=b.getUniformLocation(y,"opacity");q=b.getUniformLocation(y,"modelViewMatrix");t=b.getUniformLocation(y,
+"projectionMatrix");k=b.getUniformLocation(y,"fogType");z=b.getUniformLocation(y,"fogDensity");x=b.getUniformLocation(y,"fogNear");w=b.getUniformLocation(y,"fogFar");H=b.getUniformLocation(y,"fogColor");b.getUniformLocation(y,"fogDepth");C=b.getUniformLocation(y,"alphaTest");S=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");S.width=8;S.height=8;Da=S.getContext("2d");Da.fillStyle="white";Da.fillRect(0,0,8,8);A=new Qb(S)}c.useProgram(y);c.initAttributes();c.enableAttribute(V);c.enableAttribute(Q);
+c.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,Bc);b.vertexAttribPointer(V,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(Q,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,qb);b.uniformMatrix4fv(t,!1,rd.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(n,0);Da=S=0;(ia=p.fog)?(b.uniform3f(H,ia.color.r,ia.color.g,ia.color.b),ia.isFog?(b.uniform1f(x,ia.near),b.uniform1f(w,ia.far),b.uniform1i(k,1),Da=S=1):ia.isFogExp2&&(b.uniform1f(z,
+ia.density),b.uniform1i(k,2),Da=S=2)):(b.uniform1i(k,0),Da=S=0);ia=0;for(var M=u.length;iab||a.height>b){if("data"in
+a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+").");return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function l(a){return P.isPowerOfTwo(a.width)&&
+P.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function v(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,f))*Math.LOG2E}function n(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function r(b){b=b.target;b.removeEventListener("dispose",r);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}b.isVideoTexture&&
+delete H[b.id];g.memory.textures--}function q(b){b=b.target;b.removeEventListener("dispose",q);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);
+d.remove(b.texture);d.remove(b)}g.memory.textures--}function k(b,n){var q=d.get(b);if(b.isVideoTexture){var k=b.id,t=g.render.frame;H[k]!==t&&(H[k]=t,b.update())}if(0p;p++)t[p]=n||k?k?
+b.image[p].image:b.image[p]:h(b.image[p],e.maxCubemapSize);var w=t[0],z=l(w),x=f.convert(b.format),V=f.convert(b.type);u(a.TEXTURE_CUBE_MAP,b,z);for(p=0;6>p;p++)if(n)for(var H,C=t[p].mipmaps,Q=0,y=C.length;Qr;r++)e.__webglFramebuffer[r]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);u(a.TEXTURE_CUBE_MAP,b.texture,n);for(r=0;6>r;r++)p(e.__webglFramebuffer[r],
+b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+r);m(b.texture,n)&&v(a.TEXTURE_CUBE_MAP,b.texture,b.width,b.height);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),u(a.TEXTURE_2D,b.texture,n),p(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,n)&&v(a.TEXTURE_2D,b.texture,b.width,b.height),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");
+if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported");a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=
+!0);k(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),x(e.__webglDepthbuffer[f],
+b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),x(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=l(b);if(m(e,f)){f=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D;var g=d.get(e).__webglTexture;c.bindTexture(f,g);v(f,e,b.width,b.height);c.bindTexture(f,null)}}}function Ze(a,b){return{convert:function(c){if(1E3===c)return a.REPEAT;if(1001===c)return a.CLAMP_TO_EDGE;
+if(1002===c)return a.MIRRORED_REPEAT;if(1003===c)return a.NEAREST;if(1004===c)return a.NEAREST_MIPMAP_NEAREST;if(1005===c)return a.NEAREST_MIPMAP_LINEAR;if(1006===c)return a.LINEAR;if(1007===c)return a.LINEAR_MIPMAP_NEAREST;if(1008===c)return a.LINEAR_MIPMAP_LINEAR;if(1009===c)return a.UNSIGNED_BYTE;if(1017===c)return a.UNSIGNED_SHORT_4_4_4_4;if(1018===c)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===c)return a.UNSIGNED_SHORT_5_6_5;if(1010===c)return a.BYTE;if(1011===c)return a.SHORT;if(1012===c)return a.UNSIGNED_SHORT;
+if(1013===c)return a.INT;if(1014===c)return a.UNSIGNED_INT;if(1015===c)return a.FLOAT;if(1016===c){var d=b.get("OES_texture_half_float");if(null!==d)return d.HALF_FLOAT_OES}if(1021===c)return a.ALPHA;if(1022===c)return a.RGB;if(1023===c)return a.RGBA;if(1024===c)return a.LUMINANCE;if(1025===c)return a.LUMINANCE_ALPHA;if(1026===c)return a.DEPTH_COMPONENT;if(1027===c)return a.DEPTH_STENCIL;if(100===c)return a.FUNC_ADD;if(101===c)return a.FUNC_SUBTRACT;if(102===c)return a.FUNC_REVERSE_SUBTRACT;if(200===
+c)return a.ZERO;if(201===c)return a.ONE;if(202===c)return a.SRC_COLOR;if(203===c)return a.ONE_MINUS_SRC_COLOR;if(204===c)return a.SRC_ALPHA;if(205===c)return a.ONE_MINUS_SRC_ALPHA;if(206===c)return a.DST_ALPHA;if(207===c)return a.ONE_MINUS_DST_ALPHA;if(208===c)return a.DST_COLOR;if(209===c)return a.ONE_MINUS_DST_COLOR;if(210===c)return a.SRC_ALPHA_SATURATE;if(33776===c||33777===c||33778===c||33779===c)if(d=b.get("WEBGL_compressed_texture_s3tc"),null!==d){if(33776===c)return d.COMPRESSED_RGB_S3TC_DXT1_EXT;
+if(33777===c)return d.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===c)return d.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===c)return d.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===c||35841===c||35842===c||35843===c)if(d=b.get("WEBGL_compressed_texture_pvrtc"),null!==d){if(35840===c)return d.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===c)return d.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===c)return d.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===c)return d.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===c&&(d=b.get("WEBGL_compressed_texture_etc1"),
+null!==d))return d.COMPRESSED_RGB_ETC1_WEBGL;if(37808===c||37809===c||37810===c||37811===c||37812===c||37813===c||37814===c||37815===c||37816===c||37817===c||37818===c||37819===c||37820===c||37821===c)if(d=b.get("WEBGL_compressed_texture_astc"),null!==d)return c;if(103===c||104===c)if(d=b.get("EXT_blend_minmax"),null!==d){if(103===c)return d.MIN_EXT;if(104===c)return d.MAX_EXT}return 1020===c&&(d=b.get("WEBGL_depth_texture"),null!==d)?d.UNSIGNED_INT_24_8_WEBGL:0}}}function ea(a,b,c,d){Qa.call(this);
+this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function Ec(a){ea.call(this);this.cameras=a||[]}function $e(a){function b(){return null!==e&&!0===e.isPresenting}function c(){if(b()){var c=e.getEyeParameters("left"),f=c.renderWidth;c=c.renderHeight;z=a.getPixelRatio();u=a.getSize();a.setDrawingBufferSize(2*f,
+c,1);x.start()}else d.enabled&&(a.setDrawingBufferSize(u.width,u.height,z),x.stop())}var d=this,e=null,f=null,g=null,h=new F,l=new F;"undefined"!==typeof window&&"VRFrameData"in window&&(f=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",c,!1));var m=new F,v=new X,n=new p,r=new ea;r.bounds=new U(0,0,.5,1);r.layers.enable(1);var q=new ea;q.bounds=new U(.5,0,.5,1);q.layers.enable(2);var k=new Ec([r,q]);k.layers.enable(1);k.layers.enable(2);var u,z;this.enabled=!1;this.userHeight=
+1.6;this.getDevice=function(){return e};this.setDevice=function(a){void 0!==a&&(e=a);x.setContext(a)};this.setPoseTarget=function(a){void 0!==a&&(g=a)};this.getCamera=function(a){if(null===e)return a;e.depthNear=a.near;e.depthFar=a.far;e.getFrameData(f);var b=e.stageParameters;b?h.fromArray(b.sittingToStandingTransform):h.makeTranslation(0,d.userHeight,0);b=f.pose;var c=null!==g?g:a;c.matrix.copy(h);c.matrix.decompose(c.position,c.quaternion,c.scale);null!==b.orientation&&(v.fromArray(b.orientation),
+c.quaternion.multiply(v));null!==b.position&&(v.setFromRotationMatrix(h),n.fromArray(b.position),n.applyQuaternion(v),c.position.add(n));c.updateMatrixWorld();if(!1===e.isPresenting)return a;r.near=a.near;q.near=a.near;r.far=a.far;q.far=a.far;k.matrixWorld.copy(a.matrixWorld);k.matrixWorldInverse.copy(a.matrixWorldInverse);r.matrixWorldInverse.fromArray(f.leftViewMatrix);q.matrixWorldInverse.fromArray(f.rightViewMatrix);l.getInverse(h);r.matrixWorldInverse.multiply(l);q.matrixWorldInverse.multiply(l);
+a=c.parent;null!==a&&(m.getInverse(a.matrixWorld),r.matrixWorldInverse.multiply(m),q.matrixWorldInverse.multiply(m));r.matrixWorld.getInverse(r.matrixWorldInverse);q.matrixWorld.getInverse(q.matrixWorldInverse);r.projectionMatrix.fromArray(f.leftProjectionMatrix);q.projectionMatrix.fromArray(f.rightProjectionMatrix);k.projectionMatrix.copy(r.projectionMatrix);a=e.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&r.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===
+a.rightBounds.length&&q.bounds.fromArray(a.rightBounds));return k};this.getStandingMatrix=function(){return h};this.isPresenting=b;var x=new Td;this.setAnimationLoop=function(a){x.setAnimationLoop(a)};this.submitFrame=function(){b()&&e.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",c)}}function Lg(a){function b(){return null!==f&&null!==g}function c(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,
+a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var d=a.context,e=null,f=null,g=null,h=null,l=new ea;l.layers.enable(1);l.viewport=new U;var m=new ea;m.layers.enable(2);m.viewport=new U;var v=new Ec([l,m]);v.layers.enable(1);v.layers.enable(2);this.enabled=!1;this.getDevice=function(){return e};this.setDevice=function(a){void 0!==a&&(e=a);d.setCompatibleXRDevice(a)};this.setSession=function(b,c){f=b;null!==f&&(f.addEventListener("end",function(){a.setFramebuffer(null);r.stop()}),f.baseLayer=
+new XRWebGLLayer(f,d),f.requestFrameOfReference(c.frameOfReferenceType).then(function(b){g=b;a.setFramebuffer(f.baseLayer.framebuffer);r.setContext(f);r.start()}))};this.getCamera=function(a){if(b()){var d=a.parent,e=v.cameras;c(v,d);for(var f=0;fa.matrixWorld.determinant();Z.setMaterial(e,h);h=n(c,b.fog,e,a);O="";g(a,h,e)}else A.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(A,b,c,d,e,f);y=pa.get(b,W||c)}function v(a,b,c){var d=Ba.get(a),g=y.state.lights;c=na.getParameters(a,g.state,y.state.shadowsArray,b,X.numPlanes,X.numIntersection,c);var h=na.getProgramCode(a,c),l=d.program,m=!0;if(void 0===l)a.addEventListener("dispose",e);else if(l.code!==h)f(a);else{if(d.lightsHash!==g.state.hash)Ba.update(a,
+"lightsHash",g.state.hash);else if(void 0!==c.shaderID)return;m=!1}m&&(c.shaderID?(l=tb[c.shaderID],d.shader={name:a.type,uniforms:Ca.clone(l.uniforms),vertexShader:l.vertexShader,fragmentShader:l.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader,A),l=na.acquireProgram(a,d.shader,c,h),d.program=l,a.program=l);c=l.getAttributes();if(a.morphTargets)for(h=a.numSupportedMorphTargets=0;he.matrixWorld.determinant();Z.setMaterial(d,g);var h=n(a,b,d,e);a=c.id+"_"+h.id+"_"+(!0===d.wireframe);var l=!1;a!==O&&(O=a,l=!0);e.morphTargetInfluences&&(va.update(e,c,d,h),l=!0);g=c.index;var m=c.attributes.position;b=1;!0===d.wireframe&&(g=sa.getWireframeAttribute(c),b=2);a=wa;if(null!==g){var v=ra.get(g);a=ya;a.setIndex(v)}if(l){if(c&&c.isInstancedBufferGeometry&&null===la.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
+else{Z.initAttributes();l=c.attributes;h=h.getAttributes();var r=d.defaultAttributeValues;for(C in h){var k=h[C];if(0<=k){var q=l[C];if(void 0!==q){var t=q.normalized,u=q.itemSize,p=ra.get(q);if(void 0!==p){var z=p.buffer,w=p.type;p=p.bytesPerElement;if(q.isInterleavedBufferAttribute){var x=q.data,H=x.stride;q=q.offset;x&&x.isInstancedInterleavedBuffer?(Z.enableAttributeAndDivisor(k,x.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=x.meshPerAttribute*x.count)):Z.enableAttribute(k);
+D.bindBuffer(D.ARRAY_BUFFER,z);D.vertexAttribPointer(k,u,w,t,H*p,q*p)}else q.isInstancedBufferAttribute?(Z.enableAttributeAndDivisor(k,q.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=q.meshPerAttribute*q.count)):Z.enableAttribute(k),D.bindBuffer(D.ARRAY_BUFFER,z),D.vertexAttribPointer(k,u,w,t,0,0)}}else if(void 0!==r&&(t=r[C],void 0!==t))switch(t.length){case 2:D.vertexAttrib2fv(k,t);break;case 3:D.vertexAttrib3fv(k,t);break;case 4:D.vertexAttrib4fv(k,t);break;default:D.vertexAttrib1fv(k,
+t)}}}Z.disableUnusedAttributes()}null!==g&&D.bindBuffer(D.ELEMENT_ARRAY_BUFFER,v.buffer)}v=Infinity;null!==g?v=g.count:void 0!==m&&(v=m.count);g=c.drawRange.start*b;m=null!==f?f.start*b:0;var C=Math.max(g,m);f=Math.max(0,Math.min(v,g+c.drawRange.count*b,m+(null!==f?f.count*b:Infinity))-1-C+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)Z.setLineWidth(d.wireframeLinewidth*(null===G?Y:1)),a.setMode(D.LINES);else switch(e.drawMode){case 0:a.setMode(D.TRIANGLES);break;case 1:a.setMode(D.TRIANGLE_STRIP);
+break;case 2:a.setMode(D.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),Z.setLineWidth(d*(null===G?Y:1)),e.isLineSegments?a.setMode(D.LINES):e.isLineLoop?a.setMode(D.LINE_LOOP):a.setMode(D.LINE_STRIP)):e.isPoints&&a.setMode(D.POINTS);c&&c.isInstancedBufferGeometry?0=Ra.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+
+a+" texture units while this GPU supports only "+Ra.maxTextures);ca+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);hb.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);hb.setTexture2D(b,
+c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?hb.setTextureCube(b,c):hb.setTextureCubeDynamic(b,c)}}();this.setFramebuffer=function(a){I=a};this.getRenderTarget=function(){return G};this.setRenderTarget=function(a){(G=a)&&void 0===
+Ba.get(a).__webglFramebuffer&&hb.setupRenderTarget(a);var b=I,c=!1;a?(b=Ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),S.copy(a.viewport),T.copy(a.scissor),aa=a.scissorTest):(S.copy(ba).multiplyScalar(Y),T.copy(N).multiplyScalar(Y),aa=da);K!==b&&(D.bindFramebuffer(D.FRAMEBUFFER,b),K=b);Z.viewport(S);Z.scissor(T);Z.setScissorTest(aa);c&&(c=Ba.get(a.texture),D.framebufferTexture2D(D.FRAMEBUFFER,D.COLOR_ATTACHMENT0,D.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,
+c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=Ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==K&&(D.bindFramebuffer(D.FRAMEBUFFER,g),h=!0);try{var l=a.texture,m=l.format,n=l.type;1023!==m&&ha.convert(m)!==D.getParameter(D.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||ha.convert(n)===D.getParameter(D.IMPLEMENTATION_COLOR_READ_TYPE)||
+1015===n&&(la.get("OES_texture_float")||la.get("WEBGL_color_buffer_float"))||1016===n&&la.get("EXT_color_buffer_half_float")?D.checkFramebufferStatus(D.FRAMEBUFFER)===D.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&D.readPixels(b,c,d,e,ha.convert(m),ha.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&
+D.bindFramebuffer(D.FRAMEBUFFER,K)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=ha.convert(b.format);this.setTexture2D(b,0);D.copyTexImage2D(D.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=ha.convert(c.format),h=ha.convert(c.type);this.setTexture2D(c,0);b.isDataTexture?D.texSubImage2D(D.TEXTURE_2D,
+d||0,a.x,a.y,e,f,g,h,b.image.data):D.texSubImage2D(D.TEXTURE_2D,d||0,a.x,a.y,g,h,b.image)}}function Sb(a,b){this.name="";this.color=new K(a);this.density=void 0!==b?b:2.5E-4}function Tb(a,b,c){this.name="";this.color=new K(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function sd(){B.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function ib(a){L.call(this);this.type="SpriteMaterial";this.color=new K(16777215);this.map=null;this.rotation=
+0;this.lights=this.fog=!1;this.setValues(a)}function Fc(a){B.call(this);this.type="Sprite";this.material=void 0!==a?a:new ib;this.center=new y(.5,.5)}function Gc(){B.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Hc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),
+this.boneInverses=[],a=0,b=this.bones.length;ac;c++){var n=v[h[c]];var r=v[h[(c+1)%3]];f[0]=Math.min(n,r);f[1]=Math.max(n,r);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m=g[n],h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){l=a.attributes.position;v=a.index;var k=a.groups;0===k.length&&(k=[{start:0,count:v.count,materialIndex:0}]);
+a=0;for(e=k.length;ac;c++)n=v.getX(m+c),r=v.getX(m+(c+1)%3),f[0]=Math.min(n,r),f[1]=Math.max(n,r),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n],h.fromBufferAttribute(l,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(l,m.index2),b.push(h.x,h.y,h.z)}else for(l=a.attributes.position,m=0,d=l.count/3;mc;c++)g=3*m+c,h.fromBufferAttribute(l,g),b.push(h.x,h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(l,
+g),b.push(h.x,h.y,h.z);this.addAttribute("position",new A(b,3))}function Jc(a,b,c){J.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Xb(a,b,c));this.mergeVertices()}function Xb(a,b,c){G.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,l=new p,m=new p,v=new p,n=new p,r,k;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");
+var t=b+1;for(r=0;r<=c;r++){var u=r/c;for(k=0;k<=b;k++){var z=k/b;a(z,u,l);e.push(l.x,l.y,l.z);0<=z-1E-5?(a(z-1E-5,u,m),v.subVectors(l,m)):(a(z+1E-5,u,m),v.subVectors(m,l));0<=u-1E-5?(a(z,u-1E-5,m),n.subVectors(l,m)):(a(z,u+1E-5,m),n.subVectors(m,l));h.crossVectors(v,n).normalize();f.push(h.x,h.y,h.z);g.push(z,u)}}for(r=0;rd&&1===a.x&&(l[b]=a.x-1);0===c.x&&0===c.z&&(l[b]=d/2/Math.PI+.5)}G.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,
+indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],l=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;he&&(.2>b&&(l[a+0]+=1),.2>c&&(l[a+2]+=1),.2>d&&(l[a+4]+=1))})();this.addAttribute("position",new A(h,3));this.addAttribute("normal",new A(h.slice(),3));this.addAttribute("uv",new A(l,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Lc(a,
+b){J.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Yb(a,b));this.mergeVertices()}function Yb(a,b){va.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Mc(a,b){J.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new ub(a,b));this.mergeVertices()}function ub(a,b){va.call(this,[1,0,0,
+-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Nc(a,b){J.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Zb(a,b));this.mergeVertices()}function Zb(a,b){var c=(1+Math.sqrt(5))/2;va.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,
+11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Oc(a,b){J.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new $b(a,b));this.mergeVertices()}function $b(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;va.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,
+0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Pc(a,b,c,d,e,f){J.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,
+closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new ac(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function ac(a,b,c,d,e){function f(e){v=a.getPointAt(e/b,v);var f=g.normals[e];e=g.binormals[e];for(k=0;k<=d;k++){var m=k/d*Math.PI*2,n=Math.sin(m);m=-Math.cos(m);l.x=m*f.x+n*e.x;l.y=m*f.y+n*e.y;l.z=m*f.z+n*e.z;l.normalize();t.push(l.x,l.y,l.z);h.x=v.x+c*l.x;h.y=v.y+c*l.y;h.z=
+v.z+c*l.z;q.push(h.x,h.y,h.z)}}G.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,l=new p,m=new y,v=new p,n,k,q=[],t=[],u=[],z=[];for(n=0;n=b;e-=d)f=bf(e,a[e],a[e+1],f);f&&vb(f,f.next)&&(Sc(f),f=f.next);return f}function Tc(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!vb(a,a.next)&&0!==na(a.prev,a,a.next))a=a.next;else{Sc(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
+function Uc(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=ae(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,v,n,k,q=1;do{l=h;var t=h=null;for(v=0;l;){v++;var p=l;for(m=n=0;mn.x?v.x>q.x?v.x:q.x:n.x>q.x?n.x:q.x,H=v.y>n.y?v.y>q.y?v.y:q.y:n.y>q.y?n.y:q.y;m=ae(v.x=m;){if(z!==t.prev&&z!==t.next&&xd(v.x,v.y,n.x,n.y,q.x,q.y,z.x,z.y)&&0<=na(z.prev,z,z.next)){t=!1;break a}z=
+z.prevZ}t=!0}}else a:if(t=a,v=t.prev,n=t,q=t.next,0<=na(v,n,q))t=!1;else{for(m=t.next.next;m!==t.prev;){if(xd(v.x,v.y,n.x,n.y,q.x,q.y,m.x,m.y)&&0<=na(m.prev,m,m.next)){t=!1;break a}m=m.next}t=!0}if(t)b.push(l.i/c),b.push(a.i/c),b.push(p.i/c),Sc(a),h=a=p.next;else if(a=p,a===h){if(!g)Uc(Tc(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;l=a;do p=l.prev,t=l.next.next,!vb(p,t)&&cf(p,l,l.next,t)&&Vc(p,t)&&Vc(t,p)&&(g.push(p.i/h),g.push(l.i/h),g.push(t.i/h),Sc(l),Sc(l.next),l=a=t),l=l.next;while(l!==a);a=l;Uc(a,
+b,c,d,e,f,2)}else if(2===g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;p=h;if(t=l.next.i!==p.i&&l.prev.i!==p.i){b:{t=l;do{if(t.i!==l.i&&t.next.i!==l.i&&t.i!==p.i&&t.next.i!==p.i&&cf(t,t.next,l,p)){t=!0;break b}t=t.next}while(t!==l);t=!1}t=!t}if(t=t&&Vc(l,p)&&Vc(p,l)){t=l;v=!1;n=(l.x+p.x)/2;p=(l.y+p.y)/2;do t.y>p!==t.next.y>p&&t.next.y!==t.y&&n<(t.next.x-t.x)*(p-t.y)/(t.next.y-t.y)+t.x&&(v=!v),t=t.next;while(t!==l);t=v}l=t}if(l){a=df(g,h);g=Tc(g,g.next);a=Tc(a,a.next);Uc(g,b,c,d,e,
+f);Uc(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ng(a,b){return a.x-b.x}function Og(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x=c.x&&c.x>=g&&d!==c.x&&xd(eh.x)&&Vc(c,a)&&(h=c,m=v)}c=c.next}return h}function ae(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function Pg(a){var b=a,c=a;do b.xna(a.prev,a,a.next)?0<=na(a,b,a.next)&&0<=na(a,a.prev,b):0>na(a,b,a.prev)||0>na(a,a.next,b)}function df(a,b){var c=new be(a.i,a.x,a.y),d=new be(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=
+c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function bf(a,b,c,d){a=new be(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Sc(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function be(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function ef(a){var b=a.length;2Number.EPSILON){var l=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/l;b=b.y+d/l;
+g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new y(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new y(f/e,d/e)}function h(a,b){for(N=a.length;0<=--N;){var c=N;var f=N-1;0>f&&(f=a.length-1);var g,h=w+2*E;for(g=0;gk;k++){var n=m[f[k]];var r=m[f[(k+1)%3]];d[0]=Math.min(n,r);d[1]=Math.max(n,r);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],
+c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute("position",new A(c,3))}function Ab(a,b,c,d,e,f,g,h){J.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new $a(a,b,c,d,e,f,g,h));this.mergeVertices()}function $a(a,b,c,d,e,f,g,h){function l(c){var e,f=new y,l=new p,v=0,u=!0===c?a:b,w=!0===c?1:-1;var A=t;for(e=1;e<=d;e++)n.push(0,z*w,0),r.push(0,
+w,0),q.push(.5,.5),t++;var B=t;for(e=0;e<=d;e++){var F=e/d*h+g,G=Math.cos(F);F=Math.sin(F);l.x=u*F;l.y=z*w;l.z=u*G;n.push(l.x,l.y,l.z);r.push(0,w,0);f.x=.5*G+.5;f.y=.5*F*w+.5;q.push(f.x,f.y);t++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Nd(a){this.manager=void 0!==a?a:wa;this.textures={}}function ge(a){this.manager=void 0!==a?a:wa}function mc(){}function he(a){"boolean"===
+typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:wa;this.withCredentials=!1}function lf(a){this.manager=void 0!==a?a:wa;this.texturePath=""}function ie(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");this.manager=void 0!==a?a:wa;this.options=void 0}function je(){this.type=
+"ShapePath";this.color=new K;this.subPaths=[];this.currentPath=null}function ke(a){this.type="Font";this.data=a}function mf(a){this.manager=void 0!==a?a:wa}function le(a){this.manager=void 0!==a?a:wa}function nf(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new ea;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new ea;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function hd(a,b,c){B.call(this);this.type="CubeCamera";var d=new ea(90,
+1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new ea(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new ea(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new ea(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new ea(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var l=new ea(90,1,a,b);l.up.set(0,-1,0);l.lookAt(new p(0,0,-1));this.add(l);this.renderTarget=new Lb(c,c,{format:1022,magFilter:1006,minFilter:1006});
+this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,m=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=m;c.activeCubeFace=5;a.render(b,l,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,
+f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function me(){B.call(this);this.type="AudioListener";this.context=ne.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function nc(a){B.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=
+1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function oe(a){nc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function pe(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function qe(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=
+Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function of(a,b,c){c=c||oa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function oa(a,b,c){this.path=b;this.parsedPath=c||oa.parseTrackName(b);this.node=oa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function pf(){this.uuid=P.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=
+0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function qf(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},
+e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=
+!0}function re(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Od(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function se(){G.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function te(a,b,c,d){this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function oc(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange=
+{offset:0,count:-1};this.version=0}function ue(a,b,c){oc.call(this,a,b);this.meshPerAttribute=c||1}function ve(a,b,c){O.call(this,a,b);this.meshPerAttribute=c||1}function rf(a,b,c,d){this.ray=new sb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function sf(a,b){return a.distance-
+b.distance}function we(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new A(b,3));b=new T({fog:!1});this.cone=new aa(a,b);this.add(this.cone);this.update()}function wf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca?-1:0b;b++)a[b]=(16>b?"0":"")+b.toString(16);return function(){var b=4294967295*Math.random()|0,d=4294967295*Math.random()|0,e=4294967295*Math.random()|0,f=4294967295*Math.random()|0;return(a[b&255]+a[b>>8&255]+a[b>>16&255]+a[b>>24&255]+"-"+a[d&255]+a[d>>8&255]+"-"+a[d>>
+16&15|64]+a[d>>24&255]+"-"+a[e&63|128]+a[e>>8&255]+"-"+a[e>>16&255]+a[e>>24&255]+a[f&255]+a[f>>8&255]+a[f>>16&255]+a[f>>24&255]).toUpperCase()}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;
+a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*P.DEG2RAD},radToDeg:function(a){return a*P.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/
+Math.LN2))}};Object.defineProperties(y.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(y.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+
+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},
+addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=
+a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,
+b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new y,b=new y;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=
+Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||
+1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,
+a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=
+this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(F.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,n,r,q,t,p){var v=this.elements;v[0]=a;v[4]=b;v[8]=c;v[12]=d;v[1]=e;v[5]=f;v[9]=g;v[13]=h;v[2]=l;v[6]=m;v[10]=k;v[14]=n;v[3]=r;v[7]=q;v[11]=t;v[15]=p;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new F).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=
+a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,
+1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[3]=0;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[7]=0;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
+var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=
+k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(){var a=
+new p(0,0,0),b=new p(1,1,1);return function(c){return this.compose(a,c,b)}}(),lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==
+b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],n=c[2],r=c[6],q=c[10],t=c[14],p=c[3],z=c[7],x=c[11];c=c[15];var w=d[0],y=d[4],C=d[8],A=d[12],Q=d[1],E=d[5],F=d[9],B=d[13],G=d[2],
+I=d[6],K=d[10],J=d[14],L=d[3],M=d[7],O=d[11];d=d[15];b[0]=a*w+e*Q+f*G+g*L;b[4]=a*y+e*E+f*I+g*M;b[8]=a*C+e*F+f*K+g*O;b[12]=a*A+e*B+f*J+g*d;b[1]=h*w+l*Q+m*G+k*L;b[5]=h*y+l*E+m*I+k*M;b[9]=h*C+l*F+m*K+k*O;b[13]=h*A+l*B+m*J+k*d;b[2]=n*w+r*Q+q*G+t*L;b[6]=n*y+r*E+q*I+t*M;b[10]=n*C+r*F+q*K+t*O;b[14]=n*A+r*B+q*J+t*d;b[3]=p*w+z*Q+x*G+c*L;b[7]=p*y+z*E+x*I+c*M;b[11]=p*C+z*F+x*K+c*O;b[15]=p*A+z*B+x*J+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=
+a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;f=1/h;var m=1/l;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);
+e.x=g;e.y=h;e.z=l;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),l=1/(c-d),m=1/(f-e);g[0]=
+2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];
+a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(X,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==n){f=1-g;var r=h*d+l*k+m*n+c*e,q=0<=r?1:-1,p=1-r*r;p>Number.EPSILON&&(p=Math.sqrt(p),r=Math.atan2(p,r*q),f=Math.sin(f*r)/p,g=Math.sin(g*
+r)/p);q*=g;h=h*f+d*q;l=l*f+k*q;m=m*f+n*q;c=c*f+e*q;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=m;a[b+3]=c}});Object.defineProperties(X.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=
+a;this.onChangeCallback()}}});Object.assign(X.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,
+d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"YXZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"ZXY"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"ZYX"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"YZX"===a?(this._x=c*l*f+h*d*
+e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f-c*d*e):"XZY"===a&&(this._x=c*l*f-h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>
+Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+
+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,
+this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=
+d,this._z=e,this;a=Math.sqrt(1-g*g);if(.001>Math.abs(a))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+
+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=
+a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},
+add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
+this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=
+a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new X;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new X;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;
+a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*
+-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(){var a=new F;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new F;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+
+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,
+this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},
+round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},
+length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!==
+b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=
+new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(P.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*
+a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=
+c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");
+this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ta.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=
+a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cc;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];
+return a}});var Df=0;ca.DEFAULT_IMAGE=void 0;ca.DEFAULT_MAPPING=300;ca.prototype=Object.assign(Object.create(ha.prototype),{constructor:ca,isTexture:!0,updateMatrix:function(){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(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;
+this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===
+a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={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,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==
+this.image){var d=this.image;void 0===d.uuid&&(d.uuid=P.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d;else{h=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");h.width=d.width;h.height=d.height;var l=h.getContext("2d");d instanceof ImageData?l.putImageData(d,0,0):l.drawImage(d,0,0,d.width,d.height)}h=2048a.x||1a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%
+2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.defineProperty(ca.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(U.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,
+b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,
+b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(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},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==
+b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(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},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,
+e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=
+a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var l=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-l)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+l)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+l)/4;b>f&&b>m?.01>b?(l=0,c=h=.707106781):(l=Math.sqrt(b),h=c/l,c=d/l):f>m?.01>f?(l=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),l=c/h,c=g/h):.01>m?(h=l=.707106781,c=0):(c=Math.sqrt(m),l=d/c,h=g/c);this.set(l,
+h,c,a);return this}a=Math.sqrt((l-g)*(l-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(l-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,
+Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new U,b=new U);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){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},ceil:function(){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},round:function(){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},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):
+Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||
+1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=
+[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});kb.prototype=Object.assign(Object.create(ha.prototype),{constructor:kb,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,
+0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Lb.prototype=Object.create(kb.prototype);Lb.prototype.constructor=Lb;Lb.prototype.isWebGLRenderTargetCube=!0;lb.prototype=
+Object.create(ca.prototype);lb.prototype.constructor=lb;lb.prototype.isDataTexture=!0;Object.assign(Wa.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.length;he&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=
+Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.count;he&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y||
+a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box3: .getParameter() target is now required"),b=new p);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0=a.constant},intersectsTriangle:function(){function a(a){var e;var f=0;for(e=a.length-3;f<=e;f+=3){h.fromArray(a,f);var g=m.x*Math.abs(h.x)+m.y*Math.abs(h.y)+m.z*Math.abs(h.z),l=b.dot(h),k=c.dot(h),n=d.dot(h);if(Math.max(-Math.max(l,k,n),Math.min(l,k,n))>g)return!1}return!0}var b=new p,c=new p,d=new p,e=new p,f=new p,g=new p,h=new p,l=
+new p,m=new p,k=new p;return function(h){if(this.isEmpty())return!1;this.getCenter(l);m.subVectors(this.max,l);b.subVectors(h.a,l);c.subVectors(h.b,l);d.subVectors(h.c,l);e.subVectors(c,b);f.subVectors(d,c);g.subVectors(b,d);h=[0,-e.z,e.y,0,-f.z,f.y,0,-g.z,g.y,e.z,0,-e.x,f.z,0,-f.x,g.z,0,-g.x,-e.y,e.x,0,-f.y,f.x,0,-g.y,g.x,0];if(!a(h))return!1;h=[1,0,0,0,1,0,0,0,1];if(!a(h))return!1;k.crossVectors(e,f);h=[k.x,k.y,k.z];return a(h)}}(),clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),
+b=new p);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){void 0===b&&(console.warn("THREE.Box3: .getBoundingSphere() target is now required"),b=new Ga);this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},
+union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(a){if(this.isEmpty())return this;a=a.elements;var b=a[0]*this.min.x,c=a[1]*this.min.x,d=a[2]*this.min.x,e=a[0]*this.max.x,f=a[1]*this.max.x,g=a[2]*this.max.x,h=a[4]*this.min.y,l=a[5]*this.min.y,m=a[6]*this.min.y,k=a[4]*this.max.y,n=a[5]*this.max.y,r=a[6]*this.max.y,q=a[8]*this.min.z,p=a[9]*this.min.z,u=a[10]*this.min.z,z=a[8]*this.max.z,x=a[9]*this.max.z,w=a[10]*this.max.z;this.min.x=Math.min(b,e)+Math.min(h,
+k)+Math.min(q,z)+a[12];this.min.y=Math.min(c,f)+Math.min(l,n)+Math.min(p,x)+a[13];this.min.z=Math.min(d,g)+Math.min(m,r)+Math.min(u,w)+a[14];this.max.x=Math.max(b,e)+Math.max(h,k)+Math.max(q,z)+a[12];this.max.y=Math.max(c,f)+Math.max(l,n)+Math.max(p,x)+a[13];this.max.z=Math.max(d,g)+Math.max(m,r)+Math.max(u,w)+a[14];return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Ga.prototype,
+{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Wa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=c=0,f=b.length;e=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=
+this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),
+b=new p);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new Wa);a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&
+a.radius===this.radius}});Object.assign(Ha.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),
+clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){void 0===
+b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new p);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new p;return function(b,c){void 0===c&&(console.warn("THREE.Plane: .intersectLine() target is now required"),c=new p);var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1b&&0a&&0c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],r=c[10],q=c[11],p=c[12],u=c[13],z=c[14];c=c[15];b[0].setComponents(f-a,m-g,q-k,c-p).normalize();b[1].setComponents(f+a,m+g,q+k,c+p).normalize();b[2].setComponents(f+d,m+h,q+n,c+u).normalize();b[3].setComponents(f-d,m-h,q-n,c-u).normalize();b[4].setComponents(f-e,m-l,q-r,c-z).normalize();b[5].setComponents(f+e,
+m+l,q+r,c+z).normalize();return this},intersectsObject:function(){var a=new Ga;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Ga;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=
+0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>
+c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var W={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",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( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",
+aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\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}\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 GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, 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_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 GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\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\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\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",
+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\n",
+clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n",
+clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",
+color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(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}\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};\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}\n",
+cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",
+defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",
+emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",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.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\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.w );\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.w );\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.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, 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.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.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 = value.rgb * cLogLuvM;\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 = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n",
+envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, 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_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\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\n",
+envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",
+envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\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\n",
+fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\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\n",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\n",
+gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",
+lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\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#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\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#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\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#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",
+lights_pars_begin:"uniform vec3 ambientLightColor;\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\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\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\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\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\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\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\n",
+lights_pars_maps:"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\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\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 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 blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, 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\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",
+lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\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)\n",
+lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",
+lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#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#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\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 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\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\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\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}\n",
+lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\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#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n",
+lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * 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( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n",
+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, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",
+logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",
+map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",
+metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",
+morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",
+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#endif\n",normal_fragment_maps:"#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
+normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\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\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy *= normalScale;\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",
+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}\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}\n",
+premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( 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\n",
+roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\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\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( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, 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( 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 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\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\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\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 )\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\n",
+shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",
+shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",
+shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",
+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",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform 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\n",
+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\n",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#endif\n",
+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",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\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}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\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}\n",
+uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n",
+uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
+uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
+cube_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n",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 \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\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",
+depth_vert:"#include \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}\n",
+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}\n",
+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}\n",
+equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n",
+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}\n",
+linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n",
+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 \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\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * 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}\n",
+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}\n",
+meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\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 \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\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\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}\n",
+meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\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 \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 \n\t#include \n\t#include