diff --git a/dist/aframe.js b/dist/aframe.js index 4ca21684fa3..d6c936b8495 100644 --- a/dist/aframe.js +++ b/dist/aframe.js @@ -56814,7 +56814,7 @@ module.exports = WebVRPolyfill; },{}],20:[function(_dereq_,module,exports){ module.exports={ "name": "aframe", - "version": "0.3.0", + "version": "0.3.1", "description": "Building blocks for the VR Web", "homepage": "https://aframe.io/", "main": "dist/aframe.js", @@ -56846,12 +56846,13 @@ module.exports={ "repository": "aframevr/aframe", "license": "MIT", "dependencies": { + "browserify-css": "^0.8.2", "debug": "^2.2.0", "deep-assign": "^2.0.0", "document-register-element": "dmarcos/document-register-element#8ccc532b7", - "promise-polyfill": "^3.1.0", "object-assign": "^4.0.1", "present": "0.0.6", + "promise-polyfill": "^3.1.0", "style-attr": "^1.0.2", "three": "^0.76.1", "tween.js": "^15.0.0", @@ -56859,7 +56860,6 @@ module.exports={ }, "devDependencies": { "browserify": "^13.1.0", - "browserify-css": "^0.8.2", "browserify-derequire": "^0.9.4", "browserify-istanbul": "^2.0.0", "budo": "^8.1.0", diff --git a/dist/aframe.js.map b/dist/aframe.js.map index 57ce6121edd..7c9b0477603 100644 --- a/dist/aframe.js.map +++ b/dist/aframe.js.map @@ -157,7 +157,7 @@ "var self = self || {};// File:src/Three.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nvar THREE = { REVISION: '76' };\r\n\r\n//\r\n\r\nif ( typeof define === 'function' && define.amd ) {\r\n\r\n\tdefine( 'three', THREE );\r\n\r\n} else if ( 'undefined' !== typeof exports && 'undefined' !== typeof module ) {\r\n\r\n\tmodule.exports = THREE;\r\n\r\n}\r\n\r\n//\r\n\r\nif ( Number.EPSILON === undefined ) {\r\n\r\n\tNumber.EPSILON = Math.pow( 2, - 52 );\r\n\r\n}\r\n\r\n//\r\n\r\nif ( Math.sign === undefined ) {\r\n\r\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\r\n\r\n\tMath.sign = function ( x ) {\r\n\r\n\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\r\n\r\n\t};\r\n\r\n}\r\n\r\nif ( Function.prototype.name === undefined && Object.defineProperty !== undefined ) {\r\n\r\n\t// Missing in IE9-11.\r\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\r\n\r\n\tObject.defineProperty( Function.prototype, 'name', {\r\n\r\n\t\tget: function () {\r\n\r\n\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\r\n\r\n\t\t}\r\n\r\n\t} );\r\n\r\n}\r\n\r\nif ( Object.assign === undefined ) {\r\n\r\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\r\n\r\n\tObject.defineProperty( Object, 'assign', {\r\n\r\n\t\twritable: true,\r\n\t\tconfigurable: true,\r\n\r\n\t\tvalue: function ( target ) {\r\n\r\n\t\t\t'use strict';\r\n\r\n\t\t\tif ( target === undefined || target === null ) {\r\n\r\n\t\t\t\tthrow new TypeError( \"Cannot convert first argument to object\" );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar to = Object( target );\r\n\r\n\t\t\tfor ( var i = 1, n = arguments.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar nextSource = arguments[ i ];\r\n\r\n\t\t\t\tif ( nextSource === undefined || nextSource === null ) continue;\r\n\r\n\t\t\t\tnextSource = Object( nextSource );\r\n\r\n\t\t\t\tvar keysArray = Object.keys( nextSource );\r\n\r\n\t\t\t\tfor ( var nextIndex = 0, len = keysArray.length; nextIndex !== len; ++ nextIndex ) {\r\n\r\n\t\t\t\t\tvar nextKey = keysArray[ nextIndex ];\r\n\t\t\t\t\tvar desc = Object.getOwnPropertyDescriptor( nextSource, nextKey );\r\n\r\n\t\t\t\t\tif ( desc !== undefined && desc.enumerable ) {\r\n\r\n\t\t\t\t\t\tto[ nextKey ] = nextSource[ nextKey ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn to;\r\n\r\n\t\t}\r\n\r\n\t} );\r\n\r\n}\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent.button\r\n\r\nTHREE.MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\r\n\r\n// GL STATE CONSTANTS\r\n\r\nTHREE.CullFaceNone = 0;\r\nTHREE.CullFaceBack = 1;\r\nTHREE.CullFaceFront = 2;\r\nTHREE.CullFaceFrontBack = 3;\r\n\r\nTHREE.FrontFaceDirectionCW = 0;\r\nTHREE.FrontFaceDirectionCCW = 1;\r\n\r\n// SHADOWING TYPES\r\n\r\nTHREE.BasicShadowMap = 0;\r\nTHREE.PCFShadowMap = 1;\r\nTHREE.PCFSoftShadowMap = 2;\r\n\r\n// MATERIAL CONSTANTS\r\n\r\n// side\r\n\r\nTHREE.FrontSide = 0;\r\nTHREE.BackSide = 1;\r\nTHREE.DoubleSide = 2;\r\n\r\n// shading\r\n\r\nTHREE.FlatShading = 1;\r\nTHREE.SmoothShading = 2;\r\n\r\n// colors\r\n\r\nTHREE.NoColors = 0;\r\nTHREE.FaceColors = 1;\r\nTHREE.VertexColors = 2;\r\n\r\n// blending modes\r\n\r\nTHREE.NoBlending = 0;\r\nTHREE.NormalBlending = 1;\r\nTHREE.AdditiveBlending = 2;\r\nTHREE.SubtractiveBlending = 3;\r\nTHREE.MultiplyBlending = 4;\r\nTHREE.CustomBlending = 5;\r\n\r\n// custom blending equations\r\n// (numbers start from 100 not to clash with other\r\n// mappings to OpenGL constants defined in Texture.js)\r\n\r\nTHREE.AddEquation = 100;\r\nTHREE.SubtractEquation = 101;\r\nTHREE.ReverseSubtractEquation = 102;\r\nTHREE.MinEquation = 103;\r\nTHREE.MaxEquation = 104;\r\n\r\n// custom blending destination factors\r\n\r\nTHREE.ZeroFactor = 200;\r\nTHREE.OneFactor = 201;\r\nTHREE.SrcColorFactor = 202;\r\nTHREE.OneMinusSrcColorFactor = 203;\r\nTHREE.SrcAlphaFactor = 204;\r\nTHREE.OneMinusSrcAlphaFactor = 205;\r\nTHREE.DstAlphaFactor = 206;\r\nTHREE.OneMinusDstAlphaFactor = 207;\r\n\r\n// custom blending source factors\r\n\r\n//THREE.ZeroFactor = 200;\r\n//THREE.OneFactor = 201;\r\n//THREE.SrcAlphaFactor = 204;\r\n//THREE.OneMinusSrcAlphaFactor = 205;\r\n//THREE.DstAlphaFactor = 206;\r\n//THREE.OneMinusDstAlphaFactor = 207;\r\nTHREE.DstColorFactor = 208;\r\nTHREE.OneMinusDstColorFactor = 209;\r\nTHREE.SrcAlphaSaturateFactor = 210;\r\n\r\n// depth modes\r\n\r\nTHREE.NeverDepth = 0;\r\nTHREE.AlwaysDepth = 1;\r\nTHREE.LessDepth = 2;\r\nTHREE.LessEqualDepth = 3;\r\nTHREE.EqualDepth = 4;\r\nTHREE.GreaterEqualDepth = 5;\r\nTHREE.GreaterDepth = 6;\r\nTHREE.NotEqualDepth = 7;\r\n\r\n\r\n// TEXTURE CONSTANTS\r\n\r\nTHREE.MultiplyOperation = 0;\r\nTHREE.MixOperation = 1;\r\nTHREE.AddOperation = 2;\r\n\r\n// Tone Mapping modes\r\n\r\nTHREE.NoToneMapping = 0; // do not do any tone mapping, not even exposure (required for special purpose passes.)\r\nTHREE.LinearToneMapping = 1; // only apply exposure.\r\nTHREE.ReinhardToneMapping = 2;\r\nTHREE.Uncharted2ToneMapping = 3; // John Hable\r\nTHREE.CineonToneMapping = 4; // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson\r\n\r\n// Mapping modes\r\n\r\nTHREE.UVMapping = 300;\r\n\r\nTHREE.CubeReflectionMapping = 301;\r\nTHREE.CubeRefractionMapping = 302;\r\n\r\nTHREE.EquirectangularReflectionMapping = 303;\r\nTHREE.EquirectangularRefractionMapping = 304;\r\n\r\nTHREE.SphericalReflectionMapping = 305;\r\nTHREE.CubeUVReflectionMapping = 306;\r\nTHREE.CubeUVRefractionMapping = 307;\r\n\r\n// Wrapping modes\r\n\r\nTHREE.RepeatWrapping = 1000;\r\nTHREE.ClampToEdgeWrapping = 1001;\r\nTHREE.MirroredRepeatWrapping = 1002;\r\n\r\n// Filters\r\n\r\nTHREE.NearestFilter = 1003;\r\nTHREE.NearestMipMapNearestFilter = 1004;\r\nTHREE.NearestMipMapLinearFilter = 1005;\r\nTHREE.LinearFilter = 1006;\r\nTHREE.LinearMipMapNearestFilter = 1007;\r\nTHREE.LinearMipMapLinearFilter = 1008;\r\n\r\n// Data types\r\n\r\nTHREE.UnsignedByteType = 1009;\r\nTHREE.ByteType = 1010;\r\nTHREE.ShortType = 1011;\r\nTHREE.UnsignedShortType = 1012;\r\nTHREE.IntType = 1013;\r\nTHREE.UnsignedIntType = 1014;\r\nTHREE.FloatType = 1015;\r\nTHREE.HalfFloatType = 1025;\r\n\r\n// Pixel types\r\n\r\n//THREE.UnsignedByteType = 1009;\r\nTHREE.UnsignedShort4444Type = 1016;\r\nTHREE.UnsignedShort5551Type = 1017;\r\nTHREE.UnsignedShort565Type = 1018;\r\n\r\n// Pixel formats\r\n\r\nTHREE.AlphaFormat = 1019;\r\nTHREE.RGBFormat = 1020;\r\nTHREE.RGBAFormat = 1021;\r\nTHREE.LuminanceFormat = 1022;\r\nTHREE.LuminanceAlphaFormat = 1023;\r\n// THREE.RGBEFormat handled as THREE.RGBAFormat in shaders\r\nTHREE.RGBEFormat = THREE.RGBAFormat; //1024;\r\nTHREE.DepthFormat = 1026;\r\n\r\n// DDS / ST3C Compressed texture formats\r\n\r\nTHREE.RGB_S3TC_DXT1_Format = 2001;\r\nTHREE.RGBA_S3TC_DXT1_Format = 2002;\r\nTHREE.RGBA_S3TC_DXT3_Format = 2003;\r\nTHREE.RGBA_S3TC_DXT5_Format = 2004;\r\n\r\n\r\n// PVRTC compressed texture formats\r\n\r\nTHREE.RGB_PVRTC_4BPPV1_Format = 2100;\r\nTHREE.RGB_PVRTC_2BPPV1_Format = 2101;\r\nTHREE.RGBA_PVRTC_4BPPV1_Format = 2102;\r\nTHREE.RGBA_PVRTC_2BPPV1_Format = 2103;\r\n\r\n// ETC compressed texture formats\r\n\r\nTHREE.RGB_ETC1_Format = 2151;\r\n\r\n// Loop styles for AnimationAction\r\n\r\nTHREE.LoopOnce = 2200;\r\nTHREE.LoopRepeat = 2201;\r\nTHREE.LoopPingPong = 2202;\r\n\r\n// Interpolation\r\n\r\nTHREE.InterpolateDiscrete = 2300;\r\nTHREE.InterpolateLinear = 2301;\r\nTHREE.InterpolateSmooth = 2302;\r\n\r\n// Interpolant ending modes\r\n\r\nTHREE.ZeroCurvatureEnding = 2400;\r\nTHREE.ZeroSlopeEnding = 2401;\r\nTHREE.WrapAroundEnding = 2402;\r\n\r\n// Triangle Draw modes\r\n\r\nTHREE.TrianglesDrawMode = 0;\r\nTHREE.TriangleStripDrawMode = 1;\r\nTHREE.TriangleFanDrawMode = 2;\r\n\r\n// Texture Encodings\r\n\r\nTHREE.LinearEncoding = 3000; // No encoding at all.\r\nTHREE.sRGBEncoding = 3001;\r\nTHREE.GammaEncoding = 3007; // uses GAMMA_FACTOR, for backwards compatibility with WebGLRenderer.gammaInput/gammaOutput\r\n\r\n// The following Texture Encodings are for RGB-only (no alpha) HDR light emission sources.\r\n// These encodings should not specified as output encodings except in rare situations.\r\nTHREE.RGBEEncoding = 3002; // AKA Radiance.\r\nTHREE.LogLuvEncoding = 3003;\r\nTHREE.RGBM7Encoding = 3004;\r\nTHREE.RGBM16Encoding = 3005;\r\nTHREE.RGBDEncoding = 3006; // MaxRange is 256.\r\n\r\n// Depth packing strategies\r\n\r\nTHREE.BasicDepthPacking = 3200; // for writing to float textures for high precision or for visualizing results in RGB buffers\r\nTHREE.RGBADepthPacking = 3201; // for packing into RGBA buffers.\r\n\r\n// File:src/math/Color.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Color = function ( color ) {\r\n\r\n\tif ( arguments.length === 3 ) {\r\n\r\n\t\treturn this.fromArray( arguments );\r\n\r\n\t}\r\n\r\n\treturn this.set( color );\r\n\r\n};\r\n\r\nTHREE.Color.prototype = {\r\n\r\n\tconstructor: THREE.Color,\r\n\r\n\tr: 1, g: 1, b: 1,\r\n\r\n\tset: function ( value ) {\r\n\r\n\t\tif ( value instanceof THREE.Color ) {\r\n\r\n\t\t\tthis.copy( value );\r\n\r\n\t\t} else if ( typeof value === 'number' ) {\r\n\r\n\t\t\tthis.setHex( value );\r\n\r\n\t\t} else if ( typeof value === 'string' ) {\r\n\r\n\t\t\tthis.setStyle( value );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetScalar: function ( scalar ) {\r\n\r\n\t\tthis.r = scalar;\r\n\t\tthis.g = scalar;\r\n\t\tthis.b = scalar;\r\n\r\n\t},\r\n\r\n\tsetHex: function ( hex ) {\r\n\r\n\t\thex = Math.floor( hex );\r\n\r\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\r\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\r\n\t\tthis.b = ( hex & 255 ) / 255;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetRGB: function ( r, g, b ) {\r\n\r\n\t\tthis.r = r;\r\n\t\tthis.g = g;\r\n\t\tthis.b = b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetHSL: function () {\r\n\r\n\t\tfunction hue2rgb( p, q, t ) {\r\n\r\n\t\t\tif ( t < 0 ) t += 1;\r\n\t\t\tif ( t > 1 ) t -= 1;\r\n\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\r\n\t\t\tif ( t < 1 / 2 ) return q;\r\n\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\r\n\t\t\treturn p;\r\n\r\n\t\t}\r\n\r\n\t\treturn function ( h, s, l ) {\r\n\r\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\r\n\t\t\th = THREE.Math.euclideanModulo( h, 1 );\r\n\t\t\ts = THREE.Math.clamp( s, 0, 1 );\r\n\t\t\tl = THREE.Math.clamp( l, 0, 1 );\r\n\r\n\t\t\tif ( s === 0 ) {\r\n\r\n\t\t\t\tthis.r = this.g = this.b = l;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\r\n\t\t\t\tvar q = ( 2 * l ) - p;\r\n\r\n\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\r\n\t\t\t\tthis.g = hue2rgb( q, p, h );\r\n\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tsetStyle: function ( style ) {\r\n\r\n\t\tfunction handleAlpha( string ) {\r\n\r\n\t\t\tif ( string === undefined ) return;\r\n\r\n\t\t\tif ( parseFloat( string ) < 1 ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\r\n\t\tvar m;\r\n\r\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\r\n\r\n\t\t\t// rgb / hsl\r\n\r\n\t\t\tvar color;\r\n\t\t\tvar name = m[ 1 ];\r\n\t\t\tvar components = m[ 2 ];\r\n\r\n\t\t\tswitch ( name ) {\r\n\r\n\t\t\t\tcase 'rgb':\r\n\t\t\t\tcase 'rgba':\r\n\r\n\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\r\n\r\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\r\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\r\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\r\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\r\n\r\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\r\n\r\n\t\t\t\t\t\treturn this;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\r\n\r\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\r\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\r\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\r\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\r\n\r\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\r\n\r\n\t\t\t\t\t\treturn this;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'hsl':\r\n\t\t\t\tcase 'hsla':\r\n\r\n\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\r\n\r\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\r\n\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\r\n\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\r\n\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\r\n\r\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\r\n\r\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\r\n\r\n\t\t\t// hex color\r\n\r\n\t\t\tvar hex = m[ 1 ];\r\n\t\t\tvar size = hex.length;\r\n\r\n\t\t\tif ( size === 3 ) {\r\n\r\n\t\t\t\t// #ff0\r\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\r\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\r\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\r\n\r\n\t\t\t\treturn this;\r\n\r\n\t\t\t} else if ( size === 6 ) {\r\n\r\n\t\t\t\t// #ff0000\r\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\r\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\r\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\r\n\r\n\t\t\t\treturn this;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( style && style.length > 0 ) {\r\n\r\n\t\t\t// color keywords\r\n\t\t\tvar hex = THREE.ColorKeywords[ style ];\r\n\r\n\t\t\tif ( hex !== undefined ) {\r\n\r\n\t\t\t\t// red\r\n\t\t\t\tthis.setHex( hex );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// unknown color\r\n\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor( this.r, this.g, this.b );\r\n\r\n\t},\r\n\r\n\tcopy: function ( color ) {\r\n\r\n\t\tthis.r = color.r;\r\n\t\tthis.g = color.g;\r\n\t\tthis.b = color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyGammaToLinear: function ( color, gammaFactor ) {\r\n\r\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\r\n\r\n\t\tthis.r = Math.pow( color.r, gammaFactor );\r\n\t\tthis.g = Math.pow( color.g, gammaFactor );\r\n\t\tthis.b = Math.pow( color.b, gammaFactor );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyLinearToGamma: function ( color, gammaFactor ) {\r\n\r\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\r\n\r\n\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\r\n\r\n\t\tthis.r = Math.pow( color.r, safeInverse );\r\n\t\tthis.g = Math.pow( color.g, safeInverse );\r\n\t\tthis.b = Math.pow( color.b, safeInverse );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tconvertGammaToLinear: function () {\r\n\r\n\t\tvar r = this.r, g = this.g, b = this.b;\r\n\r\n\t\tthis.r = r * r;\r\n\t\tthis.g = g * g;\r\n\t\tthis.b = b * b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tconvertLinearToGamma: function () {\r\n\r\n\t\tthis.r = Math.sqrt( this.r );\r\n\t\tthis.g = Math.sqrt( this.g );\r\n\t\tthis.b = Math.sqrt( this.b );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetHex: function () {\r\n\r\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\r\n\r\n\t},\r\n\r\n\tgetHexString: function () {\r\n\r\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\r\n\r\n\t},\r\n\r\n\tgetHSL: function ( optionalTarget ) {\r\n\r\n\t\t// h,s,l ranges are in 0.0 - 1.0\r\n\r\n\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\r\n\r\n\t\tvar r = this.r, g = this.g, b = this.b;\r\n\r\n\t\tvar max = Math.max( r, g, b );\r\n\t\tvar min = Math.min( r, g, b );\r\n\r\n\t\tvar hue, saturation;\r\n\t\tvar lightness = ( min + max ) / 2.0;\r\n\r\n\t\tif ( min === max ) {\r\n\r\n\t\t\thue = 0;\r\n\t\t\tsaturation = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar delta = max - min;\r\n\r\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\r\n\r\n\t\t\tswitch ( max ) {\r\n\r\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\r\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\r\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\r\n\r\n\t\t\t}\r\n\r\n\t\t\thue /= 6;\r\n\r\n\t\t}\r\n\r\n\t\thsl.h = hue;\r\n\t\thsl.s = saturation;\r\n\t\thsl.l = lightness;\r\n\r\n\t\treturn hsl;\r\n\r\n\t},\r\n\r\n\tgetStyle: function () {\r\n\r\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\r\n\r\n\t},\r\n\r\n\toffsetHSL: function ( h, s, l ) {\r\n\r\n\t\tvar hsl = this.getHSL();\r\n\r\n\t\thsl.h += h; hsl.s += s; hsl.l += l;\r\n\r\n\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( color ) {\r\n\r\n\t\tthis.r += color.r;\r\n\t\tthis.g += color.g;\r\n\t\tthis.b += color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddColors: function ( color1, color2 ) {\r\n\r\n\t\tthis.r = color1.r + color2.r;\r\n\t\tthis.g = color1.g + color2.g;\r\n\t\tthis.b = color1.b + color2.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.r += s;\r\n\t\tthis.g += s;\r\n\t\tthis.b += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( color ) {\r\n\r\n\t\tthis.r *= color.r;\r\n\t\tthis.g *= color.g;\r\n\t\tthis.b *= color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tthis.r *= s;\r\n\t\tthis.g *= s;\r\n\t\tthis.b *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerp: function ( color, alpha ) {\r\n\r\n\t\tthis.r += ( color.r - this.r ) * alpha;\r\n\t\tthis.g += ( color.g - this.g ) * alpha;\r\n\t\tthis.b += ( color.b - this.b ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( c ) {\r\n\r\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis.r = array[ offset ];\r\n\t\tthis.g = array[ offset + 1 ];\r\n\t\tthis.b = array[ offset + 2 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tarray[ offset ] = this.r;\r\n\t\tarray[ offset + 1 ] = this.g;\r\n\t\tarray[ offset + 2 ] = this.b;\r\n\r\n\t\treturn array;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\r\n'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\r\n'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\r\n'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\r\n'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\r\n'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\r\n'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\r\n'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\r\n'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\r\n'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\r\n'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\r\n'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\r\n'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\r\n'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\r\n'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\r\n'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\r\n'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\r\n'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\r\n'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\r\n'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\r\n'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\r\n'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\r\n'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\r\n'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\r\n\r\n// File:src/math/Quaternion.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Quaternion = function ( x, y, z, w ) {\r\n\r\n\tthis._x = x || 0;\r\n\tthis._y = y || 0;\r\n\tthis._z = z || 0;\r\n\tthis._w = ( w !== undefined ) ? w : 1;\r\n\r\n};\r\n\r\nTHREE.Quaternion.prototype = {\r\n\r\n\tconstructor: THREE.Quaternion,\r\n\r\n\tget x () {\r\n\r\n\t\treturn this._x;\r\n\r\n\t},\r\n\r\n\tset x ( value ) {\r\n\r\n\t\tthis._x = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tget y () {\r\n\r\n\t\treturn this._y;\r\n\r\n\t},\r\n\r\n\tset y ( value ) {\r\n\r\n\t\tthis._y = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tget z () {\r\n\r\n\t\treturn this._z;\r\n\r\n\t},\r\n\r\n\tset z ( value ) {\r\n\r\n\t\tthis._z = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tget w () {\r\n\r\n\t\treturn this._w;\r\n\r\n\t},\r\n\r\n\tset w ( value ) {\r\n\r\n\t\tthis._w = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tset: function ( x, y, z, w ) {\r\n\r\n\t\tthis._x = x;\r\n\t\tthis._y = y;\r\n\t\tthis._z = z;\r\n\t\tthis._w = w;\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\r\n\r\n\t},\r\n\r\n\tcopy: function ( quaternion ) {\r\n\r\n\t\tthis._x = quaternion.x;\r\n\t\tthis._y = quaternion.y;\r\n\t\tthis._z = quaternion.z;\r\n\t\tthis._w = quaternion.w;\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromEuler: function ( euler, update ) {\r\n\r\n\t\tif ( euler instanceof THREE.Euler === false ) {\r\n\r\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\r\n\r\n\t\t}\r\n\r\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\r\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\r\n\t\t//\tcontent/SpinCalc.m\r\n\r\n\t\tvar c1 = Math.cos( euler._x / 2 );\r\n\t\tvar c2 = Math.cos( euler._y / 2 );\r\n\t\tvar c3 = Math.cos( euler._z / 2 );\r\n\t\tvar s1 = Math.sin( euler._x / 2 );\r\n\t\tvar s2 = Math.sin( euler._y / 2 );\r\n\t\tvar s3 = Math.sin( euler._z / 2 );\r\n\r\n\t\tvar order = euler.order;\r\n\r\n\t\tif ( order === 'XYZ' ) {\r\n\r\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\r\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\r\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\r\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'YXZ' ) {\r\n\r\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\r\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\r\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\r\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'ZXY' ) {\r\n\r\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\r\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\r\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\r\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'ZYX' ) {\r\n\r\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\r\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\r\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\r\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'YZX' ) {\r\n\r\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\r\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\r\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\r\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'XZY' ) {\r\n\r\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\r\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\r\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\r\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n\t\t}\r\n\r\n\t\tif ( update !== false ) this.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromAxisAngle: function ( axis, angle ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\r\n\r\n\t\t// assumes axis is normalized\r\n\r\n\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\r\n\r\n\t\tthis._x = axis.x * s;\r\n\t\tthis._y = axis.y * s;\r\n\t\tthis._z = axis.z * s;\r\n\t\tthis._w = Math.cos( halfAngle );\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromRotationMatrix: function ( m ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\tvar te = m.elements,\r\n\r\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\r\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\r\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\r\n\r\n\t\t\ttrace = m11 + m22 + m33,\r\n\t\t\ts;\r\n\r\n\t\tif ( trace > 0 ) {\r\n\r\n\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\r\n\r\n\t\t\tthis._w = 0.25 / s;\r\n\t\t\tthis._x = ( m32 - m23 ) * s;\r\n\t\t\tthis._y = ( m13 - m31 ) * s;\r\n\t\t\tthis._z = ( m21 - m12 ) * s;\r\n\r\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\r\n\r\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\r\n\r\n\t\t\tthis._w = ( m32 - m23 ) / s;\r\n\t\t\tthis._x = 0.25 * s;\r\n\t\t\tthis._y = ( m12 + m21 ) / s;\r\n\t\t\tthis._z = ( m13 + m31 ) / s;\r\n\r\n\t\t} else if ( m22 > m33 ) {\r\n\r\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\r\n\r\n\t\t\tthis._w = ( m13 - m31 ) / s;\r\n\t\t\tthis._x = ( m12 + m21 ) / s;\r\n\t\t\tthis._y = 0.25 * s;\r\n\t\t\tthis._z = ( m23 + m32 ) / s;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\r\n\r\n\t\t\tthis._w = ( m21 - m12 ) / s;\r\n\t\t\tthis._x = ( m13 + m31 ) / s;\r\n\t\t\tthis._y = ( m23 + m32 ) / s;\r\n\t\t\tthis._z = 0.25 * s;\r\n\r\n\t\t}\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromUnitVectors: function () {\r\n\r\n\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\r\n\r\n\t\t// assumes direction vectors vFrom and vTo are normalized\r\n\r\n\t\tvar v1, r;\r\n\r\n\t\tvar EPS = 0.000001;\r\n\r\n\t\treturn function ( vFrom, vTo ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\r\n\t\t\tr = vFrom.dot( vTo ) + 1;\r\n\r\n\t\t\tif ( r < EPS ) {\r\n\r\n\t\t\t\tr = 0;\r\n\r\n\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\r\n\r\n\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tv1.crossVectors( vFrom, vTo );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis._x = v1.x;\r\n\t\t\tthis._y = v1.y;\r\n\t\t\tthis._z = v1.z;\r\n\t\t\tthis._w = r;\r\n\r\n\t\t\tthis.normalize();\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tinverse: function () {\r\n\r\n\t\tthis.conjugate().normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tconjugate: function () {\r\n\r\n\t\tthis._x *= - 1;\r\n\t\tthis._y *= - 1;\r\n\t\tthis._z *= - 1;\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\tvar l = this.length();\r\n\r\n\t\tif ( l === 0 ) {\r\n\r\n\t\t\tthis._x = 0;\r\n\t\t\tthis._y = 0;\r\n\t\t\tthis._z = 0;\r\n\t\t\tthis._w = 1;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tl = 1 / l;\r\n\r\n\t\t\tthis._x = this._x * l;\r\n\t\t\tthis._y = this._y * l;\r\n\t\t\tthis._z = this._z * l;\r\n\t\t\tthis._w = this._w * l;\r\n\r\n\t\t}\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( q, p ) {\r\n\r\n\t\tif ( p !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\r\n\t\t\treturn this.multiplyQuaternions( q, p );\r\n\r\n\t\t}\r\n\r\n\t\treturn this.multiplyQuaternions( this, q );\r\n\r\n\t},\r\n\r\n\tmultiplyQuaternions: function ( a, b ) {\r\n\r\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\r\n\r\n\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\r\n\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\r\n\r\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\r\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\r\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\r\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tslerp: function ( qb, t ) {\r\n\r\n\t\tif ( t === 0 ) return this;\r\n\t\tif ( t === 1 ) return this.copy( qb );\r\n\r\n\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\r\n\r\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\r\n\r\n\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\r\n\r\n\t\tif ( cosHalfTheta < 0 ) {\r\n\r\n\t\t\tthis._w = - qb._w;\r\n\t\t\tthis._x = - qb._x;\r\n\t\t\tthis._y = - qb._y;\r\n\t\t\tthis._z = - qb._z;\r\n\r\n\t\t\tcosHalfTheta = - cosHalfTheta;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.copy( qb );\r\n\r\n\t\t}\r\n\r\n\t\tif ( cosHalfTheta >= 1.0 ) {\r\n\r\n\t\t\tthis._w = w;\r\n\t\t\tthis._x = x;\r\n\t\t\tthis._y = y;\r\n\t\t\tthis._z = z;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\r\n\r\n\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\r\n\r\n\t\t\tthis._w = 0.5 * ( w + this._w );\r\n\t\t\tthis._x = 0.5 * ( x + this._x );\r\n\t\t\tthis._y = 0.5 * ( y + this._y );\r\n\t\t\tthis._z = 0.5 * ( z + this._z );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\r\n\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\r\n\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\r\n\r\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\r\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\r\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\r\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( quaternion ) {\r\n\r\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis._x = array[ offset ];\r\n\t\tthis._y = array[ offset + 1 ];\r\n\t\tthis._z = array[ offset + 2 ];\r\n\t\tthis._w = array[ offset + 3 ];\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tarray[ offset ] = this._x;\r\n\t\tarray[ offset + 1 ] = this._y;\r\n\t\tarray[ offset + 2 ] = this._z;\r\n\t\tarray[ offset + 3 ] = this._w;\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tonChange: function ( callback ) {\r\n\r\n\t\tthis.onChangeCallback = callback;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tonChangeCallback: function () {}\r\n\r\n};\r\n\r\nObject.assign( THREE.Quaternion, {\r\n\r\n\tslerp: function( qa, qb, qm, t ) {\r\n\r\n\t\treturn qm.copy( qa ).slerp( qb, t );\r\n\r\n\t},\r\n\r\n\tslerpFlat: function(\r\n\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\r\n\r\n\t\t// fuzz-free, array-based Quaternion SLERP operation\r\n\r\n\t\tvar x0 = src0[ srcOffset0 + 0 ],\r\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\r\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\r\n\t\t\tw0 = src0[ srcOffset0 + 3 ],\r\n\r\n\t\t\tx1 = src1[ srcOffset1 + 0 ],\r\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\r\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\r\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\r\n\r\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\r\n\r\n\t\t\tvar s = 1 - t,\r\n\r\n\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\r\n\r\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\r\n\t\t\t\tsqrSin = 1 - cos * cos;\r\n\r\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\r\n\t\t\tif ( sqrSin > Number.EPSILON ) {\r\n\r\n\t\t\t\tvar sin = Math.sqrt( sqrSin ),\r\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\r\n\r\n\t\t\t\ts = Math.sin( s * len ) / sin;\r\n\t\t\t\tt = Math.sin( t * len ) / sin;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar tDir = t * dir;\r\n\r\n\t\t\tx0 = x0 * s + x1 * tDir;\r\n\t\t\ty0 = y0 * s + y1 * tDir;\r\n\t\t\tz0 = z0 * s + z1 * tDir;\r\n\t\t\tw0 = w0 * s + w1 * tDir;\r\n\r\n\t\t\t// Normalize in case we just did a lerp:\r\n\t\t\tif ( s === 1 - t ) {\r\n\r\n\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\r\n\r\n\t\t\t\tx0 *= f;\r\n\t\t\t\ty0 *= f;\r\n\t\t\t\tz0 *= f;\r\n\t\t\t\tw0 *= f;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tdst[ dstOffset ] = x0;\r\n\t\tdst[ dstOffset + 1 ] = y0;\r\n\t\tdst[ dstOffset + 2 ] = z0;\r\n\t\tdst[ dstOffset + 3 ] = w0;\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/math/Vector2.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author egraether / http://egraether.com/\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n */\r\n\r\nTHREE.Vector2 = function ( x, y ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\r\n};\r\n\r\nTHREE.Vector2.prototype = {\r\n\r\n\tconstructor: THREE.Vector2,\r\n\r\n\tget width() {\r\n\r\n\t\treturn this.x;\r\n\r\n\t},\r\n\r\n\tset width( value ) {\r\n\r\n\t\tthis.x = value;\r\n\r\n\t},\r\n\r\n\tget height() {\r\n\r\n\t\treturn this.y;\r\n\r\n\t},\r\n\r\n\tset height( value ) {\r\n\r\n\t\tthis.y = value;\r\n\r\n\t},\r\n\r\n\t//\r\n\r\n\tset: function ( x, y ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetScalar: function ( scalar ) {\r\n\r\n\t\tthis.x = scalar;\r\n\t\tthis.y = scalar;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetX: function ( x ) {\r\n\r\n\t\tthis.x = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( y ) {\r\n\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponent: function ( index, value ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: this.x = value; break;\r\n\t\t\tcase 1: this.y = value; break;\r\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetComponent: function ( index ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: return this.x;\r\n\t\t\tcase 1: return this.y;\r\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor( this.x, this.y );\r\n\r\n\t},\r\n\r\n\tcopy: function ( v ) {\r\n\r\n\t\tthis.x = v.x;\r\n\t\tthis.y = v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\r\n\t\t\treturn this.addVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x += v.x;\r\n\t\tthis.y += v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.x += s;\r\n\t\tthis.y += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x + b.x;\r\n\t\tthis.y = a.y + b.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScaledVector: function ( v, s ) {\r\n\r\n\t\tthis.x += v.x * s;\r\n\t\tthis.y += v.y * s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsub: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\r\n\t\t\treturn this.subVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x -= v.x;\r\n\t\tthis.y -= v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubScalar: function ( s ) {\r\n\r\n\t\tthis.x -= s;\r\n\t\tthis.y -= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x - b.x;\r\n\t\tthis.y = a.y - b.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( v ) {\r\n\r\n\t\tthis.x *= v.x;\r\n\t\tthis.y *= v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( scalar ) {\r\n\r\n\t\tif ( isFinite( scalar ) ) {\r\n\r\n\t\t\tthis.x *= scalar;\r\n\t\t\tthis.y *= scalar;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.x = 0;\r\n\t\t\tthis.y = 0;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivide: function ( v ) {\r\n\r\n\t\tthis.x /= v.x;\r\n\t\tthis.y /= v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivideScalar: function ( scalar ) {\r\n\r\n\t\treturn this.multiplyScalar( 1 / scalar );\r\n\r\n\t},\r\n\r\n\tmin: function ( v ) {\r\n\r\n\t\tthis.x = Math.min( this.x, v.x );\r\n\t\tthis.y = Math.min( this.y, v.y );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmax: function ( v ) {\r\n\r\n\t\tthis.x = Math.max( this.x, v.x );\r\n\t\tthis.y = Math.max( this.y, v.y );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclamp: function ( min, max ) {\r\n\r\n\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\r\n\r\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\r\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclampScalar: function () {\r\n\r\n\t\tvar min, max;\r\n\r\n\t\treturn function clampScalar( minVal, maxVal ) {\r\n\r\n\t\t\tif ( min === undefined ) {\r\n\r\n\t\t\t\tmin = new THREE.Vector2();\r\n\t\t\t\tmax = new THREE.Vector2();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tmin.set( minVal, minVal );\r\n\t\t\tmax.set( maxVal, maxVal );\r\n\r\n\t\t\treturn this.clamp( min, max );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclampLength: function ( min, max ) {\r\n\r\n\t\tvar length = this.length();\r\n\r\n\t\tthis.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfloor: function () {\r\n\r\n\t\tthis.x = Math.floor( this.x );\r\n\t\tthis.y = Math.floor( this.y );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tceil: function () {\r\n\r\n\t\tthis.x = Math.ceil( this.x );\r\n\t\tthis.y = Math.ceil( this.y );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tround: function () {\r\n\r\n\t\tthis.x = Math.round( this.x );\r\n\t\tthis.y = Math.round( this.y );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\troundToZero: function () {\r\n\r\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\r\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function () {\r\n\r\n\t\tthis.x = - this.x;\r\n\t\tthis.y = - this.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this.x * v.x + this.y * v.y;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\r\n\r\n\t},\r\n\r\n\tlengthManhattan: function() {\r\n\r\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\treturn this.divideScalar( this.length() );\r\n\r\n\t},\r\n\r\n\tangle: function () {\r\n\r\n\t\t// computes the angle in radians with respect to the positive x-axis\r\n\r\n\t\tvar angle = Math.atan2( this.y, this.x );\r\n\r\n\t\tif ( angle < 0 ) angle += 2 * Math.PI;\r\n\r\n\t\treturn angle;\r\n\r\n\t},\r\n\r\n\tdistanceTo: function ( v ) {\r\n\r\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\r\n\r\n\t},\r\n\r\n\tdistanceToSquared: function ( v ) {\r\n\r\n\t\tvar dx = this.x - v.x, dy = this.y - v.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\r\n\t},\r\n\r\n\tsetLength: function ( length ) {\r\n\r\n\t\treturn this.multiplyScalar( length / this.length() );\r\n\r\n\t},\r\n\r\n\tlerp: function ( v, alpha ) {\r\n\r\n\t\tthis.x += ( v.x - this.x ) * alpha;\r\n\t\tthis.y += ( v.y - this.y ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerpVectors: function ( v1, v2, alpha ) {\r\n\r\n\t\tthis.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis.x = array[ offset ];\r\n\t\tthis.y = array[ offset + 1 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tarray[ offset ] = this.x;\r\n\t\tarray[ offset + 1 ] = this.y;\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tfromAttribute: function ( attribute, index, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tindex = index * attribute.itemSize + offset;\r\n\r\n\t\tthis.x = attribute.array[ index ];\r\n\t\tthis.y = attribute.array[ index + 1 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\trotateAround: function ( center, angle ) {\r\n\r\n\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\r\n\r\n\t\tvar x = this.x - center.x;\r\n\t\tvar y = this.y - center.y;\r\n\r\n\t\tthis.x = x * c - y * s + center.x;\r\n\t\tthis.y = x * s + y * c + center.y;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Vector3.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author *kile / http://kile.stravaganza.org/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author egraether / http://egraether.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Vector3 = function ( x, y, z ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\tthis.z = z || 0;\r\n\r\n};\r\n\r\nTHREE.Vector3.prototype = {\r\n\r\n\tconstructor: THREE.Vector3,\r\n\r\n\tset: function ( x, y, z ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetScalar: function ( scalar ) {\r\n\r\n\t\tthis.x = scalar;\r\n\t\tthis.y = scalar;\r\n\t\tthis.z = scalar;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetX: function ( x ) {\r\n\r\n\t\tthis.x = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( y ) {\r\n\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetZ: function ( z ) {\r\n\r\n\t\tthis.z = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponent: function ( index, value ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: this.x = value; break;\r\n\t\t\tcase 1: this.y = value; break;\r\n\t\t\tcase 2: this.z = value; break;\r\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetComponent: function ( index ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: return this.x;\r\n\t\t\tcase 1: return this.y;\r\n\t\t\tcase 2: return this.z;\r\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor( this.x, this.y, this.z );\r\n\r\n\t},\r\n\r\n\tcopy: function ( v ) {\r\n\r\n\t\tthis.x = v.x;\r\n\t\tthis.y = v.y;\r\n\t\tthis.z = v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\r\n\t\t\treturn this.addVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x += v.x;\r\n\t\tthis.y += v.y;\r\n\t\tthis.z += v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.x += s;\r\n\t\tthis.y += s;\r\n\t\tthis.z += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x + b.x;\r\n\t\tthis.y = a.y + b.y;\r\n\t\tthis.z = a.z + b.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScaledVector: function ( v, s ) {\r\n\r\n\t\tthis.x += v.x * s;\r\n\t\tthis.y += v.y * s;\r\n\t\tthis.z += v.z * s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsub: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\r\n\t\t\treturn this.subVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x -= v.x;\r\n\t\tthis.y -= v.y;\r\n\t\tthis.z -= v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubScalar: function ( s ) {\r\n\r\n\t\tthis.x -= s;\r\n\t\tthis.y -= s;\r\n\t\tthis.z -= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x - b.x;\r\n\t\tthis.y = a.y - b.y;\r\n\t\tthis.z = a.z - b.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\r\n\t\t\treturn this.multiplyVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x *= v.x;\r\n\t\tthis.y *= v.y;\r\n\t\tthis.z *= v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( scalar ) {\r\n\r\n\t\tif ( isFinite( scalar ) ) {\r\n\r\n\t\t\tthis.x *= scalar;\r\n\t\t\tthis.y *= scalar;\r\n\t\t\tthis.z *= scalar;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.x = 0;\r\n\t\t\tthis.y = 0;\r\n\t\t\tthis.z = 0;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x * b.x;\r\n\t\tthis.y = a.y * b.y;\r\n\t\tthis.z = a.z * b.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyEuler: function () {\r\n\r\n\t\tvar quaternion;\r\n\r\n\t\treturn function applyEuler( euler ) {\r\n\r\n\t\t\tif ( euler instanceof THREE.Euler === false ) {\r\n\r\n\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( quaternion === undefined ) quaternion = new THREE.Quaternion();\r\n\r\n\t\t\tthis.applyQuaternion( quaternion.setFromEuler( euler ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tapplyAxisAngle: function () {\r\n\r\n\t\tvar quaternion;\r\n\r\n\t\treturn function applyAxisAngle( axis, angle ) {\r\n\r\n\t\t\tif ( quaternion === undefined ) quaternion = new THREE.Quaternion();\r\n\r\n\t\t\tthis.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tapplyMatrix3: function ( m ) {\r\n\r\n\t\tvar x = this.x;\r\n\t\tvar y = this.y;\r\n\t\tvar z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\r\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\r\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4 affine matrix\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\r\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\r\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyProjection: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4 projection matrix\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\r\n\r\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\r\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\r\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyQuaternion: function ( q ) {\r\n\r\n\t\tvar x = this.x;\r\n\t\tvar y = this.y;\r\n\t\tvar z = this.z;\r\n\r\n\t\tvar qx = q.x;\r\n\t\tvar qy = q.y;\r\n\t\tvar qz = q.z;\r\n\t\tvar qw = q.w;\r\n\r\n\t\t// calculate quat * vector\r\n\r\n\t\tvar ix = qw * x + qy * z - qz * y;\r\n\t\tvar iy = qw * y + qz * x - qx * z;\r\n\t\tvar iz = qw * z + qx * y - qy * x;\r\n\t\tvar iw = - qx * x - qy * y - qz * z;\r\n\r\n\t\t// calculate result * inverse quat\r\n\r\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\r\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\r\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tproject: function () {\r\n\r\n\t\tvar matrix;\r\n\r\n\t\treturn function project( camera ) {\r\n\r\n\t\t\tif ( matrix === undefined ) matrix = new THREE.Matrix4();\r\n\r\n\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\r\n\t\t\treturn this.applyProjection( matrix );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tunproject: function () {\r\n\r\n\t\tvar matrix;\r\n\r\n\t\treturn function unproject( camera ) {\r\n\r\n\t\t\tif ( matrix === undefined ) matrix = new THREE.Matrix4();\r\n\r\n\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\r\n\t\t\treturn this.applyProjection( matrix );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttransformDirection: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4 affine matrix\r\n\t\t// vector interpreted as a direction\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\r\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\r\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\r\n\r\n\t\tthis.normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivide: function ( v ) {\r\n\r\n\t\tthis.x /= v.x;\r\n\t\tthis.y /= v.y;\r\n\t\tthis.z /= v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivideScalar: function ( scalar ) {\r\n\r\n\t\treturn this.multiplyScalar( 1 / scalar );\r\n\r\n\t},\r\n\r\n\tmin: function ( v ) {\r\n\r\n\t\tthis.x = Math.min( this.x, v.x );\r\n\t\tthis.y = Math.min( this.y, v.y );\r\n\t\tthis.z = Math.min( this.z, v.z );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmax: function ( v ) {\r\n\r\n\t\tthis.x = Math.max( this.x, v.x );\r\n\t\tthis.y = Math.max( this.y, v.y );\r\n\t\tthis.z = Math.max( this.z, v.z );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclamp: function ( min, max ) {\r\n\r\n\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\r\n\r\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\r\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\r\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclampScalar: function () {\r\n\r\n\t\tvar min, max;\r\n\r\n\t\treturn function clampScalar( minVal, maxVal ) {\r\n\r\n\t\t\tif ( min === undefined ) {\r\n\r\n\t\t\t\tmin = new THREE.Vector3();\r\n\t\t\t\tmax = new THREE.Vector3();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tmin.set( minVal, minVal, minVal );\r\n\t\t\tmax.set( maxVal, maxVal, maxVal );\r\n\r\n\t\t\treturn this.clamp( min, max );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclampLength: function ( min, max ) {\r\n\r\n\t\tvar length = this.length();\r\n\r\n\t\tthis.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfloor: function () {\r\n\r\n\t\tthis.x = Math.floor( this.x );\r\n\t\tthis.y = Math.floor( this.y );\r\n\t\tthis.z = Math.floor( this.z );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tceil: function () {\r\n\r\n\t\tthis.x = Math.ceil( this.x );\r\n\t\tthis.y = Math.ceil( this.y );\r\n\t\tthis.z = Math.ceil( this.z );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tround: function () {\r\n\r\n\t\tthis.x = Math.round( this.x );\r\n\t\tthis.y = Math.round( this.y );\r\n\t\tthis.z = Math.round( this.z );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\troundToZero: function () {\r\n\r\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\r\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\r\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function () {\r\n\r\n\t\tthis.x = - this.x;\r\n\t\tthis.y = - this.y;\r\n\t\tthis.z = - this.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\r\n\r\n\t},\r\n\r\n\tlengthManhattan: function () {\r\n\r\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\treturn this.divideScalar( this.length() );\r\n\r\n\t},\r\n\r\n\tsetLength: function ( length ) {\r\n\r\n\t\treturn this.multiplyScalar( length / this.length() );\r\n\r\n\t},\r\n\r\n\tlerp: function ( v, alpha ) {\r\n\r\n\t\tthis.x += ( v.x - this.x ) * alpha;\r\n\t\tthis.y += ( v.y - this.y ) * alpha;\r\n\t\tthis.z += ( v.z - this.z ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerpVectors: function ( v1, v2, alpha ) {\r\n\r\n\t\tthis.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcross: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\r\n\t\t\treturn this.crossVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tthis.x = y * v.z - z * v.y;\r\n\t\tthis.y = z * v.x - x * v.z;\r\n\t\tthis.z = x * v.y - y * v.x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcrossVectors: function ( a, b ) {\r\n\r\n\t\tvar ax = a.x, ay = a.y, az = a.z;\r\n\t\tvar bx = b.x, by = b.y, bz = b.z;\r\n\r\n\t\tthis.x = ay * bz - az * by;\r\n\t\tthis.y = az * bx - ax * bz;\r\n\t\tthis.z = ax * by - ay * bx;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tprojectOnVector: function () {\r\n\r\n\t\tvar v1, dot;\r\n\r\n\t\treturn function projectOnVector( vector ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\r\n\t\t\tv1.copy( vector ).normalize();\r\n\r\n\t\t\tdot = this.dot( v1 );\r\n\r\n\t\t\treturn this.copy( v1 ).multiplyScalar( dot );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tprojectOnPlane: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function projectOnPlane( planeNormal ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\r\n\t\t\tv1.copy( this ).projectOnVector( planeNormal );\r\n\r\n\t\t\treturn this.sub( v1 );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\treflect: function () {\r\n\r\n\t\t// reflect incident vector off plane orthogonal to normal\r\n\t\t// normal is assumed to have unit length\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function reflect( normal ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\r\n\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tangleTo: function ( v ) {\r\n\r\n\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\r\n\r\n\t\t// clamp, to handle numerical problems\r\n\r\n\t\treturn Math.acos( THREE.Math.clamp( theta, - 1, 1 ) );\r\n\r\n\t},\r\n\r\n\tdistanceTo: function ( v ) {\r\n\r\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\r\n\r\n\t},\r\n\r\n\tdistanceToSquared: function ( v ) {\r\n\r\n\t\tvar dx = this.x - v.x;\r\n\t\tvar dy = this.y - v.y;\r\n\t\tvar dz = this.z - v.z;\r\n\r\n\t\treturn dx * dx + dy * dy + dz * dz;\r\n\r\n\t},\r\n\r\n\tsetFromSpherical: function( s ) {\r\n\r\n\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\r\n\r\n\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\r\n\t\tthis.y = Math.cos( s.phi ) * s.radius;\r\n\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromMatrixPosition: function ( m ) {\r\n\r\n\t\treturn this.setFromMatrixColumn( m, 3 );\r\n\r\n\t},\r\n\r\n\tsetFromMatrixScale: function ( m ) {\r\n\r\n\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\r\n\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\r\n\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\r\n\r\n\t\tthis.x = sx;\r\n\t\tthis.y = sy;\r\n\t\tthis.z = sz;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromMatrixColumn: function ( m, index ) {\r\n\r\n\t\tif ( typeof m === 'number' ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\r\n\r\n\t\t\tm = arguments[ 1 ];\r\n\t\t\tindex = arguments[ 0 ];\r\n\r\n\t\t}\r\n\r\n\t\treturn this.fromArray( m.elements, index * 4 );\r\n\r\n\t},\r\n\r\n\tequals: function ( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis.x = array[ offset ];\r\n\t\tthis.y = array[ offset + 1 ];\r\n\t\tthis.z = array[ offset + 2 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tarray[ offset ] = this.x;\r\n\t\tarray[ offset + 1 ] = this.y;\r\n\t\tarray[ offset + 2 ] = this.z;\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tfromAttribute: function ( attribute, index, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tindex = index * attribute.itemSize + offset;\r\n\r\n\t\tthis.x = attribute.array[ index ];\r\n\t\tthis.y = attribute.array[ index + 1 ];\r\n\t\tthis.z = attribute.array[ index + 2 ];\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Vector4.js\r\n\r\n/**\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author egraether / http://egraether.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Vector4 = function ( x, y, z, w ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\tthis.z = z || 0;\r\n\tthis.w = ( w !== undefined ) ? w : 1;\r\n\r\n};\r\n\r\nTHREE.Vector4.prototype = {\r\n\r\n\tconstructor: THREE.Vector4,\r\n\r\n\tset: function ( x, y, z, w ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\t\tthis.w = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetScalar: function ( scalar ) {\r\n\r\n\t\tthis.x = scalar;\r\n\t\tthis.y = scalar;\r\n\t\tthis.z = scalar;\r\n\t\tthis.w = scalar;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetX: function ( x ) {\r\n\r\n\t\tthis.x = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( y ) {\r\n\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetZ: function ( z ) {\r\n\r\n\t\tthis.z = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetW: function ( w ) {\r\n\r\n\t\tthis.w = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponent: function ( index, value ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: this.x = value; break;\r\n\t\t\tcase 1: this.y = value; break;\r\n\t\t\tcase 2: this.z = value; break;\r\n\t\t\tcase 3: this.w = value; break;\r\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetComponent: function ( index ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: return this.x;\r\n\t\t\tcase 1: return this.y;\r\n\t\t\tcase 2: return this.z;\r\n\t\t\tcase 3: return this.w;\r\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\r\n\r\n\t},\r\n\r\n\tcopy: function ( v ) {\r\n\r\n\t\tthis.x = v.x;\r\n\t\tthis.y = v.y;\r\n\t\tthis.z = v.z;\r\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\r\n\t\t\treturn this.addVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x += v.x;\r\n\t\tthis.y += v.y;\r\n\t\tthis.z += v.z;\r\n\t\tthis.w += v.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.x += s;\r\n\t\tthis.y += s;\r\n\t\tthis.z += s;\r\n\t\tthis.w += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x + b.x;\r\n\t\tthis.y = a.y + b.y;\r\n\t\tthis.z = a.z + b.z;\r\n\t\tthis.w = a.w + b.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScaledVector: function ( v, s ) {\r\n\r\n\t\tthis.x += v.x * s;\r\n\t\tthis.y += v.y * s;\r\n\t\tthis.z += v.z * s;\r\n\t\tthis.w += v.w * s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsub: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\r\n\t\t\treturn this.subVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x -= v.x;\r\n\t\tthis.y -= v.y;\r\n\t\tthis.z -= v.z;\r\n\t\tthis.w -= v.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubScalar: function ( s ) {\r\n\r\n\t\tthis.x -= s;\r\n\t\tthis.y -= s;\r\n\t\tthis.z -= s;\r\n\t\tthis.w -= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x - b.x;\r\n\t\tthis.y = a.y - b.y;\r\n\t\tthis.z = a.z - b.z;\r\n\t\tthis.w = a.w - b.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( scalar ) {\r\n\r\n\t\tif ( isFinite( scalar ) ) {\r\n\r\n\t\t\tthis.x *= scalar;\r\n\t\t\tthis.y *= scalar;\r\n\t\t\tthis.z *= scalar;\r\n\t\t\tthis.w *= scalar;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.x = 0;\r\n\t\t\tthis.y = 0;\r\n\t\t\tthis.z = 0;\r\n\t\t\tthis.w = 0;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( m ) {\r\n\r\n\t\tvar x = this.x;\r\n\t\tvar y = this.y;\r\n\t\tvar z = this.z;\r\n\t\tvar w = this.w;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\r\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\r\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\r\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivideScalar: function ( scalar ) {\r\n\r\n\t\treturn this.multiplyScalar( 1 / scalar );\r\n\r\n\t},\r\n\r\n\tsetAxisAngleFromQuaternion: function ( q ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\r\n\r\n\t\t// q is assumed to be normalized\r\n\r\n\t\tthis.w = 2 * Math.acos( q.w );\r\n\r\n\t\tvar s = Math.sqrt( 1 - q.w * q.w );\r\n\r\n\t\tif ( s < 0.0001 ) {\r\n\r\n\t\t\t this.x = 1;\r\n\t\t\t this.y = 0;\r\n\t\t\t this.z = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t this.x = q.x / s;\r\n\t\t\t this.y = q.y / s;\r\n\t\t\t this.z = q.z / s;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetAxisAngleFromRotationMatrix: function ( m ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\tvar angle, x, y, z,\t\t// variables for result\r\n\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\r\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\r\n\r\n\t\t\tte = m.elements,\r\n\r\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\r\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\r\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\r\n\r\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\r\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\r\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\r\n\r\n\t\t\t// singularity found\r\n\t\t\t// first check for identity matrix which must have +1 for all terms\r\n\t\t\t// in leading diagonal and zero in other terms\r\n\r\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\r\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\r\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\r\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\r\n\r\n\t\t\t\t// this singularity is identity matrix so angle = 0\r\n\r\n\t\t\t\tthis.set( 1, 0, 0, 0 );\r\n\r\n\t\t\t\treturn this; // zero angle, arbitrary axis\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// otherwise this singularity is angle = 180\r\n\r\n\t\t\tangle = Math.PI;\r\n\r\n\t\t\tvar xx = ( m11 + 1 ) / 2;\r\n\t\t\tvar yy = ( m22 + 1 ) / 2;\r\n\t\t\tvar zz = ( m33 + 1 ) / 2;\r\n\t\t\tvar xy = ( m12 + m21 ) / 4;\r\n\t\t\tvar xz = ( m13 + m31 ) / 4;\r\n\t\t\tvar yz = ( m23 + m32 ) / 4;\r\n\r\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\r\n\r\n\t\t\t\t// m11 is the largest diagonal term\r\n\r\n\t\t\t\tif ( xx < epsilon ) {\r\n\r\n\t\t\t\t\tx = 0;\r\n\t\t\t\t\ty = 0.707106781;\r\n\t\t\t\t\tz = 0.707106781;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tx = Math.sqrt( xx );\r\n\t\t\t\t\ty = xy / x;\r\n\t\t\t\t\tz = xz / x;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( yy > zz ) {\r\n\r\n\t\t\t\t// m22 is the largest diagonal term\r\n\r\n\t\t\t\tif ( yy < epsilon ) {\r\n\r\n\t\t\t\t\tx = 0.707106781;\r\n\t\t\t\t\ty = 0;\r\n\t\t\t\t\tz = 0.707106781;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ty = Math.sqrt( yy );\r\n\t\t\t\t\tx = xy / y;\r\n\t\t\t\t\tz = yz / y;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// m33 is the largest diagonal term so base result on this\r\n\r\n\t\t\t\tif ( zz < epsilon ) {\r\n\r\n\t\t\t\t\tx = 0.707106781;\r\n\t\t\t\t\ty = 0.707106781;\r\n\t\t\t\t\tz = 0;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tz = Math.sqrt( zz );\r\n\t\t\t\t\tx = xz / z;\r\n\t\t\t\t\ty = yz / z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.set( x, y, z, angle );\r\n\r\n\t\t\treturn this; // return 180 deg rotation\r\n\r\n\t\t}\r\n\r\n\t\t// as we have reached here there are no singularities so we can handle normally\r\n\r\n\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\r\n\t\t ( m13 - m31 ) * ( m13 - m31 ) +\r\n\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\r\n\r\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\r\n\r\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\r\n\t\t// caught by singularity test above, but I've left it in just in case\r\n\r\n\t\tthis.x = ( m32 - m23 ) / s;\r\n\t\tthis.y = ( m13 - m31 ) / s;\r\n\t\tthis.z = ( m21 - m12 ) / s;\r\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmin: function ( v ) {\r\n\r\n\t\tthis.x = Math.min( this.x, v.x );\r\n\t\tthis.y = Math.min( this.y, v.y );\r\n\t\tthis.z = Math.min( this.z, v.z );\r\n\t\tthis.w = Math.min( this.w, v.w );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmax: function ( v ) {\r\n\r\n\t\tthis.x = Math.max( this.x, v.x );\r\n\t\tthis.y = Math.max( this.y, v.y );\r\n\t\tthis.z = Math.max( this.z, v.z );\r\n\t\tthis.w = Math.max( this.w, v.w );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclamp: function ( min, max ) {\r\n\r\n\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\r\n\r\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\r\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\r\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\r\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclampScalar: function () {\r\n\r\n\t\tvar min, max;\r\n\r\n\t\treturn function clampScalar( minVal, maxVal ) {\r\n\r\n\t\t\tif ( min === undefined ) {\r\n\r\n\t\t\t\tmin = new THREE.Vector4();\r\n\t\t\t\tmax = new THREE.Vector4();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tmin.set( minVal, minVal, minVal, minVal );\r\n\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\r\n\r\n\t\t\treturn this.clamp( min, max );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tfloor: function () {\r\n\r\n\t\tthis.x = Math.floor( this.x );\r\n\t\tthis.y = Math.floor( this.y );\r\n\t\tthis.z = Math.floor( this.z );\r\n\t\tthis.w = Math.floor( this.w );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tceil: function () {\r\n\r\n\t\tthis.x = Math.ceil( this.x );\r\n\t\tthis.y = Math.ceil( this.y );\r\n\t\tthis.z = Math.ceil( this.z );\r\n\t\tthis.w = Math.ceil( this.w );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tround: function () {\r\n\r\n\t\tthis.x = Math.round( this.x );\r\n\t\tthis.y = Math.round( this.y );\r\n\t\tthis.z = Math.round( this.z );\r\n\t\tthis.w = Math.round( this.w );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\troundToZero: function () {\r\n\r\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\r\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\r\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\r\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function () {\r\n\r\n\t\tthis.x = - this.x;\r\n\t\tthis.y = - this.y;\r\n\t\tthis.z = - this.z;\r\n\t\tthis.w = - this.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\r\n\r\n\t},\r\n\r\n\tlengthManhattan: function () {\r\n\r\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\treturn this.divideScalar( this.length() );\r\n\r\n\t},\r\n\r\n\tsetLength: function ( length ) {\r\n\r\n\t\treturn this.multiplyScalar( length / this.length() );\r\n\r\n\t},\r\n\r\n\tlerp: function ( v, alpha ) {\r\n\r\n\t\tthis.x += ( v.x - this.x ) * alpha;\r\n\t\tthis.y += ( v.y - this.y ) * alpha;\r\n\t\tthis.z += ( v.z - this.z ) * alpha;\r\n\t\tthis.w += ( v.w - this.w ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerpVectors: function ( v1, v2, alpha ) {\r\n\r\n\t\tthis.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis.x = array[ offset ];\r\n\t\tthis.y = array[ offset + 1 ];\r\n\t\tthis.z = array[ offset + 2 ];\r\n\t\tthis.w = array[ offset + 3 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tarray[ offset ] = this.x;\r\n\t\tarray[ offset + 1 ] = this.y;\r\n\t\tarray[ offset + 2 ] = this.z;\r\n\t\tarray[ offset + 3 ] = this.w;\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tfromAttribute: function ( attribute, index, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tindex = index * attribute.itemSize + offset;\r\n\r\n\t\tthis.x = attribute.array[ index ];\r\n\t\tthis.y = attribute.array[ index + 1 ];\r\n\t\tthis.z = attribute.array[ index + 2 ];\r\n\t\tthis.w = attribute.array[ index + 3 ];\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Euler.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Euler = function ( x, y, z, order ) {\r\n\r\n\tthis._x = x || 0;\r\n\tthis._y = y || 0;\r\n\tthis._z = z || 0;\r\n\tthis._order = order || THREE.Euler.DefaultOrder;\r\n\r\n};\r\n\r\nTHREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\r\n\r\nTHREE.Euler.DefaultOrder = 'XYZ';\r\n\r\nTHREE.Euler.prototype = {\r\n\r\n\tconstructor: THREE.Euler,\r\n\r\n\tget x () {\r\n\r\n\t\treturn this._x;\r\n\r\n\t},\r\n\r\n\tset x ( value ) {\r\n\r\n\t\tthis._x = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tget y () {\r\n\r\n\t\treturn this._y;\r\n\r\n\t},\r\n\r\n\tset y ( value ) {\r\n\r\n\t\tthis._y = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tget z () {\r\n\r\n\t\treturn this._z;\r\n\r\n\t},\r\n\r\n\tset z ( value ) {\r\n\r\n\t\tthis._z = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tget order () {\r\n\r\n\t\treturn this._order;\r\n\r\n\t},\r\n\r\n\tset order ( value ) {\r\n\r\n\t\tthis._order = value;\r\n\t\tthis.onChangeCallback();\r\n\r\n\t},\r\n\r\n\tset: function ( x, y, z, order ) {\r\n\r\n\t\tthis._x = x;\r\n\t\tthis._y = y;\r\n\t\tthis._z = z;\r\n\t\tthis._order = order || this._order;\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\r\n\r\n\t},\r\n\r\n\tcopy: function ( euler ) {\r\n\r\n\t\tthis._x = euler._x;\r\n\t\tthis._y = euler._y;\r\n\t\tthis._z = euler._z;\r\n\t\tthis._order = euler._order;\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromRotationMatrix: function ( m, order, update ) {\r\n\r\n\t\tvar clamp = THREE.Math.clamp;\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\tvar te = m.elements;\r\n\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\r\n\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\r\n\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\r\n\r\n\t\torder = order || this._order;\r\n\r\n\t\tif ( order === 'XYZ' ) {\r\n\r\n\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\r\n\r\n\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\r\n\t\t\t\tthis._z = Math.atan2( - m12, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\r\n\t\t\t\tthis._z = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'YXZ' ) {\r\n\r\n\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\r\n\r\n\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\r\n\t\t\t\tthis._z = Math.atan2( m21, m22 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\r\n\t\t\t\tthis._z = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'ZXY' ) {\r\n\r\n\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\r\n\r\n\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis._y = Math.atan2( - m31, m33 );\r\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis._y = 0;\r\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'ZYX' ) {\r\n\r\n\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\r\n\r\n\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis._x = Math.atan2( m32, m33 );\r\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis._x = 0;\r\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'YZX' ) {\r\n\r\n\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\r\n\r\n\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis._x = Math.atan2( - m23, m22 );\r\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis._x = 0;\r\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'XZY' ) {\r\n\r\n\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\r\n\r\n\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\r\n\t\t\t\tthis._y = Math.atan2( m13, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\r\n\t\t\t\tthis._y = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\r\n\r\n\t\t}\r\n\r\n\t\tthis._order = order;\r\n\r\n\t\tif ( update !== false ) this.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromQuaternion: function () {\r\n\r\n\t\tvar matrix;\r\n\r\n\t\treturn function ( q, order, update ) {\r\n\r\n\t\t\tif ( matrix === undefined ) matrix = new THREE.Matrix4();\r\n\t\t\tmatrix.makeRotationFromQuaternion( q );\r\n\t\t\tthis.setFromRotationMatrix( matrix, order, update );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tsetFromVector3: function ( v, order ) {\r\n\r\n\t\treturn this.set( v.x, v.y, v.z, order || this._order );\r\n\r\n\t},\r\n\r\n\treorder: function () {\r\n\r\n\t\t// WARNING: this discards revolution information -bhouston\r\n\r\n\t\tvar q = new THREE.Quaternion();\r\n\r\n\t\treturn function ( newOrder ) {\r\n\r\n\t\t\tq.setFromEuler( this );\r\n\t\t\tthis.setFromQuaternion( q, newOrder );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tequals: function ( euler ) {\r\n\r\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis._x = array[ 0 ];\r\n\t\tthis._y = array[ 1 ];\r\n\t\tthis._z = array[ 2 ];\r\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\r\n\r\n\t\tthis.onChangeCallback();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tarray[ offset ] = this._x;\r\n\t\tarray[ offset + 1 ] = this._y;\r\n\t\tarray[ offset + 2 ] = this._z;\r\n\t\tarray[ offset + 3 ] = this._order;\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\ttoVector3: function ( optionalResult ) {\r\n\r\n\t\tif ( optionalResult ) {\r\n\r\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn new THREE.Vector3( this._x, this._y, this._z );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tonChange: function ( callback ) {\r\n\r\n\t\tthis.onChangeCallback = callback;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tonChangeCallback: function () {}\r\n\r\n};\r\n\r\n// File:src/math/Line3.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Line3 = function ( start, end ) {\r\n\r\n\tthis.start = ( start !== undefined ) ? start : new THREE.Vector3();\r\n\tthis.end = ( end !== undefined ) ? end : new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Line3.prototype = {\r\n\r\n\tconstructor: THREE.Line3,\r\n\r\n\tset: function ( start, end ) {\r\n\r\n\t\tthis.start.copy( start );\r\n\t\tthis.end.copy( end );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( line ) {\r\n\r\n\t\tthis.start.copy( line.start );\r\n\t\tthis.end.copy( line.end );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcenter: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\r\n\r\n\t},\r\n\r\n\tdelta: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.subVectors( this.end, this.start );\r\n\r\n\t},\r\n\r\n\tdistanceSq: function () {\r\n\r\n\t\treturn this.start.distanceToSquared( this.end );\r\n\r\n\t},\r\n\r\n\tdistance: function () {\r\n\r\n\t\treturn this.start.distanceTo( this.end );\r\n\r\n\t},\r\n\r\n\tat: function ( t, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\r\n\r\n\t},\r\n\r\n\tclosestPointToPointParameter: function () {\r\n\r\n\t\tvar startP = new THREE.Vector3();\r\n\t\tvar startEnd = new THREE.Vector3();\r\n\r\n\t\treturn function ( point, clampToLine ) {\r\n\r\n\t\t\tstartP.subVectors( point, this.start );\r\n\t\t\tstartEnd.subVectors( this.end, this.start );\r\n\r\n\t\t\tvar startEnd2 = startEnd.dot( startEnd );\r\n\t\t\tvar startEnd_startP = startEnd.dot( startP );\r\n\r\n\t\t\tvar t = startEnd_startP / startEnd2;\r\n\r\n\t\t\tif ( clampToLine ) {\r\n\r\n\t\t\t\tt = THREE.Math.clamp( t, 0, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn t;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\r\n\r\n\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( matrix ) {\r\n\r\n\t\tthis.start.applyMatrix4( matrix );\r\n\t\tthis.end.applyMatrix4( matrix );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( line ) {\r\n\r\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Box2.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Box2 = function ( min, max ) {\r\n\r\n\tthis.min = ( min !== undefined ) ? min : new THREE.Vector2( + Infinity, + Infinity );\r\n\tthis.max = ( max !== undefined ) ? max : new THREE.Vector2( - Infinity, - Infinity );\r\n\r\n};\r\n\r\nTHREE.Box2.prototype = {\r\n\r\n\tconstructor: THREE.Box2,\r\n\r\n\tset: function ( min, max ) {\r\n\r\n\t\tthis.min.copy( min );\r\n\t\tthis.max.copy( max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromPoints: function ( points ) {\r\n\r\n\t\tthis.makeEmpty();\r\n\r\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\tthis.expandByPoint( points[ i ] );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromCenterAndSize: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector2();\r\n\r\n\t\treturn function ( center, size ) {\r\n\r\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\r\n\t\t\tthis.min.copy( center ).sub( halfSize );\r\n\t\t\tthis.max.copy( center ).add( halfSize );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( box ) {\r\n\r\n\t\tthis.min.copy( box.min );\r\n\t\tthis.max.copy( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeEmpty: function () {\r\n\r\n\t\tthis.min.x = this.min.y = + Infinity;\r\n\t\tthis.max.x = this.max.y = - Infinity;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tisEmpty: function () {\r\n\r\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\r\n\r\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\r\n\r\n\t},\r\n\r\n\tcenter: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\t\treturn result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\r\n\r\n\t},\r\n\r\n\tsize: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\t\treturn result.subVectors( this.max, this.min );\r\n\r\n\t},\r\n\r\n\texpandByPoint: function ( point ) {\r\n\r\n\t\tthis.min.min( point );\r\n\t\tthis.max.max( point );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\texpandByVector: function ( vector ) {\r\n\r\n\t\tthis.min.sub( vector );\r\n\t\tthis.max.add( vector );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\texpandByScalar: function ( scalar ) {\r\n\r\n\t\tthis.min.addScalar( - scalar );\r\n\t\tthis.max.addScalar( scalar );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\tif ( point.x < this.min.x || point.x > this.max.x ||\r\n\t\t point.y < this.min.y || point.y > this.max.y ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tcontainsBox: function ( box ) {\r\n\r\n\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\r\n\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tgetParameter: function ( point, optionalTarget ) {\r\n\r\n\t\t// This can potentially have a divide by zero if the box\r\n\t\t// has a size dimension of 0.\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\r\n\t\treturn result.set(\r\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\r\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\r\n\t\t);\r\n\r\n\t},\r\n\r\n\tintersectsBox: function ( box ) {\r\n\r\n\t\t// using 6 splitting planes to rule out intersections.\r\n\r\n\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\r\n\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tclampPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\t\treturn result.copy( point ).clamp( this.min, this.max );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector2();\r\n\r\n\t\treturn function ( point ) {\r\n\r\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\r\n\t\t\treturn clampedPoint.sub( point ).length();\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersect: function ( box ) {\r\n\r\n\t\tthis.min.max( box.min );\r\n\t\tthis.max.min( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tunion: function ( box ) {\r\n\r\n\t\tthis.min.min( box.min );\r\n\t\tthis.max.max( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.min.add( offset );\r\n\t\tthis.max.add( offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( box ) {\r\n\r\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Box3.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Box3 = function ( min, max ) {\r\n\r\n\tthis.min = ( min !== undefined ) ? min : new THREE.Vector3( + Infinity, + Infinity, + Infinity );\r\n\tthis.max = ( max !== undefined ) ? max : new THREE.Vector3( - Infinity, - Infinity, - Infinity );\r\n\r\n};\r\n\r\nTHREE.Box3.prototype = {\r\n\r\n\tconstructor: THREE.Box3,\r\n\r\n\tset: function ( min, max ) {\r\n\r\n\t\tthis.min.copy( min );\r\n\t\tthis.max.copy( max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromArray: function ( array ) {\r\n\r\n\t\tvar minX = + Infinity;\r\n\t\tvar minY = + Infinity;\r\n\t\tvar minZ = + Infinity;\r\n\r\n\t\tvar maxX = - Infinity;\r\n\t\tvar maxY = - Infinity;\r\n\t\tvar maxZ = - Infinity;\r\n\r\n\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\r\n\r\n\t\t\tvar x = array[ i ];\r\n\t\t\tvar y = array[ i + 1 ];\r\n\t\t\tvar z = array[ i + 2 ];\r\n\r\n\t\t\tif ( x < minX ) minX = x;\r\n\t\t\tif ( y < minY ) minY = y;\r\n\t\t\tif ( z < minZ ) minZ = z;\r\n\r\n\t\t\tif ( x > maxX ) maxX = x;\r\n\t\t\tif ( y > maxY ) maxY = y;\r\n\t\t\tif ( z > maxZ ) maxZ = z;\r\n\r\n\t\t}\r\n\r\n\t\tthis.min.set( minX, minY, minZ );\r\n\t\tthis.max.set( maxX, maxY, maxZ );\r\n\r\n\t},\r\n\r\n\tsetFromPoints: function ( points ) {\r\n\r\n\t\tthis.makeEmpty();\r\n\r\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\tthis.expandByPoint( points[ i ] );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromCenterAndSize: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( center, size ) {\r\n\r\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\r\n\r\n\t\t\tthis.min.copy( center ).sub( halfSize );\r\n\t\t\tthis.max.copy( center ).add( halfSize );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tsetFromObject: function () {\r\n\r\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\r\n\t\t// accounting for both the object's, and children's, world transforms\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( object ) {\r\n\r\n\t\t\tvar scope = this;\r\n\r\n\t\t\tobject.updateMatrixWorld( true );\r\n\r\n\t\t\tthis.makeEmpty();\r\n\r\n\t\t\tobject.traverse( function ( node ) {\r\n\r\n\t\t\t\tvar geometry = node.geometry;\r\n\r\n\t\t\t\tif ( geometry !== undefined ) {\r\n\r\n\t\t\t\t\tif ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\t\t\t\tvar vertices = geometry.vertices;\r\n\r\n\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\r\n\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\r\n\r\n\t\t\t\t\t\t\tscope.expandByPoint( v1 );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( geometry instanceof THREE.BufferGeometry && geometry.attributes[ 'position' ] !== undefined ) {\r\n\r\n\t\t\t\t\t\tvar positions = geometry.attributes[ 'position' ].array;\r\n\r\n\t\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\tv1.fromArray( positions, i );\r\n\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\r\n\r\n\t\t\t\t\t\t\tscope.expandByPoint( v1 );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( box ) {\r\n\r\n\t\tthis.min.copy( box.min );\r\n\t\tthis.max.copy( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeEmpty: function () {\r\n\r\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\r\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tisEmpty: function () {\r\n\r\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\r\n\r\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\r\n\r\n\t},\r\n\r\n\tcenter: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\r\n\r\n\t},\r\n\r\n\tsize: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.subVectors( this.max, this.min );\r\n\r\n\t},\r\n\r\n\texpandByPoint: function ( point ) {\r\n\r\n\t\tthis.min.min( point );\r\n\t\tthis.max.max( point );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\texpandByVector: function ( vector ) {\r\n\r\n\t\tthis.min.sub( vector );\r\n\t\tthis.max.add( vector );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\texpandByScalar: function ( scalar ) {\r\n\r\n\t\tthis.min.addScalar( - scalar );\r\n\t\tthis.max.addScalar( scalar );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\tif ( point.x < this.min.x || point.x > this.max.x ||\r\n\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\r\n\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tcontainsBox: function ( box ) {\r\n\r\n\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\r\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\r\n\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tgetParameter: function ( point, optionalTarget ) {\r\n\r\n\t\t// This can potentially have a divide by zero if the box\r\n\t\t// has a size dimension of 0.\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn result.set(\r\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\r\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\r\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\r\n\t\t);\r\n\r\n\t},\r\n\r\n\tintersectsBox: function ( box ) {\r\n\r\n\t\t// using 6 splitting planes to rule out intersections.\r\n\r\n\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\r\n\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\r\n\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tintersectsSphere: ( function () {\r\n\r\n\t\tvar closestPoint;\r\n\r\n\t\treturn function intersectsSphere( sphere ) {\r\n\r\n\t\t\tif ( closestPoint === undefined ) closestPoint = new THREE.Vector3();\r\n\r\n\t\t\t// Find the point on the AABB closest to the sphere center.\r\n\t\t\tthis.clampPoint( sphere.center, closestPoint );\r\n\r\n\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\r\n\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\r\n\r\n\t\t};\r\n\r\n\t} )(),\r\n\r\n\tintersectsPlane: function ( plane ) {\r\n\r\n\t\t// We compute the minimum and maximum dot product values. If those values\r\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\r\n\r\n\t\tvar min, max;\r\n\r\n\t\tif ( plane.normal.x > 0 ) {\r\n\r\n\t\t\tmin = plane.normal.x * this.min.x;\r\n\t\t\tmax = plane.normal.x * this.max.x;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tmin = plane.normal.x * this.max.x;\r\n\t\t\tmax = plane.normal.x * this.min.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( plane.normal.y > 0 ) {\r\n\r\n\t\t\tmin += plane.normal.y * this.min.y;\r\n\t\t\tmax += plane.normal.y * this.max.y;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tmin += plane.normal.y * this.max.y;\r\n\t\t\tmax += plane.normal.y * this.min.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( plane.normal.z > 0 ) {\r\n\r\n\t\t\tmin += plane.normal.z * this.min.z;\r\n\t\t\tmax += plane.normal.z * this.max.z;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tmin += plane.normal.z * this.max.z;\r\n\t\t\tmax += plane.normal.z * this.min.z;\r\n\r\n\t\t}\r\n\r\n\t\treturn ( min <= plane.constant && max >= plane.constant );\r\n\r\n\t},\r\n\r\n\tclampPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.copy( point ).clamp( this.min, this.max );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( point ) {\r\n\r\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\r\n\t\t\treturn clampedPoint.sub( point ).length();\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tgetBoundingSphere: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Sphere();\r\n\r\n\t\t\tresult.center = this.center();\r\n\t\t\tresult.radius = this.size( v1 ).length() * 0.5;\r\n\r\n\t\t\treturn result;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersect: function ( box ) {\r\n\r\n\t\tthis.min.max( box.min );\r\n\t\tthis.max.min( box.max );\r\n\r\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\r\n\t\tif( this.isEmpty() ) this.makeEmpty();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tunion: function ( box ) {\r\n\r\n\t\tthis.min.min( box.min );\r\n\t\tthis.max.max( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function () {\r\n\r\n\t\tvar points = [\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3()\r\n\t\t];\r\n\r\n\t\treturn function ( matrix ) {\r\n\r\n\t\t\t// transform of empty box is an empty box.\r\n\t\t\tif( this.isEmpty() ) return this;\r\n\r\n\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\r\n\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\r\n\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\r\n\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\r\n\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\r\n\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\r\n\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\r\n\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\r\n\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\r\n\r\n\t\t\tthis.setFromPoints( points );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.min.add( offset );\r\n\t\tthis.max.add( offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( box ) {\r\n\r\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Matrix3.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author bhouston / http://clara.io\r\n * @author tschw\r\n */\r\n\r\nTHREE.Matrix3 = function () {\r\n\r\n\tthis.elements = new Float32Array( [\r\n\r\n\t\t1, 0, 0,\r\n\t\t0, 1, 0,\r\n\t\t0, 0, 1\r\n\r\n\t] );\r\n\r\n\tif ( arguments.length > 0 ) {\r\n\r\n\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Matrix3.prototype = {\r\n\r\n\tconstructor: THREE.Matrix3,\r\n\r\n\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\r\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\r\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tidentity: function () {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0,\r\n\t\t\t0, 1, 0,\r\n\t\t\t0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().fromArray( this.elements );\r\n\r\n\t},\r\n\r\n\tcopy: function ( m ) {\r\n\r\n\t\tvar me = m.elements;\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\r\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\r\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromMatrix4: function( m ) {\r\n\r\n\t\tvar me = m.elements;\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\r\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\r\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyToVector3Array: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function ( array, offset, length ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\t\t\tif ( offset === undefined ) offset = 0;\r\n\t\t\tif ( length === undefined ) length = array.length;\r\n\r\n\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\r\n\r\n\t\t\t\tv1.fromArray( array, j );\r\n\t\t\t\tv1.applyMatrix3( this );\r\n\t\t\t\tv1.toArray( array, j );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn array;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tapplyToBuffer: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function applyToBuffer( buffer, offset, length ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\t\t\tif ( offset === undefined ) offset = 0;\r\n\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\r\n\r\n\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\r\n\r\n\t\t\t\tv1.x = buffer.getX( j );\r\n\t\t\t\tv1.y = buffer.getY( j );\r\n\t\t\t\tv1.z = buffer.getZ( j );\r\n\r\n\t\t\t\tv1.applyMatrix3( this );\r\n\r\n\t\t\t\tbuffer.setXYZ( v1.x, v1.y, v1.z );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn buffer;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\r\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\r\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdeterminant: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\r\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\r\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\r\n\r\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\r\n\r\n\t},\r\n\r\n\tgetInverse: function ( matrix, throwOnDegenerate ) {\r\n\r\n\t\tif ( matrix instanceof THREE.Matrix4 ) {\r\n\r\n\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\r\n\r\n\t\t}\r\n\r\n\t\tvar me = matrix.elements,\r\n\t\t\tte = this.elements,\r\n\r\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\r\n\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\r\n\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\r\n\r\n\t\t\tt11 = n33 * n22 - n32 * n23,\r\n\t\t\tt12 = n32 * n13 - n33 * n12,\r\n\t\t\tt13 = n23 * n12 - n22 * n13,\r\n\r\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\r\n\r\n\t\tif ( det === 0 ) {\r\n\r\n\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\r\n\r\n\t\t\tif ( throwOnDegenerate || false ) {\r\n\r\n\t\t\t\tthrow new Error( msg );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.warn( msg );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn this.identity();\r\n\t\t}\r\n\r\n\t\tte[ 0 ] = t11;\r\n\t\tte[ 1 ] = n31 * n23 - n33 * n21;\r\n\t\tte[ 2 ] = n32 * n21 - n31 * n22;\r\n\r\n\t\tte[ 3 ] = t12;\r\n\t\tte[ 4 ] = n33 * n11 - n31 * n13;\r\n\t\tte[ 5 ] = n31 * n12 - n32 * n11;\r\n\r\n\t\tte[ 6 ] = t13;\r\n\t\tte[ 7 ] = n21 * n13 - n23 * n11;\r\n\t\tte[ 8 ] = n22 * n11 - n21 * n12;\r\n\r\n\t\treturn this.multiplyScalar( 1 / det );\r\n\r\n\t},\r\n\r\n\ttranspose: function () {\r\n\r\n\t\tvar tmp, m = this.elements;\r\n\r\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\r\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\r\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tflattenToArrayOffset: function ( array, offset ) {\r\n\r\n\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\r\n\t\t\t\t\"- just use .toArray instead.\" );\r\n\r\n\t\treturn this.toArray( array, offset );\r\n\r\n\t},\r\n\r\n\tgetNormalMatrix: function ( matrix4 ) {\r\n\r\n\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\r\n\r\n\t},\r\n\r\n\ttransposeIntoArray: function ( r ) {\r\n\r\n\t\tvar m = this.elements;\r\n\r\n\t\tr[ 0 ] = m[ 0 ];\r\n\t\tr[ 1 ] = m[ 3 ];\r\n\t\tr[ 2 ] = m[ 6 ];\r\n\t\tr[ 3 ] = m[ 1 ];\r\n\t\tr[ 4 ] = m[ 4 ];\r\n\t\tr[ 5 ] = m[ 7 ];\r\n\t\tr[ 6 ] = m[ 2 ];\r\n\t\tr[ 7 ] = m[ 5 ];\r\n\t\tr[ 8 ] = m[ 8 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis.elements.set( array );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tarray[ offset ] = te[ 0 ];\r\n\t\tarray[ offset + 1 ] = te[ 1 ];\r\n\t\tarray[ offset + 2 ] = te[ 2 ];\r\n\r\n\t\tarray[ offset + 3 ] = te[ 3 ];\r\n\t\tarray[ offset + 4 ] = te[ 4 ];\r\n\t\tarray[ offset + 5 ] = te[ 5 ];\r\n\r\n\t\tarray[ offset + 6 ] = te[ 6 ];\r\n\t\tarray[ offset + 7 ] = te[ 7 ];\r\n\t\tarray[ offset + 8 ] = te[ 8 ];\r\n\r\n\t\treturn array;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Matrix4.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author jordi_ros / http://plattsoft.com\r\n * @author D1plo1d / http://github.com/D1plo1d\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author timknip / http://www.floorplanner.com/\r\n * @author bhouston / http://clara.io\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Matrix4 = function () {\r\n\r\n\tthis.elements = new Float32Array( [\r\n\r\n\t\t1, 0, 0, 0,\r\n\t\t0, 1, 0, 0,\r\n\t\t0, 0, 1, 0,\r\n\t\t0, 0, 0, 1\r\n\r\n\t] );\r\n\r\n\tif ( arguments.length > 0 ) {\r\n\r\n\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Matrix4.prototype = {\r\n\r\n\tconstructor: THREE.Matrix4,\r\n\r\n\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\r\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\r\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\r\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tidentity: function () {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0, 0,\r\n\t\t\t0, 1, 0, 0,\r\n\t\t\t0, 0, 1, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Matrix4().fromArray( this.elements );\r\n\r\n\t},\r\n\r\n\tcopy: function ( m ) {\r\n\r\n\t\tthis.elements.set( m.elements );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyPosition: function ( m ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar me = m.elements;\r\n\r\n\t\tte[ 12 ] = me[ 12 ];\r\n\t\tte[ 13 ] = me[ 13 ];\r\n\t\tte[ 14 ] = me[ 14 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\textractBasis: function ( xAxis, yAxis, zAxis ) {\r\n\r\n\t\txAxis.setFromMatrixColumn( this, 0 );\r\n\t\tyAxis.setFromMatrixColumn( this, 1 );\r\n\t\tzAxis.setFromMatrixColumn( this, 2 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\r\n\r\n\t\tthis.set(\r\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\r\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\r\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\r\n\t\t\t0, 0, 0, 1\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\textractRotation: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function ( m ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\r\n\t\t\tvar te = this.elements;\r\n\t\t\tvar me = m.elements;\r\n\r\n\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\r\n\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\r\n\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\r\n\r\n\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\r\n\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\r\n\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\r\n\r\n\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\r\n\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\r\n\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\r\n\r\n\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\r\n\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\r\n\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmakeRotationFromEuler: function ( euler ) {\r\n\r\n\t\tif ( euler instanceof THREE.Euler === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\r\n\r\n\t\t}\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar x = euler.x, y = euler.y, z = euler.z;\r\n\t\tvar a = Math.cos( x ), b = Math.sin( x );\r\n\t\tvar c = Math.cos( y ), d = Math.sin( y );\r\n\t\tvar e = Math.cos( z ), f = Math.sin( z );\r\n\r\n\t\tif ( euler.order === 'XYZ' ) {\r\n\r\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\r\n\r\n\t\t\tte[ 0 ] = c * e;\r\n\t\t\tte[ 4 ] = - c * f;\r\n\t\t\tte[ 8 ] = d;\r\n\r\n\t\t\tte[ 1 ] = af + be * d;\r\n\t\t\tte[ 5 ] = ae - bf * d;\r\n\t\t\tte[ 9 ] = - b * c;\r\n\r\n\t\t\tte[ 2 ] = bf - ae * d;\r\n\t\t\tte[ 6 ] = be + af * d;\r\n\t\t\tte[ 10 ] = a * c;\r\n\r\n\t\t} else if ( euler.order === 'YXZ' ) {\r\n\r\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\r\n\r\n\t\t\tte[ 0 ] = ce + df * b;\r\n\t\t\tte[ 4 ] = de * b - cf;\r\n\t\t\tte[ 8 ] = a * d;\r\n\r\n\t\t\tte[ 1 ] = a * f;\r\n\t\t\tte[ 5 ] = a * e;\r\n\t\t\tte[ 9 ] = - b;\r\n\r\n\t\t\tte[ 2 ] = cf * b - de;\r\n\t\t\tte[ 6 ] = df + ce * b;\r\n\t\t\tte[ 10 ] = a * c;\r\n\r\n\t\t} else if ( euler.order === 'ZXY' ) {\r\n\r\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\r\n\r\n\t\t\tte[ 0 ] = ce - df * b;\r\n\t\t\tte[ 4 ] = - a * f;\r\n\t\t\tte[ 8 ] = de + cf * b;\r\n\r\n\t\t\tte[ 1 ] = cf + de * b;\r\n\t\t\tte[ 5 ] = a * e;\r\n\t\t\tte[ 9 ] = df - ce * b;\r\n\r\n\t\t\tte[ 2 ] = - a * d;\r\n\t\t\tte[ 6 ] = b;\r\n\t\t\tte[ 10 ] = a * c;\r\n\r\n\t\t} else if ( euler.order === 'ZYX' ) {\r\n\r\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\r\n\r\n\t\t\tte[ 0 ] = c * e;\r\n\t\t\tte[ 4 ] = be * d - af;\r\n\t\t\tte[ 8 ] = ae * d + bf;\r\n\r\n\t\t\tte[ 1 ] = c * f;\r\n\t\t\tte[ 5 ] = bf * d + ae;\r\n\t\t\tte[ 9 ] = af * d - be;\r\n\r\n\t\t\tte[ 2 ] = - d;\r\n\t\t\tte[ 6 ] = b * c;\r\n\t\t\tte[ 10 ] = a * c;\r\n\r\n\t\t} else if ( euler.order === 'YZX' ) {\r\n\r\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\r\n\r\n\t\t\tte[ 0 ] = c * e;\r\n\t\t\tte[ 4 ] = bd - ac * f;\r\n\t\t\tte[ 8 ] = bc * f + ad;\r\n\r\n\t\t\tte[ 1 ] = f;\r\n\t\t\tte[ 5 ] = a * e;\r\n\t\t\tte[ 9 ] = - b * e;\r\n\r\n\t\t\tte[ 2 ] = - d * e;\r\n\t\t\tte[ 6 ] = ad * f + bc;\r\n\t\t\tte[ 10 ] = ac - bd * f;\r\n\r\n\t\t} else if ( euler.order === 'XZY' ) {\r\n\r\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\r\n\r\n\t\t\tte[ 0 ] = c * e;\r\n\t\t\tte[ 4 ] = - f;\r\n\t\t\tte[ 8 ] = d * e;\r\n\r\n\t\t\tte[ 1 ] = ac * f + bd;\r\n\t\t\tte[ 5 ] = a * e;\r\n\t\t\tte[ 9 ] = ad * f - bc;\r\n\r\n\t\t\tte[ 2 ] = bc * f - ad;\r\n\t\t\tte[ 6 ] = b * e;\r\n\t\t\tte[ 10 ] = bd * f + ac;\r\n\r\n\t\t}\r\n\r\n\t\t// last column\r\n\t\tte[ 3 ] = 0;\r\n\t\tte[ 7 ] = 0;\r\n\t\tte[ 11 ] = 0;\r\n\r\n\t\t// bottom row\r\n\t\tte[ 12 ] = 0;\r\n\t\tte[ 13 ] = 0;\r\n\t\tte[ 14 ] = 0;\r\n\t\tte[ 15 ] = 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationFromQuaternion: function ( q ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\r\n\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\r\n\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\r\n\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\r\n\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\r\n\r\n\t\tte[ 0 ] = 1 - ( yy + zz );\r\n\t\tte[ 4 ] = xy - wz;\r\n\t\tte[ 8 ] = xz + wy;\r\n\r\n\t\tte[ 1 ] = xy + wz;\r\n\t\tte[ 5 ] = 1 - ( xx + zz );\r\n\t\tte[ 9 ] = yz - wx;\r\n\r\n\t\tte[ 2 ] = xz - wy;\r\n\t\tte[ 6 ] = yz + wx;\r\n\t\tte[ 10 ] = 1 - ( xx + yy );\r\n\r\n\t\t// last column\r\n\t\tte[ 3 ] = 0;\r\n\t\tte[ 7 ] = 0;\r\n\t\tte[ 11 ] = 0;\r\n\r\n\t\t// bottom row\r\n\t\tte[ 12 ] = 0;\r\n\t\tte[ 13 ] = 0;\r\n\t\tte[ 14 ] = 0;\r\n\t\tte[ 15 ] = 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlookAt: function () {\r\n\r\n\t\tvar x, y, z;\r\n\r\n\t\treturn function ( eye, target, up ) {\r\n\r\n\t\t\tif ( x === undefined ) x = new THREE.Vector3();\r\n\t\t\tif ( y === undefined ) y = new THREE.Vector3();\r\n\t\t\tif ( z === undefined ) z = new THREE.Vector3();\r\n\r\n\t\t\tvar te = this.elements;\r\n\r\n\t\t\tz.subVectors( eye, target ).normalize();\r\n\r\n\t\t\tif ( z.lengthSq() === 0 ) {\r\n\r\n\t\t\t\tz.z = 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tx.crossVectors( up, z ).normalize();\r\n\r\n\t\t\tif ( x.lengthSq() === 0 ) {\r\n\r\n\t\t\t\tz.x += 0.0001;\r\n\t\t\t\tx.crossVectors( up, z ).normalize();\r\n\r\n\t\t\t}\r\n\r\n\t\t\ty.crossVectors( z, x );\r\n\r\n\r\n\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\r\n\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\r\n\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmultiply: function ( m, n ) {\r\n\r\n\t\tif ( n !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\r\n\t\t\treturn this.multiplyMatrices( m, n );\r\n\r\n\t\t}\r\n\r\n\t\treturn this.multiplyMatrices( this, m );\r\n\r\n\t},\r\n\r\n\tpremultiply: function ( m ) {\r\n\r\n\t\treturn this.multiplyMatrices( m, this );\r\n\r\n\t},\r\n\r\n\tmultiplyMatrices: function ( a, b ) {\r\n\r\n\t\tvar ae = a.elements;\r\n\t\tvar be = b.elements;\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\r\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\r\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\r\n\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\r\n\r\n\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\r\n\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\r\n\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\r\n\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\r\n\r\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\r\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\r\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\r\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\r\n\r\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\r\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\r\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\r\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\r\n\r\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\r\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\r\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\r\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\r\n\r\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\r\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\r\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\r\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyToArray: function ( a, b, r ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tthis.multiplyMatrices( a, b );\r\n\r\n\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\r\n\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\r\n\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\r\n\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\r\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\r\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\r\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyToVector3Array: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function ( array, offset, length ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\t\t\tif ( offset === undefined ) offset = 0;\r\n\t\t\tif ( length === undefined ) length = array.length;\r\n\r\n\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\r\n\r\n\t\t\t\tv1.fromArray( array, j );\r\n\t\t\t\tv1.applyMatrix4( this );\r\n\t\t\t\tv1.toArray( array, j );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn array;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tapplyToBuffer: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function applyToBuffer( buffer, offset, length ) {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\t\t\tif ( offset === undefined ) offset = 0;\r\n\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\r\n\r\n\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\r\n\r\n\t\t\t\tv1.x = buffer.getX( j );\r\n\t\t\t\tv1.y = buffer.getY( j );\r\n\t\t\t\tv1.z = buffer.getZ( j );\r\n\r\n\t\t\t\tv1.applyMatrix4( this );\r\n\r\n\t\t\t\tbuffer.setXYZ( v1.x, v1.y, v1.z );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn buffer;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tdeterminant: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\r\n\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\r\n\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\r\n\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\r\n\r\n\t\t//TODO: make this more efficient\r\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\r\n\r\n\t\treturn (\r\n\t\t\tn41 * (\r\n\t\t\t\t+ n14 * n23 * n32\r\n\t\t\t\t - n13 * n24 * n32\r\n\t\t\t\t - n14 * n22 * n33\r\n\t\t\t\t + n12 * n24 * n33\r\n\t\t\t\t + n13 * n22 * n34\r\n\t\t\t\t - n12 * n23 * n34\r\n\t\t\t) +\r\n\t\t\tn42 * (\r\n\t\t\t\t+ n11 * n23 * n34\r\n\t\t\t\t - n11 * n24 * n33\r\n\t\t\t\t + n14 * n21 * n33\r\n\t\t\t\t - n13 * n21 * n34\r\n\t\t\t\t + n13 * n24 * n31\r\n\t\t\t\t - n14 * n23 * n31\r\n\t\t\t) +\r\n\t\t\tn43 * (\r\n\t\t\t\t+ n11 * n24 * n32\r\n\t\t\t\t - n11 * n22 * n34\r\n\t\t\t\t - n14 * n21 * n32\r\n\t\t\t\t + n12 * n21 * n34\r\n\t\t\t\t + n14 * n22 * n31\r\n\t\t\t\t - n12 * n24 * n31\r\n\t\t\t) +\r\n\t\t\tn44 * (\r\n\t\t\t\t- n13 * n22 * n31\r\n\t\t\t\t - n11 * n23 * n32\r\n\t\t\t\t + n11 * n22 * n33\r\n\t\t\t\t + n13 * n21 * n32\r\n\t\t\t\t - n12 * n21 * n33\r\n\t\t\t\t + n12 * n23 * n31\r\n\t\t\t)\r\n\r\n\t\t);\r\n\r\n\t},\r\n\r\n\ttranspose: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar tmp;\r\n\r\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\r\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\r\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\r\n\r\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\r\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\r\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tflattenToArrayOffset: function ( array, offset ) {\r\n\r\n\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\r\n\t\t\t\t\"- just use .toArray instead.\" );\r\n\r\n\t\treturn this.toArray( array, offset );\r\n\r\n\t},\r\n\r\n\tgetPosition: function () {\r\n\r\n\t\tvar v1;\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tif ( v1 === undefined ) v1 = new THREE.Vector3();\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\r\n\r\n\t\t\treturn v1.setFromMatrixColumn( this, 3 );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tsetPosition: function ( v ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[ 12 ] = v.x;\r\n\t\tte[ 13 ] = v.y;\r\n\t\tte[ 14 ] = v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetInverse: function ( m, throwOnDegenerate ) {\r\n\r\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\r\n\t\tvar te = this.elements,\r\n\t\t\tme = m.elements,\r\n\r\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\r\n\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\r\n\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\r\n\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\r\n\r\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\r\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\r\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\r\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\r\n\r\n\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\r\n\r\n\t\tif ( det === 0 ) {\r\n\r\n\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\r\n\r\n\t\t\tif ( throwOnDegenerate || false ) {\r\n\r\n\t\t\t\tthrow new Error( msg );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.warn( msg );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn this.identity();\r\n\r\n\t\t}\r\n\r\n\t\tte[ 0 ] = t11;\r\n\t\tte[ 1 ] = n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44;\r\n\t\tte[ 2 ] = n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44;\r\n\t\tte[ 3 ] = n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43;\r\n\r\n\t\tte[ 4 ] = t12;\r\n\t\tte[ 5 ] = n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44;\r\n\t\tte[ 6 ] = n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44;\r\n\t\tte[ 7 ] = n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43;\r\n\r\n\t\tte[ 8 ] = t13;\r\n\t\tte[ 9 ] = n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44;\r\n\t\tte[ 10 ] = n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44;\r\n\t\tte[ 11 ] = n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43;\r\n\r\n\t\tte[ 12 ] = t14;\r\n\t\tte[ 13 ] = n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34;\r\n\t\tte[ 14 ] = n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34;\r\n\t\tte[ 15 ] = n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33;\r\n\r\n\t\treturn this.multiplyScalar( 1 / det );\r\n\r\n\t},\r\n\r\n\tscale: function ( v ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar x = v.x, y = v.y, z = v.z;\r\n\r\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\r\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\r\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\r\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetMaxScaleOnAxis: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\r\n\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\r\n\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\r\n\r\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\r\n\r\n\t},\r\n\r\n\tmakeTranslation: function ( x, y, z ) {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0, x,\r\n\t\t\t0, 1, 0, y,\r\n\t\t\t0, 0, 1, z,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationX: function ( theta ) {\r\n\r\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0, 0,\r\n\t\t\t0, c, - s, 0,\r\n\t\t\t0, s, c, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationY: function ( theta ) {\r\n\r\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t c, 0, s, 0,\r\n\t\t\t 0, 1, 0, 0,\r\n\t\t\t- s, 0, c, 0,\r\n\t\t\t 0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationZ: function ( theta ) {\r\n\r\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tc, - s, 0, 0,\r\n\t\t\ts, c, 0, 0,\r\n\t\t\t0, 0, 1, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationAxis: function ( axis, angle ) {\r\n\r\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\r\n\r\n\t\tvar c = Math.cos( angle );\r\n\t\tvar s = Math.sin( angle );\r\n\t\tvar t = 1 - c;\r\n\t\tvar x = axis.x, y = axis.y, z = axis.z;\r\n\t\tvar tx = t * x, ty = t * y;\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\r\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\r\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\t return this;\r\n\r\n\t},\r\n\r\n\tmakeScale: function ( x, y, z ) {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tx, 0, 0, 0,\r\n\t\t\t0, y, 0, 0,\r\n\t\t\t0, 0, z, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcompose: function ( position, quaternion, scale ) {\r\n\r\n\t\tthis.makeRotationFromQuaternion( quaternion );\r\n\t\tthis.scale( scale );\r\n\t\tthis.setPosition( position );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdecompose: function () {\r\n\r\n\t\tvar vector, matrix;\r\n\r\n\t\treturn function ( position, quaternion, scale ) {\r\n\r\n\t\t\tif ( vector === undefined ) vector = new THREE.Vector3();\r\n\t\t\tif ( matrix === undefined ) matrix = new THREE.Matrix4();\r\n\r\n\t\t\tvar te = this.elements;\r\n\r\n\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\r\n\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\r\n\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\r\n\r\n\t\t\t// if determine is negative, we need to invert one scale\r\n\t\t\tvar det = this.determinant();\r\n\t\t\tif ( det < 0 ) {\r\n\r\n\t\t\t\tsx = - sx;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tposition.x = te[ 12 ];\r\n\t\t\tposition.y = te[ 13 ];\r\n\t\t\tposition.z = te[ 14 ];\r\n\r\n\t\t\t// scale the rotation part\r\n\r\n\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\r\n\r\n\t\t\tvar invSX = 1 / sx;\r\n\t\t\tvar invSY = 1 / sy;\r\n\t\t\tvar invSZ = 1 / sz;\r\n\r\n\t\t\tmatrix.elements[ 0 ] *= invSX;\r\n\t\t\tmatrix.elements[ 1 ] *= invSX;\r\n\t\t\tmatrix.elements[ 2 ] *= invSX;\r\n\r\n\t\t\tmatrix.elements[ 4 ] *= invSY;\r\n\t\t\tmatrix.elements[ 5 ] *= invSY;\r\n\t\t\tmatrix.elements[ 6 ] *= invSY;\r\n\r\n\t\t\tmatrix.elements[ 8 ] *= invSZ;\r\n\t\t\tmatrix.elements[ 9 ] *= invSZ;\r\n\t\t\tmatrix.elements[ 10 ] *= invSZ;\r\n\r\n\t\t\tquaternion.setFromRotationMatrix( matrix );\r\n\r\n\t\t\tscale.x = sx;\r\n\t\t\tscale.y = sy;\r\n\t\t\tscale.z = sz;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar x = 2 * near / ( right - left );\r\n\t\tvar y = 2 * near / ( top - bottom );\r\n\r\n\t\tvar a = ( right + left ) / ( right - left );\r\n\t\tvar b = ( top + bottom ) / ( top - bottom );\r\n\t\tvar c = - ( far + near ) / ( far - near );\r\n\t\tvar d = - 2 * far * near / ( far - near );\r\n\r\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\r\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\r\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\r\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakePerspective: function ( fov, aspect, near, far ) {\r\n\r\n\t\tvar ymax = near * Math.tan( THREE.Math.DEG2RAD * fov * 0.5 );\r\n\t\tvar ymin = - ymax;\r\n\t\tvar xmin = ymin * aspect;\r\n\t\tvar xmax = ymax * aspect;\r\n\r\n\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\r\n\r\n\t},\r\n\r\n\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar w = 1.0 / ( right - left );\r\n\t\tvar h = 1.0 / ( top - bottom );\r\n\t\tvar p = 1.0 / ( far - near );\r\n\r\n\t\tvar x = ( right + left ) * w;\r\n\t\tvar y = ( top + bottom ) * h;\r\n\t\tvar z = ( far + near ) * p;\r\n\r\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\r\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\r\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\r\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( matrix ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar me = matrix.elements;\r\n\r\n\t\tfor ( var i = 0; i < 16; i ++ ) {\r\n\r\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis.elements.set( array );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function ( array, offset ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tarray[ offset ] = te[ 0 ];\r\n\t\tarray[ offset + 1 ] = te[ 1 ];\r\n\t\tarray[ offset + 2 ] = te[ 2 ];\r\n\t\tarray[ offset + 3 ] = te[ 3 ];\r\n\r\n\t\tarray[ offset + 4 ] = te[ 4 ];\r\n\t\tarray[ offset + 5 ] = te[ 5 ];\r\n\t\tarray[ offset + 6 ] = te[ 6 ];\r\n\t\tarray[ offset + 7 ] = te[ 7 ];\r\n\r\n\t\tarray[ offset + 8 ] = te[ 8 ];\r\n\t\tarray[ offset + 9 ] = te[ 9 ];\r\n\t\tarray[ offset + 10 ] = te[ 10 ];\r\n\t\tarray[ offset + 11 ] = te[ 11 ];\r\n\r\n\t\tarray[ offset + 12 ] = te[ 12 ];\r\n\t\tarray[ offset + 13 ] = te[ 13 ];\r\n\t\tarray[ offset + 14 ] = te[ 14 ];\r\n\t\tarray[ offset + 15 ] = te[ 15 ];\r\n\r\n\t\treturn array;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Ray.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Ray = function ( origin, direction ) {\r\n\r\n\tthis.origin = ( origin !== undefined ) ? origin : new THREE.Vector3();\r\n\tthis.direction = ( direction !== undefined ) ? direction : new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Ray.prototype = {\r\n\r\n\tconstructor: THREE.Ray,\r\n\r\n\tset: function ( origin, direction ) {\r\n\r\n\t\tthis.origin.copy( origin );\r\n\t\tthis.direction.copy( direction );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( ray ) {\r\n\r\n\t\tthis.origin.copy( ray.origin );\r\n\t\tthis.direction.copy( ray.direction );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tat: function ( t, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\r\n\r\n\t},\r\n\r\n\tlookAt: function ( v ) {\r\n\r\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\r\n\r\n\t},\r\n\r\n\trecast: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( t ) {\r\n\r\n\t\t\tthis.origin.copy( this.at( t, v1 ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclosestPointToPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\tresult.subVectors( point, this.origin );\r\n\t\tvar directionDistance = result.dot( this.direction );\r\n\r\n\t\tif ( directionDistance < 0 ) {\r\n\r\n\t\t\treturn result.copy( this.origin );\r\n\r\n\t\t}\r\n\r\n\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function ( point ) {\r\n\r\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\r\n\r\n\t},\r\n\r\n\tdistanceSqToPoint: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( point ) {\r\n\r\n\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\r\n\r\n\t\t\t// point behind the ray\r\n\r\n\t\t\tif ( directionDistance < 0 ) {\r\n\r\n\t\t\t\treturn this.origin.distanceToSquared( point );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\r\n\r\n\t\t\treturn v1.distanceToSquared( point );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tdistanceSqToSegment: function () {\r\n\r\n\t\tvar segCenter = new THREE.Vector3();\r\n\t\tvar segDir = new THREE.Vector3();\r\n\t\tvar diff = new THREE.Vector3();\r\n\r\n\t\treturn function ( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\r\n\r\n\t\t\t// from http://www.geometrictools.com/LibMathematics/Distance/Wm5DistRay3Segment3.cpp\r\n\t\t\t// It returns the min distance between the ray and the segment\r\n\t\t\t// defined by v0 and v1\r\n\t\t\t// It can also set two optional targets :\r\n\t\t\t// - The closest point on the ray\r\n\t\t\t// - The closest point on the segment\r\n\r\n\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\r\n\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\r\n\t\t\tdiff.copy( this.origin ).sub( segCenter );\r\n\r\n\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\r\n\t\t\tvar a01 = - this.direction.dot( segDir );\r\n\t\t\tvar b0 = diff.dot( this.direction );\r\n\t\t\tvar b1 = - diff.dot( segDir );\r\n\t\t\tvar c = diff.lengthSq();\r\n\t\t\tvar det = Math.abs( 1 - a01 * a01 );\r\n\t\t\tvar s0, s1, sqrDist, extDet;\r\n\r\n\t\t\tif ( det > 0 ) {\r\n\r\n\t\t\t\t// The ray and segment are not parallel.\r\n\r\n\t\t\t\ts0 = a01 * b1 - b0;\r\n\t\t\t\ts1 = a01 * b0 - b1;\r\n\t\t\t\textDet = segExtent * det;\r\n\r\n\t\t\t\tif ( s0 >= 0 ) {\r\n\r\n\t\t\t\t\tif ( s1 >= - extDet ) {\r\n\r\n\t\t\t\t\t\tif ( s1 <= extDet ) {\r\n\r\n\t\t\t\t\t\t\t// region 0\r\n\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\r\n\r\n\t\t\t\t\t\t\tvar invDet = 1 / det;\r\n\t\t\t\t\t\t\ts0 *= invDet;\r\n\t\t\t\t\t\t\ts1 *= invDet;\r\n\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t// region 1\r\n\r\n\t\t\t\t\t\t\ts1 = segExtent;\r\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\r\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// region 5\r\n\r\n\t\t\t\t\t\ts1 = - segExtent;\r\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\r\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tif ( s1 <= - extDet ) {\r\n\r\n\t\t\t\t\t\t// region 4\r\n\r\n\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\r\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\r\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t\t\t} else if ( s1 <= extDet ) {\r\n\r\n\t\t\t\t\t\t// region 3\r\n\r\n\t\t\t\t\t\ts0 = 0;\r\n\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\r\n\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// region 2\r\n\r\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\r\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\r\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Ray and segment are parallel.\r\n\r\n\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\r\n\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\r\n\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( optionalPointOnRay ) {\r\n\r\n\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( optionalPointOnSegment ) {\r\n\r\n\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn sqrDist;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersectSphere: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( sphere, optionalTarget ) {\r\n\r\n\t\t\tv1.subVectors( sphere.center, this.origin );\r\n\t\t\tvar tca = v1.dot( this.direction );\r\n\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\r\n\t\t\tvar radius2 = sphere.radius * sphere.radius;\r\n\r\n\t\t\tif ( d2 > radius2 ) return null;\r\n\r\n\t\t\tvar thc = Math.sqrt( radius2 - d2 );\r\n\r\n\t\t\t// t0 = first intersect point - entrance on front of sphere\r\n\t\t\tvar t0 = tca - thc;\r\n\r\n\t\t\t// t1 = second intersect point - exit point on back of sphere\r\n\t\t\tvar t1 = tca + thc;\r\n\r\n\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\r\n\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\r\n\r\n\t\t\t// test to see if t0 is behind the ray:\r\n\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\r\n\t\t\t// in order to always return an intersect point that is in front of the ray.\r\n\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\r\n\r\n\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\r\n\t\t\treturn this.at( t0, optionalTarget );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersectsSphere: function ( sphere ) {\r\n\r\n\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\r\n\r\n\t},\r\n\r\n\tdistanceToPlane: function ( plane ) {\r\n\r\n\t\tvar denominator = plane.normal.dot( this.direction );\r\n\r\n\t\tif ( denominator === 0 ) {\r\n\r\n\t\t\t// line is coplanar, return origin\r\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\r\n\r\n\t\t\t\treturn 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\r\n\r\n\t\t\treturn null;\r\n\r\n\t\t}\r\n\r\n\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\r\n\r\n\t\t// Return if the ray never intersects the plane\r\n\r\n\t\treturn t >= 0 ? t : null;\r\n\r\n\t},\r\n\r\n\tintersectPlane: function ( plane, optionalTarget ) {\r\n\r\n\t\tvar t = this.distanceToPlane( plane );\r\n\r\n\t\tif ( t === null ) {\r\n\r\n\t\t\treturn null;\r\n\r\n\t\t}\r\n\r\n\t\treturn this.at( t, optionalTarget );\r\n\r\n\t},\r\n\r\n\r\n\r\n\tintersectsPlane: function ( plane ) {\r\n\r\n\t\t// check if the ray lies on the plane first\r\n\r\n\t\tvar distToPoint = plane.distanceToPoint( this.origin );\r\n\r\n\t\tif ( distToPoint === 0 ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\tvar denominator = plane.normal.dot( this.direction );\r\n\r\n\t\tif ( denominator * distToPoint < 0 ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\t// ray origin is behind the plane (and is pointing behind it)\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tintersectBox: function ( box, optionalTarget ) {\r\n\r\n\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\r\n\r\n\t\tvar invdirx = 1 / this.direction.x,\r\n\t\t\tinvdiry = 1 / this.direction.y,\r\n\t\t\tinvdirz = 1 / this.direction.z;\r\n\r\n\t\tvar origin = this.origin;\r\n\r\n\t\tif ( invdirx >= 0 ) {\r\n\r\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\r\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\r\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\r\n\r\n\t\t}\r\n\r\n\t\tif ( invdiry >= 0 ) {\r\n\r\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\r\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\r\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\r\n\r\n\t\t}\r\n\r\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\r\n\r\n\t\t// These lines also handle the case where tmin or tmax is NaN\r\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\r\n\r\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\r\n\r\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\r\n\r\n\t\tif ( invdirz >= 0 ) {\r\n\r\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\r\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\r\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\r\n\r\n\t\t}\r\n\r\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\r\n\r\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\r\n\r\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\r\n\r\n\t\t//return point closest to the ray (positive side)\r\n\r\n\t\tif ( tmax < 0 ) return null;\r\n\r\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\r\n\r\n\t},\r\n\r\n\tintersectsBox: ( function () {\r\n\r\n\t\tvar v = new THREE.Vector3();\r\n\r\n\t\treturn function ( box ) {\r\n\r\n\t\t\treturn this.intersectBox( box, v ) !== null;\r\n\r\n\t\t};\r\n\r\n\t} )(),\r\n\r\n\tintersectTriangle: function () {\r\n\r\n\t\t// Compute the offset origin, edges, and normal.\r\n\t\tvar diff = new THREE.Vector3();\r\n\t\tvar edge1 = new THREE.Vector3();\r\n\t\tvar edge2 = new THREE.Vector3();\r\n\t\tvar normal = new THREE.Vector3();\r\n\r\n\t\treturn function ( a, b, c, backfaceCulling, optionalTarget ) {\r\n\r\n\t\t\t// from http://www.geometrictools.com/LibMathematics/Intersection/Wm5IntrRay3Triangle3.cpp\r\n\r\n\t\t\tedge1.subVectors( b, a );\r\n\t\t\tedge2.subVectors( c, a );\r\n\t\t\tnormal.crossVectors( edge1, edge2 );\r\n\r\n\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\r\n\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\r\n\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\r\n\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\r\n\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\r\n\t\t\tvar DdN = this.direction.dot( normal );\r\n\t\t\tvar sign;\r\n\r\n\t\t\tif ( DdN > 0 ) {\r\n\r\n\t\t\t\tif ( backfaceCulling ) return null;\r\n\t\t\t\tsign = 1;\r\n\r\n\t\t\t} else if ( DdN < 0 ) {\r\n\r\n\t\t\t\tsign = - 1;\r\n\t\t\t\tDdN = - DdN;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\treturn null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tdiff.subVectors( this.origin, a );\r\n\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\r\n\r\n\t\t\t// b1 < 0, no intersection\r\n\t\t\tif ( DdQxE2 < 0 ) {\r\n\r\n\t\t\t\treturn null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\r\n\r\n\t\t\t// b2 < 0, no intersection\r\n\t\t\tif ( DdE1xQ < 0 ) {\r\n\r\n\t\t\t\treturn null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// b1+b2 > 1, no intersection\r\n\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\r\n\r\n\t\t\t\treturn null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Line intersects triangle, check if ray does.\r\n\t\t\tvar QdN = - sign * diff.dot( normal );\r\n\r\n\t\t\t// t < 0, no intersection\r\n\t\t\tif ( QdN < 0 ) {\r\n\r\n\t\t\t\treturn null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Ray intersects triangle.\r\n\t\t\treturn this.at( QdN / DdN, optionalTarget );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tapplyMatrix4: function ( matrix4 ) {\r\n\r\n\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\r\n\t\tthis.origin.applyMatrix4( matrix4 );\r\n\t\tthis.direction.sub( this.origin );\r\n\t\tthis.direction.normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( ray ) {\r\n\r\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Sphere.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Sphere = function ( center, radius ) {\r\n\r\n\tthis.center = ( center !== undefined ) ? center : new THREE.Vector3();\r\n\tthis.radius = ( radius !== undefined ) ? radius : 0;\r\n\r\n};\r\n\r\nTHREE.Sphere.prototype = {\r\n\r\n\tconstructor: THREE.Sphere,\r\n\r\n\tset: function ( center, radius ) {\r\n\r\n\t\tthis.center.copy( center );\r\n\t\tthis.radius = radius;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromPoints: function () {\r\n\r\n\t\tvar box = new THREE.Box3();\r\n\r\n\t\treturn function ( points, optionalCenter ) {\r\n\r\n\t\t\tvar center = this.center;\r\n\r\n\t\t\tif ( optionalCenter !== undefined ) {\r\n\r\n\t\t\t\tcenter.copy( optionalCenter );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbox.setFromPoints( points ).center( center );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar maxRadiusSq = 0;\r\n\r\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( sphere ) {\r\n\r\n\t\tthis.center.copy( sphere.center );\r\n\t\tthis.radius = sphere.radius;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tempty: function () {\r\n\r\n\t\treturn ( this.radius <= 0 );\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function ( point ) {\r\n\r\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\r\n\r\n\t},\r\n\r\n\tintersectsSphere: function ( sphere ) {\r\n\r\n\t\tvar radiusSum = this.radius + sphere.radius;\r\n\r\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\r\n\r\n\t},\r\n\r\n\tintersectsBox: function ( box ) {\r\n\r\n\t\treturn box.intersectsSphere( this );\r\n\r\n\t},\r\n\r\n\tintersectsPlane: function ( plane ) {\r\n\r\n\t\t// We use the following equation to compute the signed distance from\r\n\t\t// the center of the sphere to the plane.\r\n\t\t//\r\n\t\t// distance = q * n - d\r\n\t\t//\r\n\t\t// If this distance is greater than the radius of the sphere,\r\n\t\t// then there is no intersection.\r\n\r\n\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\r\n\r\n\t},\r\n\r\n\tclampPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\tresult.copy( point );\r\n\r\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\r\n\r\n\t\t\tresult.sub( this.center ).normalize();\r\n\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t},\r\n\r\n\tgetBoundingBox: function ( optionalTarget ) {\r\n\r\n\t\tvar box = optionalTarget || new THREE.Box3();\r\n\r\n\t\tbox.set( this.center, this.center );\r\n\t\tbox.expandByScalar( this.radius );\r\n\r\n\t\treturn box;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( matrix ) {\r\n\r\n\t\tthis.center.applyMatrix4( matrix );\r\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.center.add( offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( sphere ) {\r\n\r\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Frustum.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) {\r\n\r\n\tthis.planes = [\r\n\r\n\t\t( p0 !== undefined ) ? p0 : new THREE.Plane(),\r\n\t\t( p1 !== undefined ) ? p1 : new THREE.Plane(),\r\n\t\t( p2 !== undefined ) ? p2 : new THREE.Plane(),\r\n\t\t( p3 !== undefined ) ? p3 : new THREE.Plane(),\r\n\t\t( p4 !== undefined ) ? p4 : new THREE.Plane(),\r\n\t\t( p5 !== undefined ) ? p5 : new THREE.Plane()\r\n\r\n\t];\r\n\r\n};\r\n\r\nTHREE.Frustum.prototype = {\r\n\r\n\tconstructor: THREE.Frustum,\r\n\r\n\tset: function ( p0, p1, p2, p3, p4, p5 ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\r\n\t\tplanes[ 0 ].copy( p0 );\r\n\t\tplanes[ 1 ].copy( p1 );\r\n\t\tplanes[ 2 ].copy( p2 );\r\n\t\tplanes[ 3 ].copy( p3 );\r\n\t\tplanes[ 4 ].copy( p4 );\r\n\t\tplanes[ 5 ].copy( p5 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( frustum ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\r\n\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromMatrix: function ( m ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\t\tvar me = m.elements;\r\n\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\r\n\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\r\n\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\r\n\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\r\n\r\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\r\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\r\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\r\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\r\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\r\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tintersectsObject: function () {\r\n\r\n\t\tvar sphere = new THREE.Sphere();\r\n\r\n\t\treturn function ( object ) {\r\n\r\n\t\t\tvar geometry = object.geometry;\r\n\r\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\r\n\r\n\t\t\tsphere.copy( geometry.boundingSphere );\r\n\t\t\tsphere.applyMatrix4( object.matrixWorld );\r\n\r\n\t\t\treturn this.intersectsSphere( sphere );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersectsSphere: function ( sphere ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\t\tvar center = sphere.center;\r\n\t\tvar negRadius = - sphere.radius;\r\n\r\n\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tvar distance = planes[ i ].distanceToPoint( center );\r\n\r\n\t\t\tif ( distance < negRadius ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tintersectsBox: function () {\r\n\r\n\t\tvar p1 = new THREE.Vector3(),\r\n\t\t\tp2 = new THREE.Vector3();\r\n\r\n\t\treturn function ( box ) {\r\n\r\n\t\t\tvar planes = this.planes;\r\n\r\n\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\r\n\r\n\t\t\t\tvar plane = planes[ i ];\r\n\r\n\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\r\n\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\r\n\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\r\n\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\r\n\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\r\n\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\r\n\r\n\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\r\n\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\r\n\r\n\t\t\t\t// if both outside plane, no intersection\r\n\r\n\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\r\n\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Plane.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Plane = function ( normal, constant ) {\r\n\r\n\tthis.normal = ( normal !== undefined ) ? normal : new THREE.Vector3( 1, 0, 0 );\r\n\tthis.constant = ( constant !== undefined ) ? constant : 0;\r\n\r\n};\r\n\r\nTHREE.Plane.prototype = {\r\n\r\n\tconstructor: THREE.Plane,\r\n\r\n\tset: function ( normal, constant ) {\r\n\r\n\t\tthis.normal.copy( normal );\r\n\t\tthis.constant = constant;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponents: function ( x, y, z, w ) {\r\n\r\n\t\tthis.normal.set( x, y, z );\r\n\t\tthis.constant = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\r\n\r\n\t\tthis.normal.copy( normal );\r\n\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromCoplanarPoints: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\t\tvar v2 = new THREE.Vector3();\r\n\r\n\t\treturn function ( a, b, c ) {\r\n\r\n\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\r\n\r\n\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\r\n\r\n\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( plane ) {\r\n\r\n\t\tthis.normal.copy( plane.normal );\r\n\t\tthis.constant = plane.constant;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\r\n\r\n\t\tvar inverseNormalLength = 1.0 / this.normal.length();\r\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\r\n\t\tthis.constant *= inverseNormalLength;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function () {\r\n\r\n\t\tthis.constant *= - 1;\r\n\t\tthis.normal.negate();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function ( point ) {\r\n\r\n\t\treturn this.normal.dot( point ) + this.constant;\r\n\r\n\t},\r\n\r\n\tdistanceToSphere: function ( sphere ) {\r\n\r\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\r\n\r\n\t},\r\n\r\n\tprojectPoint: function ( point, optionalTarget ) {\r\n\r\n\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\r\n\r\n\t},\r\n\r\n\torthoPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\r\n\r\n\t},\r\n\r\n\tintersectLine: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( line, optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\t\tvar direction = line.delta( v1 );\r\n\r\n\t\t\tvar denominator = this.normal.dot( direction );\r\n\r\n\t\t\tif ( denominator === 0 ) {\r\n\r\n\t\t\t\t// line is coplanar, return origin\r\n\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\r\n\r\n\t\t\t\t\treturn result.copy( line.start );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Unsure if this is the correct method to handle this case.\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\r\n\r\n\t\t\tif ( t < 0 || t > 1 ) {\r\n\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersectsLine: function ( line ) {\r\n\r\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\r\n\r\n\t\tvar startSign = this.distanceToPoint( line.start );\r\n\t\tvar endSign = this.distanceToPoint( line.end );\r\n\r\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\r\n\r\n\t},\r\n\r\n\tintersectsBox: function ( box ) {\r\n\r\n\t\treturn box.intersectsPlane( this );\r\n\r\n\t},\r\n\r\n\tintersectsSphere: function ( sphere ) {\r\n\r\n\t\treturn sphere.intersectsPlane( this );\r\n\r\n\t},\r\n\r\n\tcoplanarPoint: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\t\tvar m1 = new THREE.Matrix3();\r\n\r\n\t\treturn function ( matrix, optionalNormalMatrix ) {\r\n\r\n\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\r\n\r\n\t\t\t// transform normal based on theory here:\r\n\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\r\n\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\r\n\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\r\n\t\t\tthis.constant = - referencePoint.dot( normal );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.constant = this.constant - offset.dot( this.normal );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( plane ) {\r\n\r\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Spherical.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n * @author WestLangley / http://github.com/WestLangley\r\n *\r\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\r\n *\r\n * The poles (phi) are at the positive and negative y axis.\r\n * The equator starts at positive z.\r\n */\r\n\r\nTHREE.Spherical = function ( radius, phi, theta ) {\r\n\r\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\r\n\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\r\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.Spherical.prototype = {\r\n\r\n\tconstructor: THREE.Spherical,\r\n\r\n\tset: function ( radius, phi, theta ) {\r\n\r\n\t\tthis.radius = radius;\r\n\t\tthis.phi = phi;\r\n\t\tthis.theta = theta;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( other ) {\r\n\r\n\t\tthis.radius.copy( other.radius );\r\n\t\tthis.phi.copy( other.phi );\r\n\t\tthis.theta.copy( other.theta );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// restrict phi to be betwee EPS and PI-EPS\r\n\tmakeSafe: function() {\r\n\r\n\t\tvar EPS = 0.000001;\r\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\r\n\r\n\t},\r\n\r\n\tsetFromVector3: function( vec3 ) {\r\n\r\n\t\tthis.radius = vec3.length();\r\n\r\n\t\tif ( this.radius === 0 ) {\r\n\r\n\t\t\tthis.theta = 0;\r\n\t\t\tthis.phi = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\r\n\t\t\tthis.phi = Math.acos( THREE.Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n};\r\n\r\n// File:src/math/Math.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Math = {\r\n\r\n\tDEG2RAD: Math.PI / 180,\r\n\tRAD2DEG: 180 / Math.PI,\r\n\r\n\tgenerateUUID: function () {\r\n\r\n\t\t// http://www.broofa.com/Tools/Math.uuid.htm\r\n\r\n\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\r\n\t\tvar uuid = new Array( 36 );\r\n\t\tvar rnd = 0, r;\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tfor ( var i = 0; i < 36; i ++ ) {\r\n\r\n\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\r\n\r\n\t\t\t\t\tuuid[ i ] = '-';\r\n\r\n\t\t\t\t} else if ( i === 14 ) {\r\n\r\n\t\t\t\t\tuuid[ i ] = '4';\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\r\n\t\t\t\t\tr = rnd & 0xf;\r\n\t\t\t\t\trnd = rnd >> 4;\r\n\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn uuid.join( '' );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclamp: function ( value, min, max ) {\r\n\r\n\t\treturn Math.max( min, Math.min( max, value ) );\r\n\r\n\t},\r\n\r\n\t// compute euclidian modulo of m % n\r\n\t// https://en.wikipedia.org/wiki/Modulo_operation\r\n\r\n\teuclideanModulo: function ( n, m ) {\r\n\r\n\t\treturn ( ( n % m ) + m ) % m;\r\n\r\n\t},\r\n\r\n\t// Linear mapping from range to range \r\n\r\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\r\n\r\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\r\n\r\n\t},\r\n\r\n\t// http://en.wikipedia.org/wiki/Smoothstep\r\n\r\n\tsmoothstep: function ( x, min, max ) {\r\n\r\n\t\tif ( x <= min ) return 0;\r\n\t\tif ( x >= max ) return 1;\r\n\r\n\t\tx = ( x - min ) / ( max - min );\r\n\r\n\t\treturn x * x * ( 3 - 2 * x );\r\n\r\n\t},\r\n\r\n\tsmootherstep: function ( x, min, max ) {\r\n\r\n\t\tif ( x <= min ) return 0;\r\n\t\tif ( x >= max ) return 1;\r\n\r\n\t\tx = ( x - min ) / ( max - min );\r\n\r\n\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\r\n\r\n\t},\r\n\r\n\trandom16: function () {\r\n\r\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\r\n\t\treturn Math.random();\r\n\r\n\t},\r\n\r\n\t// Random integer from interval\r\n\r\n\trandInt: function ( low, high ) {\r\n\r\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\r\n\r\n\t},\r\n\r\n\t// Random float from interval\r\n\r\n\trandFloat: function ( low, high ) {\r\n\r\n\t\treturn low + Math.random() * ( high - low );\r\n\r\n\t},\r\n\r\n\t// Random float from <-range/2, range/2> interval\r\n\r\n\trandFloatSpread: function ( range ) {\r\n\r\n\t\treturn range * ( 0.5 - Math.random() );\r\n\r\n\t},\r\n\r\n\tdegToRad: function ( degrees ) {\r\n\r\n\t\treturn degrees * THREE.Math.DEG2RAD;\r\n\r\n\t},\r\n\r\n\tradToDeg: function ( radians ) {\r\n\r\n\t\treturn radians * THREE.Math.RAD2DEG;\r\n\r\n\t},\r\n\r\n\tisPowerOfTwo: function ( value ) {\r\n\r\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\r\n\r\n\t},\r\n\r\n\tnearestPowerOfTwo: function ( value ) {\r\n\r\n\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\r\n\r\n\t},\r\n\r\n\tnextPowerOfTwo: function ( value ) {\r\n\r\n\t\tvalue --;\r\n\t\tvalue |= value >> 1;\r\n\t\tvalue |= value >> 2;\r\n\t\tvalue |= value >> 4;\r\n\t\tvalue |= value >> 8;\r\n\t\tvalue |= value >> 16;\r\n\t\tvalue ++;\r\n\r\n\t\treturn value;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Spline.js\r\n\r\n/**\r\n * Spline from Tween.js, slightly optimized (and trashed)\r\n * http://sole.github.com/tween.js/examples/05_spline.html\r\n *\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Spline = function ( points ) {\r\n\r\n\tthis.points = points;\r\n\r\n\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\r\n\tpoint, intPoint, weight, w2, w3,\r\n\tpa, pb, pc, pd;\r\n\r\n\tthis.initFromArray = function ( a ) {\r\n\r\n\t\tthis.points = [];\r\n\r\n\t\tfor ( var i = 0; i < a.length; i ++ ) {\r\n\r\n\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.getPoint = function ( k ) {\r\n\r\n\t\tpoint = ( this.points.length - 1 ) * k;\r\n\t\tintPoint = Math.floor( point );\r\n\t\tweight = point - intPoint;\r\n\r\n\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\r\n\t\tc[ 1 ] = intPoint;\r\n\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\r\n\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\r\n\r\n\t\tpa = this.points[ c[ 0 ] ];\r\n\t\tpb = this.points[ c[ 1 ] ];\r\n\t\tpc = this.points[ c[ 2 ] ];\r\n\t\tpd = this.points[ c[ 3 ] ];\r\n\r\n\t\tw2 = weight * weight;\r\n\t\tw3 = weight * w2;\r\n\r\n\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\r\n\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\r\n\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\r\n\r\n\t\treturn v3;\r\n\r\n\t};\r\n\r\n\tthis.getControlPointsArray = function () {\r\n\r\n\t\tvar i, p, l = this.points.length,\r\n\t\t\tcoords = [];\r\n\r\n\t\tfor ( i = 0; i < l; i ++ ) {\r\n\r\n\t\t\tp = this.points[ i ];\r\n\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\r\n\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\r\n\t};\r\n\r\n\t// approximate length by summing linear segments\r\n\r\n\tthis.getLength = function ( nSubDivisions ) {\r\n\r\n\t\tvar i, index, nSamples, position,\r\n\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\r\n\t\t\toldPosition = new THREE.Vector3(),\r\n\t\t\ttmpVec = new THREE.Vector3(),\r\n\t\t\tchunkLengths = [],\r\n\t\t\ttotalLength = 0;\r\n\r\n\t\t// first point has 0 length\r\n\r\n\t\tchunkLengths[ 0 ] = 0;\r\n\r\n\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\r\n\r\n\t\tnSamples = this.points.length * nSubDivisions;\r\n\r\n\t\toldPosition.copy( this.points[ 0 ] );\r\n\r\n\t\tfor ( i = 1; i < nSamples; i ++ ) {\r\n\r\n\t\t\tindex = i / nSamples;\r\n\r\n\t\t\tposition = this.getPoint( index );\r\n\t\t\ttmpVec.copy( position );\r\n\r\n\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\r\n\r\n\t\t\toldPosition.copy( position );\r\n\r\n\t\t\tpoint = ( this.points.length - 1 ) * index;\r\n\t\t\tintPoint = Math.floor( point );\r\n\r\n\t\t\tif ( intPoint !== oldIntPoint ) {\r\n\r\n\t\t\t\tchunkLengths[ intPoint ] = totalLength;\r\n\t\t\t\toldIntPoint = intPoint;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// last point ends with total length\r\n\r\n\t\tchunkLengths[ chunkLengths.length ] = totalLength;\r\n\r\n\t\treturn { chunks: chunkLengths, total: totalLength };\r\n\r\n\t};\r\n\r\n\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\r\n\r\n\t\tvar i, j,\r\n\t\t\tindex, indexCurrent, indexNext,\r\n\t\t\trealDistance,\r\n\t\t\tsampling, position,\r\n\t\t\tnewpoints = [],\r\n\t\t\ttmpVec = new THREE.Vector3(),\r\n\t\t\tsl = this.getLength();\r\n\r\n\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\r\n\r\n\t\tfor ( i = 1; i < this.points.length; i ++ ) {\r\n\r\n\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\r\n\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\r\n\r\n\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\r\n\r\n\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\r\n\r\n\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\r\n\t\t\tindexNext = i / ( this.points.length - 1 );\r\n\r\n\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\r\n\r\n\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\r\n\r\n\t\t\t\tposition = this.getPoint( index );\r\n\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\r\n\r\n\t\t}\r\n\r\n\t\tthis.points = newpoints;\r\n\r\n\t};\r\n\r\n\t// Catmull-Rom\r\n\r\n\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\r\n\r\n\t\tvar v0 = ( p2 - p0 ) * 0.5,\r\n\t\t\tv1 = ( p3 - p1 ) * 0.5;\r\n\r\n\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Triangle.js\r\n\r\n/**\r\n * @author bhouston / http://clara.io\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Triangle = function ( a, b, c ) {\r\n\r\n\tthis.a = ( a !== undefined ) ? a : new THREE.Vector3();\r\n\tthis.b = ( b !== undefined ) ? b : new THREE.Vector3();\r\n\tthis.c = ( c !== undefined ) ? c : new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Triangle.normal = function () {\r\n\r\n\tvar v0 = new THREE.Vector3();\r\n\r\n\treturn function ( a, b, c, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\tresult.subVectors( c, b );\r\n\t\tv0.subVectors( a, b );\r\n\t\tresult.cross( v0 );\r\n\r\n\t\tvar resultLengthSq = result.lengthSq();\r\n\t\tif ( resultLengthSq > 0 ) {\r\n\r\n\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn result.set( 0, 0, 0 );\r\n\r\n\t};\r\n\r\n}();\r\n\r\n// static/instance method to calculate barycentric coordinates\r\n// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\r\nTHREE.Triangle.barycoordFromPoint = function () {\r\n\r\n\tvar v0 = new THREE.Vector3();\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\r\n\treturn function ( point, a, b, c, optionalTarget ) {\r\n\r\n\t\tv0.subVectors( c, a );\r\n\t\tv1.subVectors( b, a );\r\n\t\tv2.subVectors( point, a );\r\n\r\n\t\tvar dot00 = v0.dot( v0 );\r\n\t\tvar dot01 = v0.dot( v1 );\r\n\t\tvar dot02 = v0.dot( v2 );\r\n\t\tvar dot11 = v1.dot( v1 );\r\n\t\tvar dot12 = v1.dot( v2 );\r\n\r\n\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\t// collinear or singular triangle\r\n\t\tif ( denom === 0 ) {\r\n\r\n\t\t\t// arbitrary location outside of triangle?\r\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\r\n\t\t\treturn result.set( - 2, - 1, - 1 );\r\n\r\n\t\t}\r\n\r\n\t\tvar invDenom = 1 / denom;\r\n\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\r\n\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\r\n\r\n\t\t// barycentric coordinates must always sum to 1\r\n\t\treturn result.set( 1 - u - v, v, u );\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.Triangle.containsPoint = function () {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\r\n\treturn function ( point, a, b, c ) {\r\n\r\n\t\tvar result = THREE.Triangle.barycoordFromPoint( point, a, b, c, v1 );\r\n\r\n\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.Triangle.prototype = {\r\n\r\n\tconstructor: THREE.Triangle,\r\n\r\n\tset: function ( a, b, c ) {\r\n\r\n\t\tthis.a.copy( a );\r\n\t\tthis.b.copy( b );\r\n\t\tthis.c.copy( c );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\r\n\r\n\t\tthis.a.copy( points[ i0 ] );\r\n\t\tthis.b.copy( points[ i1 ] );\r\n\t\tthis.c.copy( points[ i2 ] );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( triangle ) {\r\n\r\n\t\tthis.a.copy( triangle.a );\r\n\t\tthis.b.copy( triangle.b );\r\n\t\tthis.c.copy( triangle.c );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tarea: function () {\r\n\r\n\t\tvar v0 = new THREE.Vector3();\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tv0.subVectors( this.c, this.b );\r\n\t\t\tv1.subVectors( this.a, this.b );\r\n\r\n\t\t\treturn v0.cross( v1 ).length() * 0.5;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmidpoint: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\r\n\r\n\t},\r\n\r\n\tnormal: function ( optionalTarget ) {\r\n\r\n\t\treturn THREE.Triangle.normal( this.a, this.b, this.c, optionalTarget );\r\n\r\n\t},\r\n\r\n\tplane: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Plane();\r\n\r\n\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\r\n\r\n\t},\r\n\r\n\tbarycoordFromPoint: function ( point, optionalTarget ) {\r\n\r\n\t\treturn THREE.Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\treturn THREE.Triangle.containsPoint( point, this.a, this.b, this.c );\r\n\r\n\t},\r\n\r\n\tclosestPointToPoint: function () {\r\n\r\n\t\tvar plane, edgeList, projectedPoint, closestPoint;\r\n\r\n\t\treturn function closestPointToPoint( point, optionalTarget ) {\r\n\r\n\t\t\tif ( plane === undefined ) {\r\n\r\n\t\t\t\tplane = new THREE.Plane();\r\n\t\t\t\tedgeList = [ new THREE.Line3(), new THREE.Line3(), new THREE.Line3() ];\r\n\t\t\t\tprojectedPoint = new THREE.Vector3();\r\n\t\t\t\tclosestPoint = new THREE.Vector3();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\t\tvar minDistance = Infinity;\r\n\r\n\t\t\t// project the point onto the plane of the triangle\r\n\r\n\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\r\n\t\t\tplane.projectPoint( point, projectedPoint );\r\n\r\n\t\t\t// check if the projection lies within the triangle\r\n\r\n\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\r\n\r\n\t\t\t\t// if so, this is the closest point\r\n\r\n\t\t\t\tresult.copy( projectedPoint );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\r\n\r\n\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\r\n\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\r\n\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\r\n\r\n\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\r\n\r\n\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\r\n\r\n\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\r\n\r\n\t\t\t\t\tif( distance < minDistance ) {\r\n\r\n\t\t\t\t\t\tminDistance = distance;\r\n\r\n\t\t\t\t\t\tresult.copy( closestPoint );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tequals: function ( triangle ) {\r\n\r\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/math/Interpolant.js\r\n\r\n/**\r\n * Abstract base class of interpolants over parametric samples.\r\n *\r\n * The parameter domain is one dimensional, typically the time or a path\r\n * along a curve defined by the data.\r\n *\r\n * The sample values can have any dimensionality and derived classes may\r\n * apply special interpretations to the data.\r\n *\r\n * This class provides the interval seek in a Template Method, deferring\r\n * the actual interpolation to derived classes.\r\n *\r\n * Time complexity is O(1) for linear access crossing at most two points\r\n * and O(log N) for random access, where N is the number of positions.\r\n *\r\n * References:\r\n *\r\n * \t\thttp://www.oodesign.com/template-method-pattern.html\r\n *\r\n * @author tschw\r\n */\r\n\r\nTHREE.Interpolant = function(\r\n\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\r\n\r\n\tthis.parameterPositions = parameterPositions;\r\n\tthis._cachedIndex = 0;\r\n\r\n\tthis.resultBuffer = resultBuffer !== undefined ?\r\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\r\n\tthis.sampleValues = sampleValues;\r\n\tthis.valueSize = sampleSize;\r\n\r\n};\r\n\r\nTHREE.Interpolant.prototype = {\r\n\r\n\tconstructor: THREE.Interpolant,\r\n\r\n\tevaluate: function( t ) {\r\n\r\n\t\tvar pp = this.parameterPositions,\r\n\t\t\ti1 = this._cachedIndex,\r\n\r\n\t\t\tt1 = pp[ i1 ],\r\n\t\t\tt0 = pp[ i1 - 1 ];\r\n\r\n\t\tvalidate_interval: {\r\n\r\n\t\t\tseek: {\r\n\r\n\t\t\t\tvar right;\r\n\r\n\t\t\t\tlinear_scan: {\r\n//- See http://jsperf.com/comparison-to-undefined/3\r\n//- slower code:\r\n//-\r\n//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\r\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\r\n\r\n\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\r\n\r\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\r\n\r\n\t\t\t\t\t\t\t\t// after end\r\n\r\n\t\t\t\t\t\t\t\ti1 = pp.length;\r\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\r\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\r\n\r\n\t\t\t\t\t\t\tt0 = t1;\r\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\r\n\r\n\t\t\t\t\t\t\tif ( t < t1 ) {\r\n\r\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\r\n\t\t\t\t\t\t\t\tbreak seek;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// prepare binary search on the right side of the index\r\n\t\t\t\t\t\tright = pp.length;\r\n\t\t\t\t\t\tbreak linear_scan;\r\n\r\n\t\t\t\t\t}\r\n\r\n//- slower code:\r\n//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\r\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\r\n\r\n\t\t\t\t\t\t// looping?\r\n\r\n\t\t\t\t\t\tvar t1global = pp[ 1 ];\r\n\r\n\t\t\t\t\t\tif ( t < t1global ) {\r\n\r\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\r\n\t\t\t\t\t\t\tt0 = t1global;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// linear reverse scan\r\n\r\n\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\r\n\r\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\r\n\r\n\t\t\t\t\t\t\t\t// before start\r\n\r\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\r\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\r\n\r\n\t\t\t\t\t\t\tt1 = t0;\r\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\r\n\r\n\t\t\t\t\t\t\tif ( t >= t0 ) {\r\n\r\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\r\n\t\t\t\t\t\t\t\tbreak seek;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// prepare binary search on the left side of the index\r\n\t\t\t\t\t\tright = i1;\r\n\t\t\t\t\t\ti1 = 0;\r\n\t\t\t\t\t\tbreak linear_scan;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// the interval is valid\r\n\r\n\t\t\t\t\tbreak validate_interval;\r\n\r\n\t\t\t\t} // linear scan\r\n\r\n\t\t\t\t// binary search\r\n\r\n\t\t\t\twhile ( i1 < right ) {\r\n\r\n\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\r\n\r\n\t\t\t\t\tif ( t < pp[ mid ] ) {\r\n\r\n\t\t\t\t\t\tright = mid;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\ti1 = mid + 1;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tt1 = pp[ i1 ];\r\n\t\t\t\tt0 = pp[ i1 - 1 ];\r\n\r\n\t\t\t\t// check boundary cases, again\r\n\r\n\t\t\t\tif ( t0 === undefined ) {\r\n\r\n\t\t\t\t\tthis._cachedIndex = 0;\r\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( t1 === undefined ) {\r\n\r\n\t\t\t\t\ti1 = pp.length;\r\n\t\t\t\t\tthis._cachedIndex = i1;\r\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} // seek\r\n\r\n\t\t\tthis._cachedIndex = i1;\r\n\r\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\r\n\r\n\t\t} // validate_interval\r\n\r\n\t\treturn this.interpolate_( i1, t0, t, t1 );\r\n\r\n\t},\r\n\r\n\tsettings: null, // optional, subclass-specific settings structure\r\n\t// Note: The indirection allows central control of many interpolants.\r\n\r\n\t// --- Protected interface\r\n\r\n\tDefaultSettings_: {},\r\n\r\n\tgetSettings_: function() {\r\n\r\n\t\treturn this.settings || this.DefaultSettings_;\r\n\r\n\t},\r\n\r\n\tcopySampleValue_: function( index ) {\r\n\r\n\t\t// copies a sample value to the result buffer\r\n\r\n\t\tvar result = this.resultBuffer,\r\n\t\t\tvalues = this.sampleValues,\r\n\t\t\tstride = this.valueSize,\r\n\t\t\toffset = index * stride;\r\n\r\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\r\n\r\n\t\t\tresult[ i ] = values[ offset + i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t},\r\n\r\n\t// Template methods for derived classes:\r\n\r\n\tinterpolate_: function( i1, t0, t, t1 ) {\r\n\r\n\t\tthrow new Error( \"call to abstract method\" );\r\n\t\t// implementations shall return this.resultBuffer\r\n\r\n\t},\r\n\r\n\tintervalChanged_: function( i1, t0, t1 ) {\r\n\r\n\t\t// empty\r\n\r\n\t}\r\n\r\n};\r\n\r\nObject.assign( THREE.Interpolant.prototype, {\r\n\r\n\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\r\n\t\tTHREE.Interpolant.prototype.copySampleValue_,\r\n\r\n\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\r\n\t\tTHREE.Interpolant.prototype.copySampleValue_\r\n\r\n} );\r\n\r\n// File:src/math/interpolants/CubicInterpolant.js\r\n\r\n/**\r\n * Fast and simple cubic spline interpolant.\r\n *\r\n * It was derived from a Hermitian construction setting the first derivative\r\n * at each sample position to the linear slope between neighboring positions\r\n * over their parameter interval.\r\n *\r\n * @author tschw\r\n */\r\n\r\nTHREE.CubicInterpolant = function(\r\n\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\r\n\r\n\tTHREE.Interpolant.call(\r\n\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\r\n\r\n\tthis._weightPrev = -0;\r\n\tthis._offsetPrev = -0;\r\n\tthis._weightNext = -0;\r\n\tthis._offsetNext = -0;\r\n\r\n};\r\n\r\nTHREE.CubicInterpolant.prototype =\r\n\t\tObject.assign( Object.create( THREE.Interpolant.prototype ), {\r\n\r\n\tconstructor: THREE.CubicInterpolant,\r\n\r\n\tDefaultSettings_: {\r\n\r\n\t\tendingStart: \tTHREE.ZeroCurvatureEnding,\r\n\t\tendingEnd:\t\tTHREE.ZeroCurvatureEnding\r\n\r\n\t},\r\n\r\n\tintervalChanged_: function( i1, t0, t1 ) {\r\n\r\n\t\tvar pp = this.parameterPositions,\r\n\t\t\tiPrev = i1 - 2,\r\n\t\t\tiNext = i1 + 1,\r\n\r\n\t\t\ttPrev = pp[ iPrev ],\r\n\t\t\ttNext = pp[ iNext ];\r\n\r\n\t\tif ( tPrev === undefined ) {\r\n\r\n\t\t\tswitch ( this.getSettings_().endingStart ) {\r\n\r\n\t\t\t\tcase THREE.ZeroSlopeEnding:\r\n\r\n\t\t\t\t\t// f'(t0) = 0\r\n\t\t\t\t\tiPrev = i1;\r\n\t\t\t\t\ttPrev = 2 * t0 - t1;\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.WrapAroundEnding:\r\n\r\n\t\t\t\t\t// use the other end of the curve\r\n\t\t\t\t\tiPrev = pp.length - 2;\r\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault: // ZeroCurvatureEnding\r\n\r\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\r\n\t\t\t\t\tiPrev = i1;\r\n\t\t\t\t\ttPrev = t1;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( tNext === undefined ) {\r\n\r\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\r\n\r\n\t\t\t\tcase THREE.ZeroSlopeEnding:\r\n\r\n\t\t\t\t\t// f'(tN) = 0\r\n\t\t\t\t\tiNext = i1;\r\n\t\t\t\t\ttNext = 2 * t1 - t0;\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.WrapAroundEnding:\r\n\r\n\t\t\t\t\t// use the other end of the curve\r\n\t\t\t\t\tiNext = 1;\r\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault: // ZeroCurvatureEnding\r\n\r\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\r\n\t\t\t\t\tiNext = i1 - 1;\r\n\t\t\t\t\ttNext = t0;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar halfDt = ( t1 - t0 ) * 0.5,\r\n\t\t\tstride = this.valueSize;\r\n\r\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\r\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\r\n\t\tthis._offsetPrev = iPrev * stride;\r\n\t\tthis._offsetNext = iNext * stride;\r\n\r\n\t},\r\n\r\n\tinterpolate_: function( i1, t0, t, t1 ) {\r\n\r\n\t\tvar result = this.resultBuffer,\r\n\t\t\tvalues = this.sampleValues,\r\n\t\t\tstride = this.valueSize,\r\n\r\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\r\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\r\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\r\n\r\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\r\n\t\t\tpp = p * p,\r\n\t\t\tppp = pp * p;\r\n\r\n\t\t// evaluate polynomials\r\n\r\n\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\r\n\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\r\n\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\r\n\t\tvar sN = wN * ppp - wN * pp;\r\n\r\n\t\t// combine data linearly\r\n\r\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\r\n\r\n\t\t\tresult[ i ] =\r\n\t\t\t\t\tsP * values[ oP + i ] +\r\n\t\t\t\t\ts0 * values[ o0 + i ] +\r\n\t\t\t\t\ts1 * values[ o1 + i ] +\r\n\t\t\t\t\tsN * values[ oN + i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/math/interpolants/DiscreteInterpolant.js\r\n\r\n/**\r\n *\r\n * Interpolant that evaluates to the sample value at the position preceeding\r\n * the parameter.\r\n *\r\n * @author tschw\r\n */\r\n\r\nTHREE.DiscreteInterpolant = function(\r\n\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\r\n\r\n\tTHREE.Interpolant.call(\r\n\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\r\n\r\n};\r\n\r\nTHREE.DiscreteInterpolant.prototype =\r\n\t\tObject.assign( Object.create( THREE.Interpolant.prototype ), {\r\n\r\n\tconstructor: THREE.DiscreteInterpolant,\r\n\r\n\tinterpolate_: function( i1, t0, t, t1 ) {\r\n\r\n\t\treturn this.copySampleValue_( i1 - 1 );\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/math/interpolants/LinearInterpolant.js\r\n\r\n/**\r\n * @author tschw\r\n */\r\n\r\nTHREE.LinearInterpolant = function(\r\n\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\r\n\r\n\tTHREE.Interpolant.call(\r\n\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\r\n\r\n};\r\n\r\nTHREE.LinearInterpolant.prototype =\r\n\t\tObject.assign( Object.create( THREE.Interpolant.prototype ), {\r\n\r\n\tconstructor: THREE.LinearInterpolant,\r\n\r\n\tinterpolate_: function( i1, t0, t, t1 ) {\r\n\r\n\t\tvar result = this.resultBuffer,\r\n\t\t\tvalues = this.sampleValues,\r\n\t\t\tstride = this.valueSize,\r\n\r\n\t\t\toffset1 = i1 * stride,\r\n\t\t\toffset0 = offset1 - stride,\r\n\r\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\r\n\t\t\tweight0 = 1 - weight1;\r\n\r\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\r\n\r\n\t\t\tresult[ i ] =\r\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\r\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/math/interpolants/QuaternionLinearInterpolant.js\r\n\r\n/**\r\n * Spherical linear unit quaternion interpolant.\r\n *\r\n * @author tschw\r\n */\r\n\r\nTHREE.QuaternionLinearInterpolant = function(\r\n\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\r\n\r\n\tTHREE.Interpolant.call(\r\n\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\r\n\r\n};\r\n\r\nTHREE.QuaternionLinearInterpolant.prototype =\r\n\t\tObject.assign( Object.create( THREE.Interpolant.prototype ), {\r\n\r\n\tconstructor: THREE.QuaternionLinearInterpolant,\r\n\r\n\tinterpolate_: function( i1, t0, t, t1 ) {\r\n\r\n\t\tvar result = this.resultBuffer,\r\n\t\t\tvalues = this.sampleValues,\r\n\t\t\tstride = this.valueSize,\r\n\r\n\t\t\toffset = i1 * stride,\r\n\r\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\r\n\r\n\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\r\n\r\n\t\t\tTHREE.Quaternion.slerpFlat( result, 0,\r\n\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/core/Clock.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Clock = function ( autoStart ) {\r\n\r\n\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\r\n\r\n\tthis.startTime = 0;\r\n\tthis.oldTime = 0;\r\n\tthis.elapsedTime = 0;\r\n\r\n\tthis.running = false;\r\n\r\n};\r\n\r\nTHREE.Clock.prototype = {\r\n\r\n\tconstructor: THREE.Clock,\r\n\r\n\tstart: function () {\r\n\r\n\t\tthis.startTime = ( performance || Date ).now();\r\n\r\n\t\tthis.oldTime = this.startTime;\r\n\t\tthis.running = true;\r\n\r\n\t},\r\n\r\n\tstop: function () {\r\n\r\n\t\tthis.getElapsedTime();\r\n\t\tthis.running = false;\r\n\r\n\t},\r\n\r\n\tgetElapsedTime: function () {\r\n\r\n\t\tthis.getDelta();\r\n\t\treturn this.elapsedTime;\r\n\r\n\t},\r\n\r\n\tgetDelta: function () {\r\n\r\n\t\tvar diff = 0;\r\n\r\n\t\tif ( this.autoStart && ! this.running ) {\r\n\r\n\t\t\tthis.start();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.running ) {\r\n\r\n\t\t\tvar newTime = ( performance || Date ).now();\r\n\r\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\r\n\t\t\tthis.oldTime = newTime;\r\n\r\n\t\t\tthis.elapsedTime += diff;\r\n\r\n\t\t}\r\n\r\n\t\treturn diff;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/core/EventDispatcher.js\r\n\r\n/**\r\n * https://github.com/mrdoob/eventdispatcher.js/\r\n */\r\n\r\nTHREE.EventDispatcher = function () {};\r\n\r\nTHREE.EventDispatcher.prototype = {\r\n\r\n\tconstructor: THREE.EventDispatcher,\r\n\r\n\tapply: function ( object ) {\r\n\r\n\t\tobject.addEventListener = THREE.EventDispatcher.prototype.addEventListener;\r\n\t\tobject.hasEventListener = THREE.EventDispatcher.prototype.hasEventListener;\r\n\t\tobject.removeEventListener = THREE.EventDispatcher.prototype.removeEventListener;\r\n\t\tobject.dispatchEvent = THREE.EventDispatcher.prototype.dispatchEvent;\r\n\r\n\t},\r\n\r\n\taddEventListener: function ( type, listener ) {\r\n\r\n\t\tif ( this._listeners === undefined ) this._listeners = {};\r\n\r\n\t\tvar listeners = this._listeners;\r\n\r\n\t\tif ( listeners[ type ] === undefined ) {\r\n\r\n\t\t\tlisteners[ type ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\r\n\r\n\t\t\tlisteners[ type ].push( listener );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\thasEventListener: function ( type, listener ) {\r\n\r\n\t\tif ( this._listeners === undefined ) return false;\r\n\r\n\t\tvar listeners = this._listeners;\r\n\r\n\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tremoveEventListener: function ( type, listener ) {\r\n\r\n\t\tif ( this._listeners === undefined ) return;\r\n\r\n\t\tvar listeners = this._listeners;\r\n\t\tvar listenerArray = listeners[ type ];\r\n\r\n\t\tif ( listenerArray !== undefined ) {\r\n\r\n\t\t\tvar index = listenerArray.indexOf( listener );\r\n\r\n\t\t\tif ( index !== - 1 ) {\r\n\r\n\t\t\t\tlistenerArray.splice( index, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tdispatchEvent: function ( event ) {\r\n\r\n\t\tif ( this._listeners === undefined ) return;\r\n\r\n\t\tvar listeners = this._listeners;\r\n\t\tvar listenerArray = listeners[ event.type ];\r\n\r\n\t\tif ( listenerArray !== undefined ) {\r\n\r\n\t\t\tevent.target = this;\r\n\r\n\t\t\tvar array = [];\r\n\t\t\tvar length = listenerArray.length;\r\n\r\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\r\n\r\n\t\t\t\tarray[ i ] = listenerArray[ i ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\r\n\r\n\t\t\t\tarray[ i ].call( this, event );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/core/Layers.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Layers = function () {\r\n\r\n\tthis.mask = 1;\r\n\r\n};\r\n\r\nTHREE.Layers.prototype = {\r\n\r\n\tconstructor: THREE.Layers,\r\n\r\n\tset: function ( channel ) {\r\n\r\n\t\tthis.mask = 1 << channel;\r\n\r\n\t},\r\n\r\n\tenable: function ( channel ) {\r\n\r\n\t\tthis.mask |= 1 << channel;\r\n\r\n\t},\r\n\r\n\ttoggle: function ( channel ) {\r\n\r\n\t\tthis.mask ^= 1 << channel;\r\n\r\n\t},\r\n\r\n\tdisable: function ( channel ) {\r\n\r\n\t\tthis.mask &= ~ ( 1 << channel );\r\n\r\n\t},\r\n\r\n\ttest: function ( layers ) {\r\n\r\n\t\treturn ( this.mask & layers.mask ) !== 0;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/core/Raycaster.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author bhouston / http://clara.io/\r\n * @author stephomi / http://stephaneginier.com/\r\n */\r\n\r\n( function ( THREE ) {\r\n\r\n\tTHREE.Raycaster = function ( origin, direction, near, far ) {\r\n\r\n\t\tthis.ray = new THREE.Ray( origin, direction );\r\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\r\n\r\n\t\tthis.near = near || 0;\r\n\t\tthis.far = far || Infinity;\r\n\r\n\t\tthis.params = {\r\n\t\t\tMesh: {},\r\n\t\t\tLine: {},\r\n\t\t\tLOD: {},\r\n\t\t\tPoints: { threshold: 1 },\r\n\t\t\tSprite: {}\r\n\t\t};\r\n\r\n\t\tObject.defineProperties( this.params, {\r\n\t\t\tPointCloud: {\r\n\t\t\t\tget: function () {\r\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\r\n\t\t\t\t\treturn this.Points;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} );\r\n\r\n\t};\r\n\r\n\tfunction ascSort( a, b ) {\r\n\r\n\t\treturn a.distance - b.distance;\r\n\r\n\t}\r\n\r\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\r\n\r\n\t\tif ( object.visible === false ) return;\r\n\r\n\t\tobject.raycast( raycaster, intersects );\r\n\r\n\t\tif ( recursive === true ) {\r\n\r\n\t\t\tvar children = object.children;\r\n\r\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tTHREE.Raycaster.prototype = {\r\n\r\n\t\tconstructor: THREE.Raycaster,\r\n\r\n\t\tlinePrecision: 1,\r\n\r\n\t\tset: function ( origin, direction ) {\r\n\r\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\r\n\r\n\t\t\tthis.ray.set( origin, direction );\r\n\r\n\t\t},\r\n\r\n\t\tsetFromCamera: function ( coords, camera ) {\r\n\r\n\t\t\tif ( camera instanceof THREE.PerspectiveCamera ) {\r\n\r\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\r\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\r\n\r\n\t\t\t} else if ( camera instanceof THREE.OrthographicCamera ) {\r\n\r\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, - 1 ).unproject( camera );\r\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tintersectObject: function ( object, recursive ) {\r\n\r\n\t\t\tvar intersects = [];\r\n\r\n\t\t\tintersectObject( object, this, intersects, recursive );\r\n\r\n\t\t\tintersects.sort( ascSort );\r\n\r\n\t\t\treturn intersects;\r\n\r\n\t\t},\r\n\r\n\t\tintersectObjects: function ( objects, recursive ) {\r\n\r\n\t\t\tvar intersects = [];\r\n\r\n\t\t\tif ( Array.isArray( objects ) === false ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\r\n\t\t\t\treturn intersects;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tintersects.sort( ascSort );\r\n\r\n\t\t\treturn intersects;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}( THREE ) );\r\n\r\n// File:src/core/Object3D.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author elephantatwork / www.elephantatwork.ch\r\n */\r\n\r\nTHREE.Object3D = function () {\r\n\r\n\tObject.defineProperty( this, 'id', { value: THREE.Object3DIdCount ++ } );\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.name = '';\r\n\tthis.type = 'Object3D';\r\n\r\n\tthis.parent = null;\r\n\tthis.children = [];\r\n\r\n\tthis.up = THREE.Object3D.DefaultUp.clone();\r\n\r\n\tvar position = new THREE.Vector3();\r\n\tvar rotation = new THREE.Euler();\r\n\tvar quaternion = new THREE.Quaternion();\r\n\tvar scale = new THREE.Vector3( 1, 1, 1 );\r\n\r\n\tfunction onRotationChange() {\r\n\r\n\t\tquaternion.setFromEuler( rotation, false );\r\n\r\n\t}\r\n\r\n\tfunction onQuaternionChange() {\r\n\r\n\t\trotation.setFromQuaternion( quaternion, undefined, false );\r\n\r\n\t}\r\n\r\n\trotation.onChange( onRotationChange );\r\n\tquaternion.onChange( onQuaternionChange );\r\n\r\n\tObject.defineProperties( this, {\r\n\t\tposition: {\r\n\t\t\tenumerable: true,\r\n\t\t\tvalue: position\r\n\t\t},\r\n\t\trotation: {\r\n\t\t\tenumerable: true,\r\n\t\t\tvalue: rotation\r\n\t\t},\r\n\t\tquaternion: {\r\n\t\t\tenumerable: true,\r\n\t\t\tvalue: quaternion\r\n\t\t},\r\n\t\tscale: {\r\n\t\t\tenumerable: true,\r\n\t\t\tvalue: scale\r\n\t\t},\r\n\t\tmodelViewMatrix: {\r\n\t\t\tvalue: new THREE.Matrix4()\r\n\t\t},\r\n\t\tnormalMatrix: {\r\n\t\t\tvalue: new THREE.Matrix3()\r\n\t\t}\r\n\t} );\r\n\r\n\tthis.rotationAutoUpdate = true;\r\n\r\n\tthis.matrix = new THREE.Matrix4();\r\n\tthis.matrixWorld = new THREE.Matrix4();\r\n\r\n\tthis.matrixAutoUpdate = THREE.Object3D.DefaultMatrixAutoUpdate;\r\n\tthis.matrixWorldNeedsUpdate = false;\r\n\r\n\tthis.layers = new THREE.Layers();\r\n\tthis.visible = true;\r\n\r\n\tthis.castShadow = false;\r\n\tthis.receiveShadow = false;\r\n\r\n\tthis.frustumCulled = true;\r\n\tthis.renderOrder = 0;\r\n\r\n\tthis.userData = {};\r\n\r\n};\r\n\r\nTHREE.Object3D.DefaultUp = new THREE.Vector3( 0, 1, 0 );\r\nTHREE.Object3D.DefaultMatrixAutoUpdate = true;\r\n\r\nTHREE.Object3D.prototype = {\r\n\r\n\tconstructor: THREE.Object3D,\r\n\r\n\tapplyMatrix: function ( matrix ) {\r\n\r\n\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\r\n\r\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\r\n\r\n\t},\r\n\r\n\tsetRotationFromAxisAngle: function ( axis, angle ) {\r\n\r\n\t\t// assumes axis is normalized\r\n\r\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\r\n\r\n\t},\r\n\r\n\tsetRotationFromEuler: function ( euler ) {\r\n\r\n\t\tthis.quaternion.setFromEuler( euler, true );\r\n\r\n\t},\r\n\r\n\tsetRotationFromMatrix: function ( m ) {\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\tthis.quaternion.setFromRotationMatrix( m );\r\n\r\n\t},\r\n\r\n\tsetRotationFromQuaternion: function ( q ) {\r\n\r\n\t\t// assumes q is normalized\r\n\r\n\t\tthis.quaternion.copy( q );\r\n\r\n\t},\r\n\r\n\trotateOnAxis: function () {\r\n\r\n\t\t// rotate object on axis in object space\r\n\t\t// axis is assumed to be normalized\r\n\r\n\t\tvar q1 = new THREE.Quaternion();\r\n\r\n\t\treturn function ( axis, angle ) {\r\n\r\n\t\t\tq1.setFromAxisAngle( axis, angle );\r\n\r\n\t\t\tthis.quaternion.multiply( q1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateX: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 1, 0, 0 );\r\n\r\n\t\treturn function ( angle ) {\r\n\r\n\t\t\treturn this.rotateOnAxis( v1, angle );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateY: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 0, 1, 0 );\r\n\r\n\t\treturn function ( angle ) {\r\n\r\n\t\t\treturn this.rotateOnAxis( v1, angle );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateZ: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 0, 0, 1 );\r\n\r\n\t\treturn function ( angle ) {\r\n\r\n\t\t\treturn this.rotateOnAxis( v1, angle );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslateOnAxis: function () {\r\n\r\n\t\t// translate object by distance along axis in object space\r\n\t\t// axis is assumed to be normalized\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( axis, distance ) {\r\n\r\n\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\r\n\r\n\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslateX: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 1, 0, 0 );\r\n\r\n\t\treturn function ( distance ) {\r\n\r\n\t\t\treturn this.translateOnAxis( v1, distance );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslateY: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 0, 1, 0 );\r\n\r\n\t\treturn function ( distance ) {\r\n\r\n\t\t\treturn this.translateOnAxis( v1, distance );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslateZ: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 0, 0, 1 );\r\n\r\n\t\treturn function ( distance ) {\r\n\r\n\t\t\treturn this.translateOnAxis( v1, distance );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tlocalToWorld: function ( vector ) {\r\n\r\n\t\treturn vector.applyMatrix4( this.matrixWorld );\r\n\r\n\t},\r\n\r\n\tworldToLocal: function () {\r\n\r\n\t\tvar m1 = new THREE.Matrix4();\r\n\r\n\t\treturn function ( vector ) {\r\n\r\n\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tlookAt: function () {\r\n\r\n\t\t// This routine does not support objects with rotated and/or translated parent(s)\r\n\r\n\t\tvar m1 = new THREE.Matrix4();\r\n\r\n\t\treturn function ( vector ) {\r\n\r\n\t\t\tm1.lookAt( vector, this.position, this.up );\r\n\r\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tadd: function ( object ) {\r\n\r\n\t\tif ( arguments.length > 1 ) {\r\n\r\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\r\n\r\n\t\t\t\tthis.add( arguments[ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tif ( object === this ) {\r\n\r\n\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tif ( object instanceof THREE.Object3D ) {\r\n\r\n\t\t\tif ( object.parent !== null ) {\r\n\r\n\t\t\t\tobject.parent.remove( object );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobject.parent = this;\r\n\t\t\tobject.dispatchEvent( { type: 'added' } );\r\n\r\n\t\t\tthis.children.push( object );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tremove: function ( object ) {\r\n\r\n\t\tif ( arguments.length > 1 ) {\r\n\r\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\r\n\r\n\t\t\t\tthis.remove( arguments[ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar index = this.children.indexOf( object );\r\n\r\n\t\tif ( index !== - 1 ) {\r\n\r\n\t\t\tobject.parent = null;\r\n\r\n\t\t\tobject.dispatchEvent( { type: 'removed' } );\r\n\r\n\t\t\tthis.children.splice( index, 1 );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetObjectById: function ( id ) {\r\n\r\n\t\treturn this.getObjectByProperty( 'id', id );\r\n\r\n\t},\r\n\r\n\tgetObjectByName: function ( name ) {\r\n\r\n\t\treturn this.getObjectByProperty( 'name', name );\r\n\r\n\t},\r\n\r\n\tgetObjectByProperty: function ( name, value ) {\r\n\r\n\t\tif ( this[ name ] === value ) return this;\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar child = this.children[ i ];\r\n\t\t\tvar object = child.getObjectByProperty( name, value );\r\n\r\n\t\t\tif ( object !== undefined ) {\r\n\r\n\t\t\t\treturn object;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\r\n\t},\r\n\r\n\tgetWorldPosition: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\tthis.updateMatrixWorld( true );\r\n\r\n\t\treturn result.setFromMatrixPosition( this.matrixWorld );\r\n\r\n\t},\r\n\r\n\tgetWorldQuaternion: function () {\r\n\r\n\t\tvar position = new THREE.Vector3();\r\n\t\tvar scale = new THREE.Vector3();\r\n\r\n\t\treturn function ( optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Quaternion();\r\n\r\n\t\t\tthis.updateMatrixWorld( true );\r\n\r\n\t\t\tthis.matrixWorld.decompose( position, result, scale );\r\n\r\n\t\t\treturn result;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tgetWorldRotation: function () {\r\n\r\n\t\tvar quaternion = new THREE.Quaternion();\r\n\r\n\t\treturn function ( optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Euler();\r\n\r\n\t\t\tthis.getWorldQuaternion( quaternion );\r\n\r\n\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tgetWorldScale: function () {\r\n\r\n\t\tvar position = new THREE.Vector3();\r\n\t\tvar quaternion = new THREE.Quaternion();\r\n\r\n\t\treturn function ( optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\t\tthis.updateMatrixWorld( true );\r\n\r\n\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\r\n\r\n\t\t\treturn result;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tgetWorldDirection: function () {\r\n\r\n\t\tvar quaternion = new THREE.Quaternion();\r\n\r\n\t\treturn function ( optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\t\tthis.getWorldQuaternion( quaternion );\r\n\r\n\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\traycast: function () {},\r\n\r\n\ttraverse: function ( callback ) {\r\n\r\n\t\tcallback( this );\r\n\r\n\t\tvar children = this.children;\r\n\r\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\tchildren[ i ].traverse( callback );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttraverseVisible: function ( callback ) {\r\n\r\n\t\tif ( this.visible === false ) return;\r\n\r\n\t\tcallback( this );\r\n\r\n\t\tvar children = this.children;\r\n\r\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\tchildren[ i ].traverseVisible( callback );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttraverseAncestors: function ( callback ) {\r\n\r\n\t\tvar parent = this.parent;\r\n\r\n\t\tif ( parent !== null ) {\r\n\r\n\t\t\tcallback( parent );\r\n\r\n\t\t\tparent.traverseAncestors( callback );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tupdateMatrix: function () {\r\n\r\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\r\n\r\n\t\tthis.matrixWorldNeedsUpdate = true;\r\n\r\n\t},\r\n\r\n\tupdateMatrixWorld: function ( force ) {\r\n\r\n\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\r\n\r\n\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\r\n\r\n\t\t\tif ( this.parent === null ) {\r\n\r\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.matrixWorldNeedsUpdate = false;\r\n\r\n\t\t\tforce = true;\r\n\r\n\t\t}\r\n\r\n\t\t// update children\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tthis.children[ i ].updateMatrixWorld( force );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttoJSON: function ( meta ) {\r\n\r\n\t\t// meta is '' when called from JSON.stringify\r\n\t\tvar isRootObject = ( meta === undefined || meta === '' );\r\n\r\n\t\tvar output = {};\r\n\r\n\t\t// meta is a hash used to collect geometries, materials.\r\n\t\t// not providing it implies that this is the root object\r\n\t\t// being serialized.\r\n\t\tif ( isRootObject ) {\r\n\r\n\t\t\t// initialize meta obj\r\n\t\t\tmeta = {\r\n\t\t\t\tgeometries: {},\r\n\t\t\t\tmaterials: {},\r\n\t\t\t\ttextures: {},\r\n\t\t\t\timages: {}\r\n\t\t\t};\r\n\r\n\t\t\toutput.metadata = {\r\n\t\t\t\tversion: 4.4,\r\n\t\t\t\ttype: 'Object',\r\n\t\t\t\tgenerator: 'Object3D.toJSON'\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\t// standard Object3D serialization\r\n\r\n\t\tvar object = {};\r\n\r\n\t\tobject.uuid = this.uuid;\r\n\t\tobject.type = this.type;\r\n\r\n\t\tif ( this.name !== '' ) object.name = this.name;\r\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\r\n\t\tif ( this.castShadow === true ) object.castShadow = true;\r\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\r\n\t\tif ( this.visible === false ) object.visible = false;\r\n\r\n\t\tobject.matrix = this.matrix.toArray();\r\n\r\n\t\t//\r\n\r\n\t\tif ( this.geometry !== undefined ) {\r\n\r\n\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\r\n\r\n\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobject.geometry = this.geometry.uuid;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.material !== undefined ) {\r\n\r\n\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\r\n\r\n\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobject.material = this.material.uuid;\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tif ( this.children.length > 0 ) {\r\n\r\n\t\t\tobject.children = [];\r\n\r\n\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\r\n\r\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( isRootObject ) {\r\n\r\n\t\t\tvar geometries = extractFromCache( meta.geometries );\r\n\t\t\tvar materials = extractFromCache( meta.materials );\r\n\t\t\tvar textures = extractFromCache( meta.textures );\r\n\t\t\tvar images = extractFromCache( meta.images );\r\n\r\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\r\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\r\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\r\n\t\t\tif ( images.length > 0 ) output.images = images;\r\n\r\n\t\t}\r\n\r\n\t\toutput.object = object;\r\n\r\n\t\treturn output;\r\n\r\n\t\t// extract data from the cache hash\r\n\t\t// remove metadata on each item\r\n\t\t// and return as array\r\n\t\tfunction extractFromCache ( cache ) {\r\n\r\n\t\t\tvar values = [];\r\n\t\t\tfor ( var key in cache ) {\r\n\r\n\t\t\t\tvar data = cache[ key ];\r\n\t\t\t\tdelete data.metadata;\r\n\t\t\t\tvalues.push( data );\r\n\r\n\t\t\t}\r\n\t\t\treturn values;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclone: function ( recursive ) {\r\n\r\n\t\treturn new this.constructor().copy( this, recursive );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source, recursive ) {\r\n\r\n\t\tif ( recursive === undefined ) recursive = true;\r\n\r\n\t\tthis.name = source.name;\r\n\r\n\t\tthis.up.copy( source.up );\r\n\r\n\t\tthis.position.copy( source.position );\r\n\t\tthis.quaternion.copy( source.quaternion );\r\n\t\tthis.scale.copy( source.scale );\r\n\r\n\t\tthis.rotationAutoUpdate = source.rotationAutoUpdate;\r\n\r\n\t\tthis.matrix.copy( source.matrix );\r\n\t\tthis.matrixWorld.copy( source.matrixWorld );\r\n\r\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\r\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\r\n\r\n\t\tthis.visible = source.visible;\r\n\r\n\t\tthis.castShadow = source.castShadow;\r\n\t\tthis.receiveShadow = source.receiveShadow;\r\n\r\n\t\tthis.frustumCulled = source.frustumCulled;\r\n\t\tthis.renderOrder = source.renderOrder;\r\n\r\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\r\n\r\n\t\tif ( recursive === true ) {\r\n\r\n\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\r\n\r\n\t\t\t\tvar child = source.children[ i ];\r\n\t\t\t\tthis.add( child.clone() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.Object3D.prototype );\r\n\r\nTHREE.Object3DIdCount = 0;\r\n\r\n// File:src/core/Face3.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Face3 = function ( a, b, c, normal, color, materialIndex ) {\r\n\r\n\tthis.a = a;\r\n\tthis.b = b;\r\n\tthis.c = c;\r\n\r\n\tthis.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();\r\n\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\r\n\r\n\tthis.color = color instanceof THREE.Color ? color : new THREE.Color();\r\n\tthis.vertexColors = Array.isArray( color ) ? color : [];\r\n\r\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\r\n\r\n};\r\n\r\nTHREE.Face3.prototype = {\r\n\r\n\tconstructor: THREE.Face3,\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.a = source.a;\r\n\t\tthis.b = source.b;\r\n\t\tthis.c = source.c;\r\n\r\n\t\tthis.normal.copy( source.normal );\r\n\t\tthis.color.copy( source.color );\r\n\r\n\t\tthis.materialIndex = source.materialIndex;\r\n\r\n\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\r\n\r\n\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\r\n\r\n\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/core/BufferAttribute.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.BufferAttribute = function ( array, itemSize, normalized ) {\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.array = array;\r\n\tthis.itemSize = itemSize;\r\n\r\n\tthis.dynamic = false;\r\n\tthis.updateRange = { offset: 0, count: - 1 };\r\n\r\n\tthis.version = 0;\r\n\tthis.normalized = normalized === true;\r\n\r\n};\r\n\r\nTHREE.BufferAttribute.prototype = {\r\n\r\n\tconstructor: THREE.BufferAttribute,\r\n\r\n\tget count() {\r\n\r\n\t\treturn this.array.length / this.itemSize;\r\n\r\n\t},\r\n\r\n\tset needsUpdate( value ) {\r\n\r\n\t\tif ( value === true ) this.version ++;\r\n\r\n\t},\r\n\r\n\tsetDynamic: function ( value ) {\r\n\r\n\t\tthis.dynamic = value;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.array = new source.array.constructor( source.array );\r\n\t\tthis.itemSize = source.itemSize;\r\n\r\n\t\tthis.dynamic = source.dynamic;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyAt: function ( index1, attribute, index2 ) {\r\n\r\n\t\tindex1 *= this.itemSize;\r\n\t\tindex2 *= attribute.itemSize;\r\n\r\n\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\r\n\r\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyArray: function ( array ) {\r\n\r\n\t\tthis.array.set( array );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyColorsArray: function ( colors ) {\r\n\r\n\t\tvar array = this.array, offset = 0;\r\n\r\n\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar color = colors[ i ];\r\n\r\n\t\t\tif ( color === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\r\n\t\t\t\tcolor = new THREE.Color();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tarray[ offset ++ ] = color.r;\r\n\t\t\tarray[ offset ++ ] = color.g;\r\n\t\t\tarray[ offset ++ ] = color.b;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyIndicesArray: function ( indices ) {\r\n\r\n\t\tvar array = this.array, offset = 0;\r\n\r\n\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar index = indices[ i ];\r\n\r\n\t\t\tarray[ offset ++ ] = index.a;\r\n\t\t\tarray[ offset ++ ] = index.b;\r\n\t\t\tarray[ offset ++ ] = index.c;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyVector2sArray: function ( vectors ) {\r\n\r\n\t\tvar array = this.array, offset = 0;\r\n\r\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar vector = vectors[ i ];\r\n\r\n\t\t\tif ( vector === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\r\n\t\t\t\tvector = new THREE.Vector2();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tarray[ offset ++ ] = vector.x;\r\n\t\t\tarray[ offset ++ ] = vector.y;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyVector3sArray: function ( vectors ) {\r\n\r\n\t\tvar array = this.array, offset = 0;\r\n\r\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar vector = vectors[ i ];\r\n\r\n\t\t\tif ( vector === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\r\n\t\t\t\tvector = new THREE.Vector3();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tarray[ offset ++ ] = vector.x;\r\n\t\t\tarray[ offset ++ ] = vector.y;\r\n\t\t\tarray[ offset ++ ] = vector.z;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyVector4sArray: function ( vectors ) {\r\n\r\n\t\tvar array = this.array, offset = 0;\r\n\r\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar vector = vectors[ i ];\r\n\r\n\t\t\tif ( vector === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\r\n\t\t\t\tvector = new THREE.Vector4();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tarray[ offset ++ ] = vector.x;\r\n\t\t\tarray[ offset ++ ] = vector.y;\r\n\t\t\tarray[ offset ++ ] = vector.z;\r\n\t\t\tarray[ offset ++ ] = vector.w;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tset: function ( value, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis.array.set( value, offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetX: function ( index ) {\r\n\r\n\t\treturn this.array[ index * this.itemSize ];\r\n\r\n\t},\r\n\r\n\tsetX: function ( index, x ) {\r\n\r\n\t\tthis.array[ index * this.itemSize ] = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetY: function ( index ) {\r\n\r\n\t\treturn this.array[ index * this.itemSize + 1 ];\r\n\r\n\t},\r\n\r\n\tsetY: function ( index, y ) {\r\n\r\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetZ: function ( index ) {\r\n\r\n\t\treturn this.array[ index * this.itemSize + 2 ];\r\n\r\n\t},\r\n\r\n\tsetZ: function ( index, z ) {\r\n\r\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetW: function ( index ) {\r\n\r\n\t\treturn this.array[ index * this.itemSize + 3 ];\r\n\r\n\t},\r\n\r\n\tsetW: function ( index, w ) {\r\n\r\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetXY: function ( index, x, y ) {\r\n\r\n\t\tindex *= this.itemSize;\r\n\r\n\t\tthis.array[ index + 0 ] = x;\r\n\t\tthis.array[ index + 1 ] = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetXYZ: function ( index, x, y, z ) {\r\n\r\n\t\tindex *= this.itemSize;\r\n\r\n\t\tthis.array[ index + 0 ] = x;\r\n\t\tthis.array[ index + 1 ] = y;\r\n\t\tthis.array[ index + 2 ] = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetXYZW: function ( index, x, y, z, w ) {\r\n\r\n\t\tindex *= this.itemSize;\r\n\r\n\t\tthis.array[ index + 0 ] = x;\r\n\t\tthis.array[ index + 1 ] = y;\r\n\t\tthis.array[ index + 2 ] = z;\r\n\t\tthis.array[ index + 3 ] = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n\r\n//\r\n\r\nTHREE.Int8Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Int8Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Uint8Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Uint8Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Uint8ClampedAttribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Uint8ClampedArray( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Int16Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Int16Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Uint16Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Uint16Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Int32Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Int32Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Uint32Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Uint32Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Float32Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Float32Array( array ), itemSize );\r\n\r\n};\r\n\r\nTHREE.Float64Attribute = function ( array, itemSize ) {\r\n\r\n\treturn new THREE.BufferAttribute( new Float64Array( array ), itemSize );\r\n\r\n};\r\n\r\n\r\n// Deprecated\r\n\r\nTHREE.DynamicBufferAttribute = function ( array, itemSize ) {\r\n\r\n\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\r\n\treturn new THREE.BufferAttribute( array, itemSize ).setDynamic( true );\r\n\r\n};\r\n\r\n// File:src/core/InstancedBufferAttribute.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n */\r\n\r\nTHREE.InstancedBufferAttribute = function ( array, itemSize, meshPerAttribute ) {\r\n\r\n\tTHREE.BufferAttribute.call( this, array, itemSize );\r\n\r\n\tthis.meshPerAttribute = meshPerAttribute || 1;\r\n\r\n};\r\n\r\nTHREE.InstancedBufferAttribute.prototype = Object.create( THREE.BufferAttribute.prototype );\r\nTHREE.InstancedBufferAttribute.prototype.constructor = THREE.InstancedBufferAttribute;\r\n\r\nTHREE.InstancedBufferAttribute.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.BufferAttribute.prototype.copy.call( this, source );\r\n\r\n\tthis.meshPerAttribute = source.meshPerAttribute;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/core/InterleavedBuffer.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n */\r\n\r\nTHREE.InterleavedBuffer = function ( array, stride ) {\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.array = array;\r\n\tthis.stride = stride;\r\n\r\n\tthis.dynamic = false;\r\n\tthis.updateRange = { offset: 0, count: - 1 };\r\n\r\n\tthis.version = 0;\r\n\r\n};\r\n\r\nTHREE.InterleavedBuffer.prototype = {\r\n\r\n\tconstructor: THREE.InterleavedBuffer,\r\n\r\n\tget length () {\r\n\r\n\t\treturn this.array.length;\r\n\r\n\t},\r\n\r\n\tget count () {\r\n\r\n\t\treturn this.array.length / this.stride;\r\n\r\n\t},\r\n\r\n\tset needsUpdate( value ) {\r\n\r\n\t\tif ( value === true ) this.version ++;\r\n\r\n\t},\r\n\r\n\tsetDynamic: function ( value ) {\r\n\r\n\t\tthis.dynamic = value;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.array = new source.array.constructor( source.array );\r\n\t\tthis.stride = source.stride;\r\n\t\tthis.dynamic = source.dynamic;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyAt: function ( index1, attribute, index2 ) {\r\n\r\n\t\tindex1 *= this.stride;\r\n\t\tindex2 *= attribute.stride;\r\n\r\n\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\r\n\r\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tset: function ( value, offset ) {\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tthis.array.set( value, offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/core/InstancedInterleavedBuffer.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n */\r\n\r\nTHREE.InstancedInterleavedBuffer = function ( array, stride, meshPerAttribute ) {\r\n\r\n\tTHREE.InterleavedBuffer.call( this, array, stride );\r\n\r\n\tthis.meshPerAttribute = meshPerAttribute || 1;\r\n\r\n};\r\n\r\nTHREE.InstancedInterleavedBuffer.prototype = Object.create( THREE.InterleavedBuffer.prototype );\r\nTHREE.InstancedInterleavedBuffer.prototype.constructor = THREE.InstancedInterleavedBuffer;\r\n\r\nTHREE.InstancedInterleavedBuffer.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.InterleavedBuffer.prototype.copy.call( this, source );\r\n\r\n\tthis.meshPerAttribute = source.meshPerAttribute;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/core/InterleavedBufferAttribute.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n */\r\n\r\nTHREE.InterleavedBufferAttribute = function ( interleavedBuffer, itemSize, offset ) {\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.data = interleavedBuffer;\r\n\tthis.itemSize = itemSize;\r\n\tthis.offset = offset;\r\n\r\n};\r\n\r\n\r\nTHREE.InterleavedBufferAttribute.prototype = {\r\n\r\n\tconstructor: THREE.InterleavedBufferAttribute,\r\n\r\n\tget length() {\r\n\r\n\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\r\n\t\treturn this.array.length;\r\n\r\n\t},\r\n\r\n\tget count() {\r\n\r\n\t\treturn this.data.count;\r\n\r\n\t},\r\n\r\n\tsetX: function ( index, x ) {\r\n\r\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( index, y ) {\r\n\r\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetZ: function ( index, z ) {\r\n\r\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetW: function ( index, w ) {\r\n\r\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetX: function ( index ) {\r\n\r\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\r\n\r\n\t},\r\n\r\n\tgetY: function ( index ) {\r\n\r\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\r\n\r\n\t},\r\n\r\n\tgetZ: function ( index ) {\r\n\r\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\r\n\r\n\t},\r\n\r\n\tgetW: function ( index ) {\r\n\r\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\r\n\r\n\t},\r\n\r\n\tsetXY: function ( index, x, y ) {\r\n\r\n\t\tindex = index * this.data.stride + this.offset;\r\n\r\n\t\tthis.data.array[ index + 0 ] = x;\r\n\t\tthis.data.array[ index + 1 ] = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetXYZ: function ( index, x, y, z ) {\r\n\r\n\t\tindex = index * this.data.stride + this.offset;\r\n\r\n\t\tthis.data.array[ index + 0 ] = x;\r\n\t\tthis.data.array[ index + 1 ] = y;\r\n\t\tthis.data.array[ index + 2 ] = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetXYZW: function ( index, x, y, z, w ) {\r\n\r\n\t\tindex = index * this.data.stride + this.offset;\r\n\r\n\t\tthis.data.array[ index + 0 ] = x;\r\n\t\tthis.data.array[ index + 1 ] = y;\r\n\t\tthis.data.array[ index + 2 ] = z;\r\n\t\tthis.data.array[ index + 3 ] = w;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/core/Geometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author kile / http://kile.stravaganza.org/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\nTHREE.Geometry = function () {\r\n\r\n\tObject.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } );\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.name = '';\r\n\tthis.type = 'Geometry';\r\n\r\n\tthis.vertices = [];\r\n\tthis.colors = [];\r\n\tthis.faces = [];\r\n\tthis.faceVertexUvs = [ [] ];\r\n\r\n\tthis.morphTargets = [];\r\n\tthis.morphNormals = [];\r\n\r\n\tthis.skinWeights = [];\r\n\tthis.skinIndices = [];\r\n\r\n\tthis.lineDistances = [];\r\n\r\n\tthis.boundingBox = null;\r\n\tthis.boundingSphere = null;\r\n\r\n\t// update flags\r\n\r\n\tthis.verticesNeedUpdate = false;\r\n\tthis.elementsNeedUpdate = false;\r\n\tthis.uvsNeedUpdate = false;\r\n\tthis.normalsNeedUpdate = false;\r\n\tthis.colorsNeedUpdate = false;\r\n\tthis.lineDistancesNeedUpdate = false;\r\n\tthis.groupsNeedUpdate = false;\r\n\r\n};\r\n\r\nTHREE.Geometry.prototype = {\r\n\r\n\tconstructor: THREE.Geometry,\r\n\r\n\tapplyMatrix: function ( matrix ) {\r\n\r\n\t\tvar normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\r\n\r\n\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar vertex = this.vertices[ i ];\r\n\t\t\tvertex.applyMatrix4( matrix );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar face = this.faces[ i ];\r\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.boundingBox !== null ) {\r\n\r\n\t\t\tthis.computeBoundingBox();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.boundingSphere !== null ) {\r\n\r\n\t\t\tthis.computeBoundingSphere();\r\n\r\n\t\t}\r\n\r\n\t\tthis.verticesNeedUpdate = true;\r\n\t\tthis.normalsNeedUpdate = true;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\trotateX: function () {\r\n\r\n\t\t// rotate geometry around world x-axis\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function rotateX( angle ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeRotationX( angle );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateY: function () {\r\n\r\n\t\t// rotate geometry around world y-axis\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function rotateY( angle ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeRotationY( angle );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateZ: function () {\r\n\r\n\t\t// rotate geometry around world z-axis\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function rotateZ( angle ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeRotationZ( angle );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslate: function () {\r\n\r\n\t\t// translate geometry\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function translate( x, y, z ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeTranslation( x, y, z );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tscale: function () {\r\n\r\n\t\t// scale geometry\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function scale( x, y, z ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeScale( x, y, z );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tlookAt: function () {\r\n\r\n\t\tvar obj;\r\n\r\n\t\treturn function lookAt( vector ) {\r\n\r\n\t\t\tif ( obj === undefined ) obj = new THREE.Object3D();\r\n\r\n\t\t\tobj.lookAt( vector );\r\n\r\n\t\t\tobj.updateMatrix();\r\n\r\n\t\t\tthis.applyMatrix( obj.matrix );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tfromBufferGeometry: function ( geometry ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\r\n\t\tvar attributes = geometry.attributes;\r\n\r\n\t\tvar positions = attributes.position.array;\r\n\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\r\n\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\r\n\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\r\n\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\r\n\r\n\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\r\n\r\n\t\tvar tempNormals = [];\r\n\t\tvar tempUVs = [];\r\n\t\tvar tempUVs2 = [];\r\n\r\n\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\r\n\r\n\t\t\tscope.vertices.push( new THREE.Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\r\n\r\n\t\t\tif ( normals !== undefined ) {\r\n\r\n\t\t\t\ttempNormals.push( new THREE.Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( colors !== undefined ) {\r\n\r\n\t\t\t\tscope.colors.push( new THREE.Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( uvs !== undefined ) {\r\n\r\n\t\t\t\ttempUVs.push( new THREE.Vector2( uvs[ j ], uvs[ j + 1 ] ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( uvs2 !== undefined ) {\r\n\r\n\t\t\t\ttempUVs2.push( new THREE.Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction addFace( a, b, c, materialIndex ) {\r\n\r\n\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\r\n\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\r\n\r\n\t\t\tvar face = new THREE.Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\r\n\r\n\t\t\tscope.faces.push( face );\r\n\r\n\t\t\tif ( uvs !== undefined ) {\r\n\r\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( uvs2 !== undefined ) {\r\n\r\n\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( indices !== undefined ) {\r\n\r\n\t\t\tvar groups = geometry.groups;\r\n\r\n\t\t\tif ( groups.length > 0 ) {\r\n\r\n\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\r\n\r\n\t\t\t\t\tvar group = groups[ i ];\r\n\r\n\t\t\t\t\tvar start = group.start;\r\n\t\t\t\t\tvar count = group.count;\r\n\r\n\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\r\n\r\n\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\r\n\r\n\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\r\n\r\n\t\t\t\taddFace( i, i + 1, i + 2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.computeFaceNormals();\r\n\r\n\t\tif ( geometry.boundingBox !== null ) {\r\n\r\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.boundingSphere !== null ) {\r\n\r\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcenter: function () {\r\n\r\n\t\tthis.computeBoundingBox();\r\n\r\n\t\tvar offset = this.boundingBox.center().negate();\r\n\r\n\t\tthis.translate( offset.x, offset.y, offset.z );\r\n\r\n\t\treturn offset;\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\tthis.computeBoundingSphere();\r\n\r\n\t\tvar center = this.boundingSphere.center;\r\n\t\tvar radius = this.boundingSphere.radius;\r\n\r\n\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\r\n\r\n\t\tvar matrix = new THREE.Matrix4();\r\n\t\tmatrix.set(\r\n\t\t\ts, 0, 0, - s * center.x,\r\n\t\t\t0, s, 0, - s * center.y,\r\n\t\t\t0, 0, s, - s * center.z,\r\n\t\t\t0, 0, 0, 1\r\n\t\t);\r\n\r\n\t\tthis.applyMatrix( matrix );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcomputeFaceNormals: function () {\r\n\r\n\t\tvar cb = new THREE.Vector3(), ab = new THREE.Vector3();\r\n\r\n\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tvar face = this.faces[ f ];\r\n\r\n\t\t\tvar vA = this.vertices[ face.a ];\r\n\t\t\tvar vB = this.vertices[ face.b ];\r\n\t\t\tvar vC = this.vertices[ face.c ];\r\n\r\n\t\t\tcb.subVectors( vC, vB );\r\n\t\t\tab.subVectors( vA, vB );\r\n\t\t\tcb.cross( ab );\r\n\r\n\t\t\tcb.normalize();\r\n\r\n\t\t\tface.normal.copy( cb );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeVertexNormals: function ( areaWeighted ) {\r\n\r\n\t\tif ( areaWeighted === undefined ) areaWeighted = true;\r\n\r\n\t\tvar v, vl, f, fl, face, vertices;\r\n\r\n\t\tvertices = new Array( this.vertices.length );\r\n\r\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\tvertices[ v ] = new THREE.Vector3();\r\n\r\n\t\t}\r\n\r\n\t\tif ( areaWeighted ) {\r\n\r\n\t\t\t// vertex normals weighted by triangle areas\r\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\r\n\r\n\t\t\tvar vA, vB, vC;\r\n\t\t\tvar cb = new THREE.Vector3(), ab = new THREE.Vector3();\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tvA = this.vertices[ face.a ];\r\n\t\t\t\tvB = this.vertices[ face.b ];\r\n\t\t\t\tvC = this.vertices[ face.c ];\r\n\r\n\t\t\t\tcb.subVectors( vC, vB );\r\n\t\t\t\tab.subVectors( vA, vB );\r\n\t\t\t\tcb.cross( ab );\r\n\r\n\t\t\t\tvertices[ face.a ].add( cb );\r\n\t\t\t\tvertices[ face.b ].add( cb );\r\n\t\t\t\tvertices[ face.c ].add( cb );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tvertices[ face.a ].add( face.normal );\r\n\t\t\t\tvertices[ face.b ].add( face.normal );\r\n\t\t\t\tvertices[ face.c ].add( face.normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\tvertices[ v ].normalize();\r\n\r\n\t\t}\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tvar vertexNormals = face.vertexNormals;\r\n\r\n\t\t\tif ( vertexNormals.length === 3 ) {\r\n\r\n\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\r\n\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\r\n\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\r\n\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\r\n\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.faces.length > 0 ) {\r\n\r\n\t\t\tthis.normalsNeedUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeMorphNormals: function () {\r\n\r\n\t\tvar i, il, f, fl, face;\r\n\r\n\t\t// save original normals\r\n\t\t// - create temp variables on first access\r\n\t\t// otherwise just copy (for faster repeated calls)\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tif ( ! face.__originalFaceNormal ) {\r\n\r\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\r\n\r\n\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\r\n\r\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// use temp geometry to compute face and vertex normals for each morph\r\n\r\n\t\tvar tmpGeo = new THREE.Geometry();\r\n\t\ttmpGeo.faces = this.faces;\r\n\r\n\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\t// create on first access\r\n\r\n\t\t\tif ( ! this.morphNormals[ i ] ) {\r\n\r\n\t\t\t\tthis.morphNormals[ i ] = {};\r\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\r\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\r\n\r\n\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\r\n\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\r\n\r\n\t\t\t\tvar faceNormal, vertexNormals;\r\n\r\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\tfaceNormal = new THREE.Vector3();\r\n\t\t\t\t\tvertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3() };\r\n\r\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\r\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar morphNormals = this.morphNormals[ i ];\r\n\r\n\t\t\t// set vertices to morph target\r\n\r\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\r\n\r\n\t\t\t// compute morph normals\r\n\r\n\t\t\ttmpGeo.computeFaceNormals();\r\n\t\t\ttmpGeo.computeVertexNormals();\r\n\r\n\t\t\t// store morph normals\r\n\r\n\t\t\tvar faceNormal, vertexNormals;\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\r\n\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\r\n\r\n\t\t\t\tfaceNormal.copy( face.normal );\r\n\r\n\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\r\n\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\r\n\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore original normals\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tface.normal = face.__originalFaceNormal;\r\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeTangents: function () {\r\n\r\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\r\n\r\n\t},\r\n\r\n\tcomputeLineDistances: function () {\r\n\r\n\t\tvar d = 0;\r\n\t\tvar vertices = this.vertices;\r\n\r\n\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tif ( i > 0 ) {\r\n\r\n\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.lineDistances[ i ] = d;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeBoundingBox: function () {\r\n\r\n\t\tif ( this.boundingBox === null ) {\r\n\r\n\t\t\tthis.boundingBox = new THREE.Box3();\r\n\r\n\t\t}\r\n\r\n\t\tthis.boundingBox.setFromPoints( this.vertices );\r\n\r\n\t},\r\n\r\n\tcomputeBoundingSphere: function () {\r\n\r\n\t\tif ( this.boundingSphere === null ) {\r\n\r\n\t\t\tthis.boundingSphere = new THREE.Sphere();\r\n\r\n\t\t}\r\n\r\n\t\tthis.boundingSphere.setFromPoints( this.vertices );\r\n\r\n\t},\r\n\r\n\tmerge: function ( geometry, matrix, materialIndexOffset ) {\r\n\r\n\t\tif ( geometry instanceof THREE.Geometry === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar normalMatrix,\r\n\t\tvertexOffset = this.vertices.length,\r\n\t\tvertices1 = this.vertices,\r\n\t\tvertices2 = geometry.vertices,\r\n\t\tfaces1 = this.faces,\r\n\t\tfaces2 = geometry.faces,\r\n\t\tuvs1 = this.faceVertexUvs[ 0 ],\r\n\t\tuvs2 = geometry.faceVertexUvs[ 0 ];\r\n\r\n\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\r\n\r\n\t\tif ( matrix !== undefined ) {\r\n\r\n\t\t\tnormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\r\n\r\n\t\t}\r\n\r\n\t\t// vertices\r\n\r\n\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar vertex = vertices2[ i ];\r\n\r\n\t\t\tvar vertexCopy = vertex.clone();\r\n\r\n\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\r\n\r\n\t\t\tvertices1.push( vertexCopy );\r\n\r\n\t\t}\r\n\r\n\t\t// faces\r\n\r\n\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\r\n\t\t\tfaceVertexNormals = face.vertexNormals,\r\n\t\t\tfaceVertexColors = face.vertexColors;\r\n\r\n\t\t\tfaceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\r\n\t\t\tfaceCopy.normal.copy( face.normal );\r\n\r\n\t\t\tif ( normalMatrix !== undefined ) {\r\n\r\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\r\n\r\n\t\t\t\tif ( normalMatrix !== undefined ) {\r\n\r\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfaceCopy.color.copy( face.color );\r\n\r\n\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tcolor = faceVertexColors[ j ];\r\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\r\n\r\n\t\t\tfaces1.push( faceCopy );\r\n\r\n\t\t}\r\n\r\n\t\t// uvs\r\n\r\n\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar uv = uvs2[ i ], uvCopy = [];\r\n\r\n\t\t\tif ( uv === undefined ) {\r\n\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tuvCopy.push( uv[ j ].clone() );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuvs1.push( uvCopy );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tmergeMesh: function ( mesh ) {\r\n\r\n\t\tif ( mesh instanceof THREE.Mesh === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\r\n\r\n\t\tthis.merge( mesh.geometry, mesh.matrix );\r\n\r\n\t},\r\n\r\n\t/*\r\n\t * Checks for duplicate vertices with hashmap.\r\n\t * Duplicated vertices are removed\r\n\t * and faces' vertices are updated.\r\n\t */\r\n\r\n\tmergeVertices: function () {\r\n\r\n\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\r\n\t\tvar unique = [], changes = [];\r\n\r\n\t\tvar v, key;\r\n\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\r\n\t\tvar precision = Math.pow( 10, precisionPoints );\r\n\t\tvar i, il, face;\r\n\t\tvar indices, j, jl;\r\n\r\n\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tv = this.vertices[ i ];\r\n\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\r\n\r\n\t\t\tif ( verticesMap[ key ] === undefined ) {\r\n\r\n\t\t\t\tverticesMap[ key ] = i;\r\n\t\t\t\tunique.push( this.vertices[ i ] );\r\n\t\t\t\tchanges[ i ] = unique.length - 1;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\r\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\r\n\t\t// if faces are completely degenerate after merging vertices, we\r\n\t\t// have to remove them from the geometry.\r\n\t\tvar faceIndicesToRemove = [];\r\n\r\n\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tface = this.faces[ i ];\r\n\r\n\t\t\tface.a = changes[ face.a ];\r\n\t\t\tface.b = changes[ face.b ];\r\n\t\t\tface.c = changes[ face.c ];\r\n\r\n\t\t\tindices = [ face.a, face.b, face.c ];\r\n\r\n\t\t\tvar dupIndex = - 1;\r\n\r\n\t\t\t// if any duplicate vertices are found in a Face3\r\n\t\t\t// we have to remove the face as nothing can be saved\r\n\t\t\tfor ( var n = 0; n < 3; n ++ ) {\r\n\r\n\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\r\n\r\n\t\t\t\t\tdupIndex = n;\r\n\t\t\t\t\tfaceIndicesToRemove.push( i );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\r\n\r\n\t\t\tvar idx = faceIndicesToRemove[ i ];\r\n\r\n\t\t\tthis.faces.splice( idx, 1 );\r\n\r\n\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Use unique set of vertices\r\n\r\n\t\tvar diff = this.vertices.length - unique.length;\r\n\t\tthis.vertices = unique;\r\n\t\treturn diff;\r\n\r\n\t},\r\n\r\n\tsortFacesByMaterialIndex: function () {\r\n\r\n\t\tvar faces = this.faces;\r\n\t\tvar length = faces.length;\r\n\r\n\t\t// tag faces\r\n\r\n\t\tfor ( var i = 0; i < length; i ++ ) {\r\n\r\n\t\t\tfaces[ i ]._id = i;\r\n\r\n\t\t}\r\n\r\n\t\t// sort faces\r\n\r\n\t\tfunction materialIndexSort( a, b ) {\r\n\r\n\t\t\treturn a.materialIndex - b.materialIndex;\r\n\r\n\t\t}\r\n\r\n\t\tfaces.sort( materialIndexSort );\r\n\r\n\t\t// sort uvs\r\n\r\n\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\r\n\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\r\n\r\n\t\tvar newUvs1, newUvs2;\r\n\r\n\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\r\n\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\r\n\r\n\t\tfor ( var i = 0; i < length; i ++ ) {\r\n\r\n\t\t\tvar id = faces[ i ]._id;\r\n\r\n\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\r\n\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\r\n\r\n\t\t}\r\n\r\n\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\r\n\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\r\n\r\n\t},\r\n\r\n\ttoJSON: function () {\r\n\r\n\t\tvar data = {\r\n\t\t\tmetadata: {\r\n\t\t\t\tversion: 4.4,\r\n\t\t\t\ttype: 'Geometry',\r\n\t\t\t\tgenerator: 'Geometry.toJSON'\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// standard Geometry serialization\r\n\r\n\t\tdata.uuid = this.uuid;\r\n\t\tdata.type = this.type;\r\n\t\tif ( this.name !== '' ) data.name = this.name;\r\n\r\n\t\tif ( this.parameters !== undefined ) {\r\n\r\n\t\t\tvar parameters = this.parameters;\r\n\r\n\t\t\tfor ( var key in parameters ) {\r\n\r\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn data;\r\n\r\n\t\t}\r\n\r\n\t\tvar vertices = [];\r\n\r\n\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\r\n\r\n\t\t\tvar vertex = this.vertices[ i ];\r\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\r\n\r\n\t\t}\r\n\r\n\t\tvar faces = [];\r\n\t\tvar normals = [];\r\n\t\tvar normalsHash = {};\r\n\t\tvar colors = [];\r\n\t\tvar colorsHash = {};\r\n\t\tvar uvs = [];\r\n\t\tvar uvsHash = {};\r\n\r\n\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\r\n\r\n\t\t\tvar face = this.faces[ i ];\r\n\r\n\t\t\tvar hasMaterial = true;\r\n\t\t\tvar hasFaceUv = false; // deprecated\r\n\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\r\n\t\t\tvar hasFaceNormal = face.normal.length() > 0;\r\n\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\r\n\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\r\n\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\r\n\r\n\t\t\tvar faceType = 0;\r\n\r\n\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\r\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\r\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\r\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\r\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\r\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\r\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\r\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\r\n\r\n\t\t\tfaces.push( faceType );\r\n\t\t\tfaces.push( face.a, face.b, face.c );\r\n\t\t\tfaces.push( face.materialIndex );\r\n\r\n\t\t\tif ( hasFaceVertexUv ) {\r\n\r\n\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\r\n\r\n\t\t\t\tfaces.push(\r\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\r\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\r\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\r\n\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceNormal ) {\r\n\r\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceVertexNormal ) {\r\n\r\n\t\t\t\tvar vertexNormals = face.vertexNormals;\r\n\r\n\t\t\t\tfaces.push(\r\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\r\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\r\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\r\n\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceColor ) {\r\n\r\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceVertexColor ) {\r\n\r\n\t\t\t\tvar vertexColors = face.vertexColors;\r\n\r\n\t\t\t\tfaces.push(\r\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\r\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\r\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\r\n\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction setBit( value, position, enabled ) {\r\n\r\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\r\n\r\n\t\t}\r\n\r\n\t\tfunction getNormalIndex( normal ) {\r\n\r\n\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\r\n\r\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\r\n\r\n\t\t\t\treturn normalsHash[ hash ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\r\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\r\n\r\n\t\t\treturn normalsHash[ hash ];\r\n\r\n\t\t}\r\n\r\n\t\tfunction getColorIndex( color ) {\r\n\r\n\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\r\n\r\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\r\n\r\n\t\t\t\treturn colorsHash[ hash ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcolorsHash[ hash ] = colors.length;\r\n\t\t\tcolors.push( color.getHex() );\r\n\r\n\t\t\treturn colorsHash[ hash ];\r\n\r\n\t\t}\r\n\r\n\t\tfunction getUvIndex( uv ) {\r\n\r\n\t\t\tvar hash = uv.x.toString() + uv.y.toString();\r\n\r\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\r\n\r\n\t\t\t\treturn uvsHash[ hash ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\r\n\t\t\tuvs.push( uv.x, uv.y );\r\n\r\n\t\t\treturn uvsHash[ hash ];\r\n\r\n\t\t}\r\n\r\n\t\tdata.data = {};\r\n\r\n\t\tdata.data.vertices = vertices;\r\n\t\tdata.data.normals = normals;\r\n\t\tif ( colors.length > 0 ) data.data.colors = colors;\r\n\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\r\n\t\tdata.data.faces = faces;\r\n\r\n\t\treturn data;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\t/*\r\n\t\t// Handle primitives\r\n\r\n\t\tvar parameters = this.parameters;\r\n\r\n\t\tif ( parameters !== undefined ) {\r\n\r\n\t\t\tvar values = [];\r\n\r\n\t\t\tfor ( var key in parameters ) {\r\n\r\n\t\t\t\tvalues.push( parameters[ key ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar geometry = Object.create( this.constructor.prototype );\r\n\t\t\tthis.constructor.apply( geometry, values );\r\n\t\t\treturn geometry;\r\n\r\n\t\t}\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\t\t*/\r\n\r\n\t\treturn new THREE.Geometry().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.vertices = [];\r\n\t\tthis.faces = [];\r\n\t\tthis.faceVertexUvs = [ [] ];\r\n\r\n\t\tvar vertices = source.vertices;\r\n\r\n\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tthis.vertices.push( vertices[ i ].clone() );\r\n\r\n\t\t}\r\n\r\n\t\tvar faces = source.faces;\r\n\r\n\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tthis.faces.push( faces[ i ].clone() );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\r\n\r\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\r\n\r\n\t\t\t\tthis.faceVertexUvs[ i ] = [];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\r\n\r\n\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\r\n\r\n\t\t\t\t\tvar uv = uvs[ k ];\r\n\r\n\t\t\t\t\tuvsCopy.push( uv.clone() );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.Geometry.prototype );\r\n\r\nTHREE.GeometryIdCount = 0;\r\n\r\n// File:src/core/DirectGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.DirectGeometry = function () {\r\n\r\n\tObject.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } );\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.name = '';\r\n\tthis.type = 'DirectGeometry';\r\n\r\n\tthis.indices = [];\r\n\tthis.vertices = [];\r\n\tthis.normals = [];\r\n\tthis.colors = [];\r\n\tthis.uvs = [];\r\n\tthis.uvs2 = [];\r\n\r\n\tthis.groups = [];\r\n\r\n\tthis.morphTargets = {};\r\n\r\n\tthis.skinWeights = [];\r\n\tthis.skinIndices = [];\r\n\r\n\t// this.lineDistances = [];\r\n\r\n\tthis.boundingBox = null;\r\n\tthis.boundingSphere = null;\r\n\r\n\t// update flags\r\n\r\n\tthis.verticesNeedUpdate = false;\r\n\tthis.normalsNeedUpdate = false;\r\n\tthis.colorsNeedUpdate = false;\r\n\tthis.uvsNeedUpdate = false;\r\n\tthis.groupsNeedUpdate = false;\r\n\r\n};\r\n\r\nTHREE.DirectGeometry.prototype = {\r\n\r\n\tconstructor: THREE.DirectGeometry,\r\n\r\n\tcomputeBoundingBox: THREE.Geometry.prototype.computeBoundingBox,\r\n\tcomputeBoundingSphere: THREE.Geometry.prototype.computeBoundingSphere,\r\n\r\n\tcomputeFaceNormals: function () {\r\n\r\n\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\r\n\r\n\t},\r\n\r\n\tcomputeVertexNormals: function () {\r\n\r\n\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\r\n\r\n\t},\r\n\r\n\tcomputeGroups: function ( geometry ) {\r\n\r\n\t\tvar group;\r\n\t\tvar groups = [];\r\n\t\tvar materialIndex;\r\n\r\n\t\tvar faces = geometry.faces;\r\n\r\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\r\n\r\n\t\t\tvar face = faces[ i ];\r\n\r\n\t\t\t// materials\r\n\r\n\t\t\tif ( face.materialIndex !== materialIndex ) {\r\n\r\n\t\t\t\tmaterialIndex = face.materialIndex;\r\n\r\n\t\t\t\tif ( group !== undefined ) {\r\n\r\n\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\r\n\t\t\t\t\tgroups.push( group );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tgroup = {\r\n\t\t\t\t\tstart: i * 3,\r\n\t\t\t\t\tmaterialIndex: materialIndex\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( group !== undefined ) {\r\n\r\n\t\t\tgroup.count = ( i * 3 ) - group.start;\r\n\t\t\tgroups.push( group );\r\n\r\n\t\t}\r\n\r\n\t\tthis.groups = groups;\r\n\r\n\t},\r\n\r\n\tfromGeometry: function ( geometry ) {\r\n\r\n\t\tvar faces = geometry.faces;\r\n\t\tvar vertices = geometry.vertices;\r\n\t\tvar faceVertexUvs = geometry.faceVertexUvs;\r\n\r\n\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\r\n\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\r\n\r\n\t\t// morphs\r\n\r\n\t\tvar morphTargets = geometry.morphTargets;\r\n\t\tvar morphTargetsLength = morphTargets.length;\r\n\r\n\t\tvar morphTargetsPosition;\r\n\r\n\t\tif ( morphTargetsLength > 0 ) {\r\n\r\n\t\t\tmorphTargetsPosition = [];\r\n\r\n\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\r\n\r\n\t\t\t\tmorphTargetsPosition[ i ] = [];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.morphTargets.position = morphTargetsPosition;\r\n\r\n\t\t}\r\n\r\n\t\tvar morphNormals = geometry.morphNormals;\r\n\t\tvar morphNormalsLength = morphNormals.length;\r\n\r\n\t\tvar morphTargetsNormal;\r\n\r\n\t\tif ( morphNormalsLength > 0 ) {\r\n\r\n\t\t\tmorphTargetsNormal = [];\r\n\r\n\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\r\n\r\n\t\t\t\tmorphTargetsNormal[ i ] = [];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.morphTargets.normal = morphTargetsNormal;\r\n\r\n\t\t}\r\n\r\n\t\t// skins\r\n\r\n\t\tvar skinIndices = geometry.skinIndices;\r\n\t\tvar skinWeights = geometry.skinWeights;\r\n\r\n\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\r\n\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\r\n\r\n\t\t//\r\n\r\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\r\n\r\n\t\t\tvar face = faces[ i ];\r\n\r\n\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\r\n\r\n\t\t\tvar vertexNormals = face.vertexNormals;\r\n\r\n\t\t\tif ( vertexNormals.length === 3 ) {\r\n\r\n\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar normal = face.normal;\r\n\r\n\t\t\t\tthis.normals.push( normal, normal, normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar vertexColors = face.vertexColors;\r\n\r\n\t\t\tif ( vertexColors.length === 3 ) {\r\n\r\n\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar color = face.color;\r\n\r\n\t\t\t\tthis.colors.push( color, color, color );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceVertexUv === true ) {\r\n\r\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\r\n\r\n\t\t\t\tif ( vertexUvs !== undefined ) {\r\n\r\n\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\r\n\r\n\t\t\t\t\tthis.uvs.push( new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceVertexUv2 === true ) {\r\n\r\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\r\n\r\n\t\t\t\tif ( vertexUvs !== undefined ) {\r\n\r\n\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\r\n\r\n\t\t\t\t\tthis.uvs2.push( new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// morphs\r\n\r\n\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\r\n\r\n\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\r\n\r\n\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\r\n\r\n\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\r\n\r\n\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// skins\r\n\r\n\t\t\tif ( hasSkinIndices ) {\r\n\r\n\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasSkinWeights ) {\r\n\r\n\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.computeGroups( geometry );\r\n\r\n\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\r\n\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\r\n\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\r\n\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\r\n\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.DirectGeometry.prototype );\r\n\r\n// File:src/core/BufferGeometry.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.BufferGeometry = function () {\r\n\r\n\tObject.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } );\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.name = '';\r\n\tthis.type = 'BufferGeometry';\r\n\r\n\tthis.index = null;\r\n\tthis.attributes = {};\r\n\r\n\tthis.morphAttributes = {};\r\n\r\n\tthis.groups = [];\r\n\r\n\tthis.boundingBox = null;\r\n\tthis.boundingSphere = null;\r\n\r\n\tthis.drawRange = { start: 0, count: Infinity };\r\n\r\n};\r\n\r\nTHREE.BufferGeometry.prototype = {\r\n\r\n\tconstructor: THREE.BufferGeometry,\r\n\r\n\tgetIndex: function () {\r\n\r\n\t\treturn this.index;\r\n\r\n\t},\r\n\r\n\tsetIndex: function ( index ) {\r\n\r\n\t\tthis.index = index;\r\n\r\n\t},\r\n\r\n\taddAttribute: function ( name, attribute ) {\r\n\r\n\t\tif ( attribute instanceof THREE.BufferAttribute === false && attribute instanceof THREE.InterleavedBufferAttribute === false ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\r\n\r\n\t\t\tthis.addAttribute( name, new THREE.BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tif ( name === 'index' ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\r\n\t\t\tthis.setIndex( attribute );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tthis.attributes[ name ] = attribute;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetAttribute: function ( name ) {\r\n\r\n\t\treturn this.attributes[ name ];\r\n\r\n\t},\r\n\r\n\tremoveAttribute: function ( name ) {\r\n\r\n\t\tdelete this.attributes[ name ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddGroup: function ( start, count, materialIndex ) {\r\n\r\n\t\tthis.groups.push( {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tcount: count,\r\n\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\r\n\r\n\t\t} );\r\n\r\n\t},\r\n\r\n\tclearGroups: function () {\r\n\r\n\t\tthis.groups = [];\r\n\r\n\t},\r\n\r\n\tsetDrawRange: function ( start, count ) {\r\n\r\n\t\tthis.drawRange.start = start;\r\n\t\tthis.drawRange.count = count;\r\n\r\n\t},\r\n\r\n\tapplyMatrix: function ( matrix ) {\r\n\r\n\t\tvar position = this.attributes.position;\r\n\r\n\t\tif ( position !== undefined ) {\r\n\r\n\t\t\tmatrix.applyToVector3Array( position.array );\r\n\t\t\tposition.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\tvar normal = this.attributes.normal;\r\n\r\n\t\tif ( normal !== undefined ) {\r\n\r\n\t\t\tvar normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\r\n\r\n\t\t\tnormalMatrix.applyToVector3Array( normal.array );\r\n\t\t\tnormal.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.boundingBox !== null ) {\r\n\r\n\t\t\tthis.computeBoundingBox();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.boundingSphere !== null ) {\r\n\r\n\t\t\tthis.computeBoundingSphere();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\trotateX: function () {\r\n\r\n\t\t// rotate geometry around world x-axis\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function rotateX( angle ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeRotationX( angle );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateY: function () {\r\n\r\n\t\t// rotate geometry around world y-axis\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function rotateY( angle ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeRotationY( angle );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateZ: function () {\r\n\r\n\t\t// rotate geometry around world z-axis\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function rotateZ( angle ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeRotationZ( angle );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslate: function () {\r\n\r\n\t\t// translate geometry\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function translate( x, y, z ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeTranslation( x, y, z );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tscale: function () {\r\n\r\n\t\t// scale geometry\r\n\r\n\t\tvar m1;\r\n\r\n\t\treturn function scale( x, y, z ) {\r\n\r\n\t\t\tif ( m1 === undefined ) m1 = new THREE.Matrix4();\r\n\r\n\t\t\tm1.makeScale( x, y, z );\r\n\r\n\t\t\tthis.applyMatrix( m1 );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tlookAt: function () {\r\n\r\n\t\tvar obj;\r\n\r\n\t\treturn function lookAt( vector ) {\r\n\r\n\t\t\tif ( obj === undefined ) obj = new THREE.Object3D();\r\n\r\n\t\t\tobj.lookAt( vector );\r\n\r\n\t\t\tobj.updateMatrix();\r\n\r\n\t\t\tthis.applyMatrix( obj.matrix );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tcenter: function () {\r\n\r\n\t\tthis.computeBoundingBox();\r\n\r\n\t\tvar offset = this.boundingBox.center().negate();\r\n\r\n\t\tthis.translate( offset.x, offset.y, offset.z );\r\n\r\n\t\treturn offset;\r\n\r\n\t},\r\n\r\n\tsetFromObject: function ( object ) {\r\n\r\n\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\r\n\r\n\t\tvar geometry = object.geometry;\r\n\r\n\t\tif ( object instanceof THREE.Points || object instanceof THREE.Line ) {\r\n\r\n\t\t\tvar positions = new THREE.Float32Attribute( geometry.vertices.length * 3, 3 );\r\n\t\t\tvar colors = new THREE.Float32Attribute( geometry.colors.length * 3, 3 );\r\n\r\n\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\r\n\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\r\n\r\n\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\r\n\r\n\t\t\t\tvar lineDistances = new THREE.Float32Attribute( geometry.lineDistances.length, 1 );\r\n\r\n\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( geometry.boundingSphere !== null ) {\r\n\r\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( geometry.boundingBox !== null ) {\r\n\r\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\tif ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\t\tthis.fromGeometry( geometry );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tupdateFromObject: function ( object ) {\r\n\r\n\t\tvar geometry = object.geometry;\r\n\r\n\t\tif ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\tvar direct = geometry.__directGeometry;\r\n\r\n\t\t\tif ( direct === undefined ) {\r\n\r\n\t\t\t\treturn this.fromGeometry( geometry );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\r\n\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\r\n\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\r\n\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\r\n\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\r\n\r\n\t\t\tgeometry.verticesNeedUpdate = false;\r\n\t\t\tgeometry.normalsNeedUpdate = false;\r\n\t\t\tgeometry.colorsNeedUpdate = false;\r\n\t\t\tgeometry.uvsNeedUpdate = false;\r\n\t\t\tgeometry.groupsNeedUpdate = false;\r\n\r\n\t\t\tgeometry = direct;\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.verticesNeedUpdate === true ) {\r\n\r\n\t\t\tvar attribute = this.attributes.position;\r\n\r\n\t\t\tif ( attribute !== undefined ) {\r\n\r\n\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\r\n\t\t\t\tattribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.verticesNeedUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.normalsNeedUpdate === true ) {\r\n\r\n\t\t\tvar attribute = this.attributes.normal;\r\n\r\n\t\t\tif ( attribute !== undefined ) {\r\n\r\n\t\t\t\tattribute.copyVector3sArray( geometry.normals );\r\n\t\t\t\tattribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.normalsNeedUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.colorsNeedUpdate === true ) {\r\n\r\n\t\t\tvar attribute = this.attributes.color;\r\n\r\n\t\t\tif ( attribute !== undefined ) {\r\n\r\n\t\t\t\tattribute.copyColorsArray( geometry.colors );\r\n\t\t\t\tattribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.colorsNeedUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.uvsNeedUpdate ) {\r\n\r\n\t\t\tvar attribute = this.attributes.uv;\r\n\r\n\t\t\tif ( attribute !== undefined ) {\r\n\r\n\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\r\n\t\t\t\tattribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.uvsNeedUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.lineDistancesNeedUpdate ) {\r\n\r\n\t\t\tvar attribute = this.attributes.lineDistance;\r\n\r\n\t\t\tif ( attribute !== undefined ) {\r\n\r\n\t\t\t\tattribute.copyArray( geometry.lineDistances );\r\n\t\t\t\tattribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.groupsNeedUpdate ) {\r\n\r\n\t\t\tgeometry.computeGroups( object.geometry );\r\n\t\t\tthis.groups = geometry.groups;\r\n\r\n\t\t\tgeometry.groupsNeedUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromGeometry: function ( geometry ) {\r\n\r\n\t\tgeometry.__directGeometry = new THREE.DirectGeometry().fromGeometry( geometry );\r\n\r\n\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\r\n\r\n\t},\r\n\r\n\tfromDirectGeometry: function ( geometry ) {\r\n\r\n\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\r\n\t\tthis.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\r\n\r\n\t\tif ( geometry.normals.length > 0 ) {\r\n\r\n\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\r\n\t\t\tthis.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.colors.length > 0 ) {\r\n\r\n\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\r\n\t\t\tthis.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.uvs.length > 0 ) {\r\n\r\n\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\r\n\t\t\tthis.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.uvs2.length > 0 ) {\r\n\r\n\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\r\n\t\t\tthis.addAttribute( 'uv2', new THREE.BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.indices.length > 0 ) {\r\n\r\n\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\r\n\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\r\n\t\t\tthis.setIndex( new THREE.BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\r\n\r\n\t\t}\r\n\r\n\t\t// groups\r\n\r\n\t\tthis.groups = geometry.groups;\r\n\r\n\t\t// morphs\r\n\r\n\t\tfor ( var name in geometry.morphTargets ) {\r\n\r\n\t\t\tvar array = [];\r\n\t\t\tvar morphTargets = geometry.morphTargets[ name ];\r\n\r\n\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar morphTarget = morphTargets[ i ];\r\n\r\n\t\t\t\tvar attribute = new THREE.Float32Attribute( morphTarget.length * 3, 3 );\r\n\r\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.morphAttributes[ name ] = array;\r\n\r\n\t\t}\r\n\r\n\t\t// skinning\r\n\r\n\t\tif ( geometry.skinIndices.length > 0 ) {\r\n\r\n\t\t\tvar skinIndices = new THREE.Float32Attribute( geometry.skinIndices.length * 4, 4 );\r\n\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.skinWeights.length > 0 ) {\r\n\r\n\t\t\tvar skinWeights = new THREE.Float32Attribute( geometry.skinWeights.length * 4, 4 );\r\n\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tif ( geometry.boundingSphere !== null ) {\r\n\r\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.boundingBox !== null ) {\r\n\r\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcomputeBoundingBox: function () {\r\n\r\n\t\tif ( this.boundingBox === null ) {\r\n\r\n\t\t\tthis.boundingBox = new THREE.Box3();\r\n\r\n\t\t}\r\n\r\n\t\tvar positions = this.attributes.position.array;\r\n\r\n\t\tif ( positions !== undefined ) {\r\n\r\n\t\t\tthis.boundingBox.setFromArray( positions );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.boundingBox.makeEmpty();\r\n\r\n\t\t}\r\n\r\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\r\n\r\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeBoundingSphere: function () {\r\n\r\n\t\tvar box = new THREE.Box3();\r\n\t\tvar vector = new THREE.Vector3();\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tif ( this.boundingSphere === null ) {\r\n\r\n\t\t\t\tthis.boundingSphere = new THREE.Sphere();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar positions = this.attributes.position.array;\r\n\r\n\t\t\tif ( positions ) {\r\n\r\n\t\t\t\tvar center = this.boundingSphere.center;\r\n\r\n\t\t\t\tbox.setFromArray( positions );\r\n\t\t\t\tbox.center( center );\r\n\r\n\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\r\n\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\r\n\r\n\t\t\t\tvar maxRadiusSq = 0;\r\n\r\n\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 3 ) {\r\n\r\n\t\t\t\t\tvector.fromArray( positions, i );\r\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\r\n\r\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\r\n\r\n\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tcomputeFaceNormals: function () {\r\n\r\n\t\t// backwards compatibility\r\n\r\n\t},\r\n\r\n\tcomputeVertexNormals: function () {\r\n\r\n\t\tvar index = this.index;\r\n\t\tvar attributes = this.attributes;\r\n\t\tvar groups = this.groups;\r\n\r\n\t\tif ( attributes.position ) {\r\n\r\n\t\t\tvar positions = attributes.position.array;\r\n\r\n\t\t\tif ( attributes.normal === undefined ) {\r\n\r\n\t\t\t\tthis.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( positions.length ), 3 ) );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// reset existing normals to zero\r\n\r\n\t\t\t\tvar array = attributes.normal.array;\r\n\r\n\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tarray[ i ] = 0;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar normals = attributes.normal.array;\r\n\r\n\t\t\tvar vA, vB, vC,\r\n\r\n\t\t\tpA = new THREE.Vector3(),\r\n\t\t\tpB = new THREE.Vector3(),\r\n\t\t\tpC = new THREE.Vector3(),\r\n\r\n\t\t\tcb = new THREE.Vector3(),\r\n\t\t\tab = new THREE.Vector3();\r\n\r\n\t\t\t// indexed elements\r\n\r\n\t\t\tif ( index ) {\r\n\r\n\t\t\t\tvar indices = index.array;\r\n\r\n\t\t\t\tif ( groups.length === 0 ) {\r\n\r\n\t\t\t\t\tthis.addGroup( 0, indices.length );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\r\n\r\n\t\t\t\t\tvar group = groups[ j ];\r\n\r\n\t\t\t\t\tvar start = group.start;\r\n\t\t\t\t\tvar count = group.count;\r\n\r\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\r\n\r\n\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\r\n\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\r\n\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\r\n\r\n\t\t\t\t\t\tpA.fromArray( positions, vA );\r\n\t\t\t\t\t\tpB.fromArray( positions, vB );\r\n\t\t\t\t\t\tpC.fromArray( positions, vC );\r\n\r\n\t\t\t\t\t\tcb.subVectors( pC, pB );\r\n\t\t\t\t\t\tab.subVectors( pA, pB );\r\n\t\t\t\t\t\tcb.cross( ab );\r\n\r\n\t\t\t\t\t\tnormals[ vA ] += cb.x;\r\n\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\r\n\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\r\n\r\n\t\t\t\t\t\tnormals[ vB ] += cb.x;\r\n\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\r\n\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\r\n\r\n\t\t\t\t\t\tnormals[ vC ] += cb.x;\r\n\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\r\n\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\r\n\r\n\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\r\n\r\n\t\t\t\t\tpA.fromArray( positions, i );\r\n\t\t\t\t\tpB.fromArray( positions, i + 3 );\r\n\t\t\t\t\tpC.fromArray( positions, i + 6 );\r\n\r\n\t\t\t\t\tcb.subVectors( pC, pB );\r\n\t\t\t\t\tab.subVectors( pA, pB );\r\n\t\t\t\t\tcb.cross( ab );\r\n\r\n\t\t\t\t\tnormals[ i ] = cb.x;\r\n\t\t\t\t\tnormals[ i + 1 ] = cb.y;\r\n\t\t\t\t\tnormals[ i + 2 ] = cb.z;\r\n\r\n\t\t\t\t\tnormals[ i + 3 ] = cb.x;\r\n\t\t\t\t\tnormals[ i + 4 ] = cb.y;\r\n\t\t\t\t\tnormals[ i + 5 ] = cb.z;\r\n\r\n\t\t\t\t\tnormals[ i + 6 ] = cb.x;\r\n\t\t\t\t\tnormals[ i + 7 ] = cb.y;\r\n\t\t\t\t\tnormals[ i + 8 ] = cb.z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.normalizeNormals();\r\n\r\n\t\t\tattributes.normal.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tmerge: function ( geometry, offset ) {\r\n\r\n\t\tif ( geometry instanceof THREE.BufferGeometry === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tif ( offset === undefined ) offset = 0;\r\n\r\n\t\tvar attributes = this.attributes;\r\n\r\n\t\tfor ( var key in attributes ) {\r\n\r\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\r\n\r\n\t\t\tvar attribute1 = attributes[ key ];\r\n\t\t\tvar attributeArray1 = attribute1.array;\r\n\r\n\t\t\tvar attribute2 = geometry.attributes[ key ];\r\n\t\t\tvar attributeArray2 = attribute2.array;\r\n\r\n\t\t\tvar attributeSize = attribute2.itemSize;\r\n\r\n\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\r\n\r\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnormalizeNormals: function () {\r\n\r\n\t\tvar normals = this.attributes.normal.array;\r\n\r\n\t\tvar x, y, z, n;\r\n\r\n\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\r\n\r\n\t\t\tx = normals[ i ];\r\n\t\t\ty = normals[ i + 1 ];\r\n\t\t\tz = normals[ i + 2 ];\r\n\r\n\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\r\n\r\n\t\t\tnormals[ i ] *= n;\r\n\t\t\tnormals[ i + 1 ] *= n;\r\n\t\t\tnormals[ i + 2 ] *= n;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttoNonIndexed: function () {\r\n\r\n\t\tif ( this.index === null ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tvar geometry2 = new THREE.BufferGeometry();\r\n\r\n\t\tvar indices = this.index.array;\r\n\t\tvar attributes = this.attributes;\r\n\r\n\t\tfor ( var name in attributes ) {\r\n\r\n\t\t\tvar attribute = attributes[ name ];\r\n\r\n\t\t\tvar array = attribute.array;\r\n\t\t\tvar itemSize = attribute.itemSize;\r\n\r\n\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\r\n\r\n\t\t\tvar index = 0, index2 = 0;\r\n\r\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tindex = indices[ i ] * itemSize;\r\n\r\n\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\r\n\r\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry2.addAttribute( name, new THREE.BufferAttribute( array2, itemSize ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn geometry2;\r\n\r\n\t},\r\n\r\n\ttoJSON: function () {\r\n\r\n\t\tvar data = {\r\n\t\t\tmetadata: {\r\n\t\t\t\tversion: 4.4,\r\n\t\t\t\ttype: 'BufferGeometry',\r\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// standard BufferGeometry serialization\r\n\r\n\t\tdata.uuid = this.uuid;\r\n\t\tdata.type = this.type;\r\n\t\tif ( this.name !== '' ) data.name = this.name;\r\n\r\n\t\tif ( this.parameters !== undefined ) {\r\n\r\n\t\t\tvar parameters = this.parameters;\r\n\r\n\t\t\tfor ( var key in parameters ) {\r\n\r\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn data;\r\n\r\n\t\t}\r\n\r\n\t\tdata.data = { attributes: {} };\r\n\r\n\t\tvar index = this.index;\r\n\r\n\t\tif ( index !== null ) {\r\n\r\n\t\t\tvar array = Array.prototype.slice.call( index.array );\r\n\r\n\t\t\tdata.data.index = {\r\n\t\t\t\ttype: index.array.constructor.name,\r\n\t\t\t\tarray: array\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\tvar attributes = this.attributes;\r\n\r\n\t\tfor ( var key in attributes ) {\r\n\r\n\t\t\tvar attribute = attributes[ key ];\r\n\r\n\t\t\tvar array = Array.prototype.slice.call( attribute.array );\r\n\r\n\t\t\tdata.data.attributes[ key ] = {\r\n\t\t\t\titemSize: attribute.itemSize,\r\n\t\t\t\ttype: attribute.array.constructor.name,\r\n\t\t\t\tarray: array,\r\n\t\t\t\tnormalized: attribute.normalized\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\tvar groups = this.groups;\r\n\r\n\t\tif ( groups.length > 0 ) {\r\n\r\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\r\n\r\n\t\t}\r\n\r\n\t\tvar boundingSphere = this.boundingSphere;\r\n\r\n\t\tif ( boundingSphere !== null ) {\r\n\r\n\t\t\tdata.data.boundingSphere = {\r\n\t\t\t\tcenter: boundingSphere.center.toArray(),\r\n\t\t\t\tradius: boundingSphere.radius\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\t/*\r\n\t\t// Handle primitives\r\n\r\n\t\tvar parameters = this.parameters;\r\n\r\n\t\tif ( parameters !== undefined ) {\r\n\r\n\t\t\tvar values = [];\r\n\r\n\t\t\tfor ( var key in parameters ) {\r\n\r\n\t\t\t\tvalues.push( parameters[ key ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar geometry = Object.create( this.constructor.prototype );\r\n\t\t\tthis.constructor.apply( geometry, values );\r\n\t\t\treturn geometry;\r\n\r\n\t\t}\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\t\t*/\r\n\r\n\t\treturn new THREE.BufferGeometry().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tvar index = source.index;\r\n\r\n\t\tif ( index !== null ) {\r\n\r\n\t\t\tthis.setIndex( index.clone() );\r\n\r\n\t\t}\r\n\r\n\t\tvar attributes = source.attributes;\r\n\r\n\t\tfor ( var name in attributes ) {\r\n\r\n\t\t\tvar attribute = attributes[ name ];\r\n\t\t\tthis.addAttribute( name, attribute.clone() );\r\n\r\n\t\t}\r\n\r\n\t\tvar groups = source.groups;\r\n\r\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar group = groups[ i ];\r\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.BufferGeometry.prototype );\r\n\r\nTHREE.BufferGeometry.MaxIndex = 65535;\r\n\r\n// File:src/core/InstancedBufferGeometry.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n */\r\n\r\nTHREE.InstancedBufferGeometry = function () {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'InstancedBufferGeometry';\r\n\tthis.maxInstancedCount = undefined;\r\n\r\n};\r\n\r\nTHREE.InstancedBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.InstancedBufferGeometry.prototype.constructor = THREE.InstancedBufferGeometry;\r\n\r\nTHREE.InstancedBufferGeometry.prototype.addGroup = function ( start, count, instances ) {\r\n\r\n\tthis.groups.push( {\r\n\r\n\t\tstart: start,\r\n\t\tcount: count,\r\n\t\tinstances: instances\r\n\r\n\t} );\r\n\r\n};\r\n\r\nTHREE.InstancedBufferGeometry.prototype.copy = function ( source ) {\r\n\r\n\tvar index = source.index;\r\n\r\n\tif ( index !== null ) {\r\n\r\n\t\tthis.setIndex( index.clone() );\r\n\r\n\t}\r\n\r\n\tvar attributes = source.attributes;\r\n\r\n\tfor ( var name in attributes ) {\r\n\r\n\t\tvar attribute = attributes[ name ];\r\n\t\tthis.addAttribute( name, attribute.clone() );\r\n\r\n\t}\r\n\r\n\tvar groups = source.groups;\r\n\r\n\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\r\n\r\n\t\tvar group = groups[ i ];\r\n\t\tthis.addGroup( group.start, group.count, group.instances );\r\n\r\n\t}\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.InstancedBufferGeometry.prototype );\r\n\r\n// File:src/core/Uniform.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Uniform = function ( value ) {\r\n\r\n\tif ( typeof value === 'string' ) {\r\n\r\n\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\r\n\t\tvalue = arguments[ 1 ];\r\n\r\n\t}\r\n\r\n\tthis.value = value;\r\n\r\n\tthis.dynamic = false;\r\n\r\n};\r\n\r\nTHREE.Uniform.prototype = {\r\n\r\n\tconstructor: THREE.Uniform,\r\n\r\n\tonUpdate: function ( callback ) {\r\n\r\n\t\tthis.dynamic = true;\r\n\t\tthis.onUpdateCallback = callback;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/animation/AnimationClip.js\r\n\r\n/**\r\n *\r\n * Reusable set of Tracks that represent an animation.\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n */\r\n\r\nTHREE.AnimationClip = function ( name, duration, tracks ) {\r\n\r\n\tthis.name = name || THREE.Math.generateUUID();\r\n\tthis.tracks = tracks;\r\n\tthis.duration = ( duration !== undefined ) ? duration : -1;\r\n\r\n\t// this means it should figure out its duration by scanning the tracks\r\n\tif ( this.duration < 0 ) {\r\n\r\n\t\tthis.resetDuration();\r\n\r\n\t}\r\n\r\n\t// maybe only do these on demand, as doing them here could potentially slow down loading\r\n\t// but leaving these here during development as this ensures a lot of testing of these functions\r\n\tthis.trim();\r\n\tthis.optimize();\r\n\r\n};\r\n\r\nTHREE.AnimationClip.prototype = {\r\n\r\n\tconstructor: THREE.AnimationClip,\r\n\r\n\tresetDuration: function() {\r\n\r\n\t\tvar tracks = this.tracks,\r\n\t\t\tduration = 0;\r\n\r\n\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar track = this.tracks[ i ];\r\n\r\n\t\t\tduration = Math.max(\r\n\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\r\n\r\n\t\t}\r\n\r\n\t\tthis.duration = duration;\r\n\r\n\t},\r\n\r\n\ttrim: function() {\r\n\r\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\r\n\r\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\toptimize: function() {\r\n\r\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\r\n\r\n\t\t\tthis.tracks[ i ].optimize();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Static methods:\r\n\r\nObject.assign( THREE.AnimationClip, {\r\n\r\n\tparse: function( json ) {\r\n\r\n\t\tvar tracks = [],\r\n\t\t\tjsonTracks = json.tracks,\r\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\r\n\r\n\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\r\n\r\n\t\t\ttracks.push( THREE.KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn new THREE.AnimationClip( json.name, json.duration, tracks );\r\n\r\n\t},\r\n\r\n\r\n\ttoJSON: function( clip ) {\r\n\r\n\t\tvar tracks = [],\r\n\t\t\tclipTracks = clip.tracks;\r\n\r\n\t\tvar json = {\r\n\r\n\t\t\t'name': clip.name,\r\n\t\t\t'duration': clip.duration,\r\n\t\t\t'tracks': tracks\r\n\r\n\t\t};\r\n\r\n\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\r\n\r\n\t\t\ttracks.push( THREE.KeyframeTrack.toJSON( clipTracks[ i ] ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn json;\r\n\r\n\t},\r\n\r\n\r\n\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\r\n\r\n\t\tvar numMorphTargets = morphTargetSequence.length;\r\n\t\tvar tracks = [];\r\n\r\n\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\r\n\r\n\t\t\tvar times = [];\r\n\t\t\tvar values = [];\r\n\r\n\t\t\ttimes.push(\r\n\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\r\n\t\t\t\t\ti,\r\n\t\t\t\t\t( i + 1 ) % numMorphTargets );\r\n\r\n\t\t\tvalues.push( 0, 1, 0 );\r\n\r\n\t\t\tvar order = THREE.AnimationUtils.getKeyframeOrder( times );\r\n\t\t\ttimes = THREE.AnimationUtils.sortedArray( times, 1, order );\r\n\t\t\tvalues = THREE.AnimationUtils.sortedArray( values, 1, order );\r\n\r\n\t\t\t// if there is a key at the first frame, duplicate it as the\r\n\t\t\t// last frame as well for perfect loop.\r\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\r\n\r\n\t\t\t\ttimes.push( numMorphTargets );\r\n\t\t\t\tvalues.push( values[ 0 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttracks.push(\r\n\t\t\t\t\tnew THREE.NumberKeyframeTrack(\r\n\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\r\n\t\t\t\t\t\ttimes, values\r\n\t\t\t\t\t).scale( 1.0 / fps ) );\r\n\t\t}\r\n\r\n\t\treturn new THREE.AnimationClip( name, -1, tracks );\r\n\r\n\t},\r\n\r\n\tfindByName: function( clipArray, name ) {\r\n\r\n\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\r\n\r\n\t\t\tif ( clipArray[ i ].name === name ) {\r\n\r\n\t\t\t\treturn clipArray[ i ];\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\r\n\t},\r\n\r\n\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\r\n\r\n\t\tvar animationToMorphTargets = {};\r\n\r\n\t\t// tested with https://regex101.com/ on trick sequences\r\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\r\n\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\r\n\r\n\t\t// sort morph target names into animation groups based\r\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\r\n\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morphTarget = morphTargets[ i ];\r\n\t\t\tvar parts = morphTarget.name.match( pattern );\r\n\r\n\t\t\tif ( parts && parts.length > 1 ) {\r\n\r\n\t\t\t\tvar name = parts[ 1 ];\r\n\r\n\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\r\n\t\t\t\tif ( ! animationMorphTargets ) {\r\n\r\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tanimationMorphTargets.push( morphTarget );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar clips = [];\r\n\r\n\t\tfor ( var name in animationToMorphTargets ) {\r\n\r\n\t\t\tclips.push( THREE.AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn clips;\r\n\r\n\t},\r\n\r\n\t// parse the animation.hierarchy format\r\n\tparseAnimation: function( animation, bones, nodeName ) {\r\n\r\n\t\tif ( ! animation ) {\r\n\r\n\t\t\tconsole.error( \" no animation in JSONLoader data\" );\r\n\t\t\treturn null;\r\n\r\n\t\t}\r\n\r\n\t\tvar addNonemptyTrack = function(\r\n\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\r\n\r\n\t\t\t// only return track if there are actually keys.\r\n\t\t\tif ( animationKeys.length !== 0 ) {\r\n\r\n\t\t\t\tvar times = [];\r\n\t\t\t\tvar values = [];\r\n\r\n\t\t\t\tTHREE.AnimationUtils.flattenJSON(\r\n\t\t\t\t\t\tanimationKeys, times, values, propertyName );\r\n\r\n\t\t\t\t// empty keys are filtered out, so check again\r\n\t\t\t\tif ( times.length !== 0 ) {\r\n\r\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tvar tracks = [];\r\n\r\n\t\tvar clipName = animation.name || 'default';\r\n\t\t// automatic length determination in AnimationClip.\r\n\t\tvar duration = animation.length || -1;\r\n\t\tvar fps = animation.fps || 30;\r\n\r\n\t\tvar hierarchyTracks = animation.hierarchy || [];\r\n\r\n\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\r\n\r\n\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\r\n\r\n\t\t\t// skip empty tracks\r\n\t\t\tif ( ! animationKeys || animationKeys.length == 0 ) continue;\r\n\r\n\t\t\t// process morph targets in a way exactly compatible\r\n\t\t\t// with AnimationHandler.init( animation )\r\n\t\t\tif ( animationKeys[0].morphTargets ) {\r\n\r\n\t\t\t\t// figure out all morph targets used in this track\r\n\t\t\t\tvar morphTargetNames = {};\r\n\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\r\n\r\n\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\r\n\r\n\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\r\n\r\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// create a track for each morph target with all zero\r\n\t\t\t\t// morphTargetInfluences except for the keys in which\r\n\t\t\t\t// the morphTarget is named.\r\n\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\r\n\r\n\t\t\t\t\tvar times = [];\r\n\t\t\t\t\tvar values = [];\r\n\r\n\t\t\t\t\tfor ( var m = 0;\r\n\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\r\n\r\n\t\t\t\t\t\tvar animationKey = animationKeys[k];\r\n\r\n\t\t\t\t\t\ttimes.push( animationKey.time );\r\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 )\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttracks.push( new THREE.NumberKeyframeTrack(\r\n\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// ...assume skeletal animation\r\n\r\n\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\r\n\r\n\t\t\t\taddNonemptyTrack(\r\n\t\t\t\t\t\tTHREE.VectorKeyframeTrack, boneName + '.position',\r\n\t\t\t\t\t\tanimationKeys, 'pos', tracks );\r\n\r\n\t\t\t\taddNonemptyTrack(\r\n\t\t\t\t\t\tTHREE.QuaternionKeyframeTrack, boneName + '.quaternion',\r\n\t\t\t\t\t\tanimationKeys, 'rot', tracks );\r\n\r\n\t\t\t\taddNonemptyTrack(\r\n\t\t\t\t\t\tTHREE.VectorKeyframeTrack, boneName + '.scale',\r\n\t\t\t\t\t\tanimationKeys, 'scl', tracks );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( tracks.length === 0 ) {\r\n\r\n\t\t\treturn null;\r\n\r\n\t\t}\r\n\r\n\t\tvar clip = new THREE.AnimationClip( clipName, duration, tracks );\r\n\r\n\t\treturn clip;\r\n\r\n\t}\r\n\r\n} );\r\n\r\n\r\n// File:src/animation/AnimationMixer.js\r\n\r\n/**\r\n *\r\n * Player for AnimationClips.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.AnimationMixer = function( root ) {\r\n\r\n\tthis._root = root;\r\n\tthis._initMemoryManager();\r\n\tthis._accuIndex = 0;\r\n\r\n\tthis.time = 0;\r\n\r\n\tthis.timeScale = 1.0;\r\n\r\n};\r\n\r\nTHREE.AnimationMixer.prototype = {\r\n\r\n\tconstructor: THREE.AnimationMixer,\r\n\r\n\t// return an action for a clip optionally using a custom root target\r\n\t// object (this method allocates a lot of dynamic memory in case a\r\n\t// previously unknown clip/root combination is specified)\r\n\tclipAction: function( clip, optionalRoot ) {\r\n\r\n\t\tvar root = optionalRoot || this._root,\r\n\t\t\trootUuid = root.uuid,\r\n\t\t\tclipName = ( typeof clip === 'string' ) ? clip : clip.name,\r\n\t\t\tclipObject = ( clip !== clipName ) ? clip : null,\r\n\r\n\t\t\tactionsForClip = this._actionsByClip[ clipName ],\r\n\t\t\tprototypeAction;\r\n\r\n\t\tif ( actionsForClip !== undefined ) {\r\n\r\n\t\t\tvar existingAction =\r\n\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\r\n\r\n\t\t\tif ( existingAction !== undefined ) {\r\n\r\n\t\t\t\treturn existingAction;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// we know the clip, so we don't have to parse all\r\n\t\t\t// the bindings again but can just copy\r\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\r\n\r\n\t\t\t// also, take the clip from the prototype action\r\n\t\t\tclipObject = prototypeAction._clip;\r\n\r\n\t\t\tif ( clip !== clipName && clip !== clipObject ) {\r\n\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t\t\"Different clips with the same name detected!\" );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// clip must be known when specified via string\r\n\t\tif ( clipObject === null ) return null;\r\n\r\n\t\t// allocate all resources required to run it\r\n\t\tvar newAction = new THREE.\r\n\t\t\t\tAnimationMixer._Action( this, clipObject, optionalRoot );\r\n\r\n\t\tthis._bindAction( newAction, prototypeAction );\r\n\r\n\t\t// and make the action known to the memory manager\r\n\t\tthis._addInactiveAction( newAction, clipName, rootUuid );\r\n\r\n\t\treturn newAction;\r\n\r\n\t},\r\n\r\n\t// get an existing action\r\n\texistingAction: function( clip, optionalRoot ) {\r\n\r\n\t\tvar root = optionalRoot || this._root,\r\n\t\t\trootUuid = root.uuid,\r\n\t\t\tclipName = ( typeof clip === 'string' ) ? clip : clip.name,\r\n\t\t\tactionsForClip = this._actionsByClip[ clipName ];\r\n\r\n\t\tif ( actionsForClip !== undefined ) {\r\n\r\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\r\n\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\r\n\t},\r\n\r\n\t// deactivates all previously scheduled actions\r\n\tstopAllAction: function() {\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tnActions = this._nActiveActions,\r\n\t\t\tbindings = this._bindings,\r\n\t\t\tnBindings = this._nActiveBindings;\r\n\r\n\t\tthis._nActiveActions = 0;\r\n\t\tthis._nActiveBindings = 0;\r\n\r\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\r\n\r\n\t\t\tactions[ i ].reset();\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\r\n\r\n\t\t\tbindings[ i ].useCount = 0;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// advance the time and update apply the animation\r\n\tupdate: function( deltaTime ) {\r\n\r\n\t\tdeltaTime *= this.timeScale;\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tnActions = this._nActiveActions,\r\n\r\n\t\t\ttime = this.time += deltaTime,\r\n\t\t\ttimeDirection = Math.sign( deltaTime ),\r\n\r\n\t\t\taccuIndex = this._accuIndex ^= 1;\r\n\r\n\t\t// run active actions\r\n\r\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\r\n\r\n\t\t\tvar action = actions[ i ];\r\n\r\n\t\t\tif ( action.enabled ) {\r\n\r\n\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// update scene graph\r\n\r\n\t\tvar bindings = this._bindings,\r\n\t\t\tnBindings = this._nActiveBindings;\r\n\r\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\r\n\r\n\t\t\tbindings[ i ].apply( accuIndex );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// return this mixer's root target object\r\n\tgetRoot: function() {\r\n\r\n\t\treturn this._root;\r\n\r\n\t},\r\n\r\n\t// free all resources specific to a particular clip\r\n\tuncacheClip: function( clip ) {\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tclipName = clip.name,\r\n\t\t\tactionsByClip = this._actionsByClip,\r\n\t\t\tactionsForClip = actionsByClip[ clipName ];\r\n\r\n\t\tif ( actionsForClip !== undefined ) {\r\n\r\n\t\t\t// note: just calling _removeInactiveAction would mess up the\r\n\t\t\t// iteration state and also require updating the state we can\r\n\t\t\t// just throw away\r\n\r\n\t\t\tvar actionsToRemove = actionsForClip.knownActions;\r\n\r\n\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar action = actionsToRemove[ i ];\r\n\r\n\t\t\t\tthis._deactivateAction( action );\r\n\r\n\t\t\t\tvar cacheIndex = action._cacheIndex,\r\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\r\n\r\n\t\t\t\taction._cacheIndex = null;\r\n\t\t\t\taction._byClipCacheIndex = null;\r\n\r\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\r\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\r\n\t\t\t\tactions.pop();\r\n\r\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tdelete actionsByClip[ clipName ];\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t// free all resources specific to a particular root target object\r\n\tuncacheRoot: function( root ) {\r\n\r\n\t\tvar rootUuid = root.uuid,\r\n\t\t\tactionsByClip = this._actionsByClip;\r\n\r\n\t\tfor ( var clipName in actionsByClip ) {\r\n\r\n\t\t\tvar actionByRoot = actionsByClip[ clipName ].actionByRoot,\r\n\t\t\t\taction = actionByRoot[ rootUuid ];\r\n\r\n\t\t\tif ( action !== undefined ) {\r\n\r\n\t\t\t\tthis._deactivateAction( action );\r\n\t\t\t\tthis._removeInactiveAction( action );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\r\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\r\n\r\n\t\tif ( bindingByName !== undefined ) {\r\n\r\n\t\t\tfor ( var trackName in bindingByName ) {\r\n\r\n\t\t\t\tvar binding = bindingByName[ trackName ];\r\n\t\t\t\tbinding.restoreOriginalState();\r\n\t\t\t\tthis._removeInactiveBinding( binding );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t// remove a targeted clip from the cache\r\n\tuncacheAction: function( clip, optionalRoot ) {\r\n\r\n\t\tvar action = this.existingAction( clip, optionalRoot );\r\n\r\n\t\tif ( action !== null ) {\r\n\r\n\t\t\tthis._deactivateAction( action );\r\n\t\t\tthis._removeInactiveAction( action );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.AnimationMixer.prototype );\r\n\r\nTHREE.AnimationMixer._Action =\r\n\t\tfunction( mixer, clip, localRoot ) {\r\n\r\n\tthis._mixer = mixer;\r\n\tthis._clip = clip;\r\n\tthis._localRoot = localRoot || null;\r\n\r\n\tvar tracks = clip.tracks,\r\n\t\tnTracks = tracks.length,\r\n\t\tinterpolants = new Array( nTracks );\r\n\r\n\tvar interpolantSettings = {\r\n\t\t\tendingStart: \tTHREE.ZeroCurvatureEnding,\r\n\t\t\tendingEnd:\t\tTHREE.ZeroCurvatureEnding\r\n\t};\r\n\r\n\tfor ( var i = 0; i !== nTracks; ++ i ) {\r\n\r\n\t\tvar interpolant = tracks[ i ].createInterpolant( null );\r\n\t\tinterpolants[ i ] = interpolant;\r\n\t\tinterpolant.settings = interpolantSettings\r\n\r\n\t}\r\n\r\n\tthis._interpolantSettings = interpolantSettings;\r\n\r\n\tthis._interpolants = interpolants;\t// bound by the mixer\r\n\r\n\t// inside: PropertyMixer (managed by the mixer)\r\n\tthis._propertyBindings = new Array( nTracks );\r\n\r\n\tthis._cacheIndex = null;\t\t\t// for the memory manager\r\n\tthis._byClipCacheIndex = null;\t\t// for the memory manager\r\n\r\n\tthis._timeScaleInterpolant = null;\r\n\tthis._weightInterpolant = null;\r\n\r\n\tthis.loop = THREE.LoopRepeat;\r\n\tthis._loopCount = -1;\r\n\r\n\t// global mixer time when the action is to be started\r\n\t// it's set back to 'null' upon start of the action\r\n\tthis._startTime = null;\r\n\r\n\t// scaled local time of the action\r\n\t// gets clamped or wrapped to 0..clip.duration according to loop\r\n\tthis.time = 0;\r\n\r\n\tthis.timeScale = 1;\r\n\tthis._effectiveTimeScale = 1;\r\n\r\n\tthis.weight = 1;\r\n\tthis._effectiveWeight = 1;\r\n\r\n\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\r\n\r\n\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\r\n\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\r\n\r\n\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\r\n\r\n\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\r\n\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\r\n\r\n};\r\n\r\nTHREE.AnimationMixer._Action.prototype = {\r\n\r\n\tconstructor: THREE.AnimationMixer._Action,\r\n\r\n\t// State & Scheduling\r\n\r\n\tplay: function() {\r\n\r\n\t\tthis._mixer._activateAction( this );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tstop: function() {\r\n\r\n\t\tthis._mixer._deactivateAction( this );\r\n\r\n\t\treturn this.reset();\r\n\r\n\t},\r\n\r\n\treset: function() {\r\n\r\n\t\tthis.paused = false;\r\n\t\tthis.enabled = true;\r\n\r\n\t\tthis.time = 0;\t\t\t// restart clip\r\n\t\tthis._loopCount = -1;\t// forget previous loops\r\n\t\tthis._startTime = null;\t// forget scheduling\r\n\r\n\t\treturn this.stopFading().stopWarping();\r\n\r\n\t},\r\n\r\n\tisRunning: function() {\r\n\r\n\t\tvar start = this._startTime;\r\n\r\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\r\n\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this )\r\n\r\n\t},\r\n\r\n\t// return true when play has been called\r\n\tisScheduled: function() {\r\n\r\n\t\treturn this._mixer._isActiveAction( this );\r\n\r\n\t},\r\n\r\n\tstartAt: function( time ) {\r\n\r\n\t\tthis._startTime = time;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetLoop: function( mode, repetitions ) {\r\n\r\n\t\tthis.loop = mode;\r\n\t\tthis.repetitions = repetitions;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// Weight\r\n\r\n\t// set the weight stopping any scheduled fading\r\n\t// although .enabled = false yields an effective weight of zero, this\r\n\t// method does *not* change .enabled, because it would be confusing\r\n\tsetEffectiveWeight: function( weight ) {\r\n\r\n\t\tthis.weight = weight;\r\n\r\n\t\t// note: same logic as when updated at runtime\r\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\r\n\r\n\t\treturn this.stopFading();\r\n\r\n\t},\r\n\r\n\t// return the weight considering fading and .enabled\r\n\tgetEffectiveWeight: function() {\r\n\r\n\t\treturn this._effectiveWeight;\r\n\r\n\t},\r\n\r\n\tfadeIn: function( duration ) {\r\n\r\n\t\treturn this._scheduleFading( duration, 0, 1 );\r\n\r\n\t},\r\n\r\n\tfadeOut: function( duration ) {\r\n\r\n\t\treturn this._scheduleFading( duration, 1, 0 );\r\n\r\n\t},\r\n\r\n\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\r\n\r\n\t\tvar mixer = this._mixer;\r\n\r\n\t\tfadeOutAction.fadeOut( duration );\r\n\t\tthis.fadeIn( duration );\r\n\r\n\t\tif( warp ) {\r\n\r\n\t\t\tvar fadeInDuration = this._clip.duration,\r\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\r\n\r\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\r\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\r\n\r\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\r\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcrossFadeTo: function( fadeInAction, duration, warp ) {\r\n\r\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\r\n\r\n\t},\r\n\r\n\tstopFading: function() {\r\n\r\n\t\tvar weightInterpolant = this._weightInterpolant;\r\n\r\n\t\tif ( weightInterpolant !== null ) {\r\n\r\n\t\t\tthis._weightInterpolant = null;\r\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// Time Scale Control\r\n\r\n\t// set the weight stopping any scheduled warping\r\n\t// although .paused = true yields an effective time scale of zero, this\r\n\t// method does *not* change .paused, because it would be confusing\r\n\tsetEffectiveTimeScale: function( timeScale ) {\r\n\r\n\t\tthis.timeScale = timeScale;\r\n\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\r\n\r\n\t\treturn this.stopWarping();\r\n\r\n\t},\r\n\r\n\t// return the time scale considering warping and .paused\r\n\tgetEffectiveTimeScale: function() {\r\n\r\n\t\treturn this._effectiveTimeScale;\r\n\r\n\t},\r\n\r\n\tsetDuration: function( duration ) {\r\n\r\n\t\tthis.timeScale = this._clip.duration / duration;\r\n\r\n\t\treturn this.stopWarping();\r\n\r\n\t},\r\n\r\n\tsyncWith: function( action ) {\r\n\r\n\t\tthis.time = action.time;\r\n\t\tthis.timeScale = action.timeScale;\r\n\r\n\t\treturn this.stopWarping();\r\n\r\n\t},\r\n\r\n\thalt: function( duration ) {\r\n\r\n\t\treturn this.warp( this._currentTimeScale, 0, duration );\r\n\r\n\t},\r\n\r\n\twarp: function( startTimeScale, endTimeScale, duration ) {\r\n\r\n\t\tvar mixer = this._mixer, now = mixer.time,\r\n\t\t\tinterpolant = this._timeScaleInterpolant,\r\n\r\n\t\t\ttimeScale = this.timeScale;\r\n\r\n\t\tif ( interpolant === null ) {\r\n\r\n\t\t\tinterpolant = mixer._lendControlInterpolant(),\r\n\t\t\tthis._timeScaleInterpolant = interpolant;\r\n\r\n\t\t}\r\n\r\n\t\tvar times = interpolant.parameterPositions,\r\n\t\t\tvalues = interpolant.sampleValues;\r\n\r\n\t\ttimes[ 0 ] = now;\r\n\t\ttimes[ 1 ] = now + duration;\r\n\r\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\r\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tstopWarping: function() {\r\n\r\n\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\r\n\r\n\t\tif ( timeScaleInterpolant !== null ) {\r\n\r\n\t\t\tthis._timeScaleInterpolant = null;\r\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// Object Accessors\r\n\r\n\tgetMixer: function() {\r\n\r\n\t\treturn this._mixer;\r\n\r\n\t},\r\n\r\n\tgetClip: function() {\r\n\r\n\t\treturn this._clip;\r\n\r\n\t},\r\n\r\n\tgetRoot: function() {\r\n\r\n\t\treturn this._localRoot || this._mixer._root;\r\n\r\n\t},\r\n\r\n\t// Interna\r\n\r\n\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\r\n\t\t// called by the mixer\r\n\r\n\t\tvar startTime = this._startTime;\r\n\r\n\t\tif ( startTime !== null ) {\r\n\r\n\t\t\t// check for scheduled start of action\r\n\r\n\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\r\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\r\n\r\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// start\r\n\r\n\t\t\tthis._startTime = null; // unschedule\r\n\t\t\tdeltaTime = timeDirection * timeRunning;\r\n\r\n\t\t}\r\n\r\n\t\t// apply time scale and advance time\r\n\r\n\t\tdeltaTime *= this._updateTimeScale( time );\r\n\t\tvar clipTime = this._updateTime( deltaTime );\r\n\r\n\t\t// note: _updateTime may disable the action resulting in\r\n\t\t// an effective weight of 0\r\n\r\n\t\tvar weight = this._updateWeight( time );\r\n\r\n\t\tif ( weight > 0 ) {\r\n\r\n\t\t\tvar interpolants = this._interpolants;\r\n\t\t\tvar propertyMixers = this._propertyBindings;\r\n\r\n\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\r\n\r\n\t\t\t\tinterpolants[ j ].evaluate( clipTime );\r\n\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_updateWeight: function( time ) {\r\n\r\n\t\tvar weight = 0;\r\n\r\n\t\tif ( this.enabled ) {\r\n\r\n\t\t\tweight = this.weight;\r\n\t\t\tvar interpolant = this._weightInterpolant;\r\n\r\n\t\t\tif ( interpolant !== null ) {\r\n\r\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\r\n\r\n\t\t\t\tweight *= interpolantValue;\r\n\r\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\r\n\r\n\t\t\t\t\tthis.stopFading();\r\n\r\n\t\t\t\t\tif ( interpolantValue === 0 ) {\r\n\r\n\t\t\t\t\t\t// faded out, disable\r\n\t\t\t\t\t\tthis.enabled = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis._effectiveWeight = weight;\r\n\t\treturn weight;\r\n\r\n\t},\r\n\r\n\t_updateTimeScale: function( time ) {\r\n\r\n\t\tvar timeScale = 0;\r\n\r\n\t\tif ( ! this.paused ) {\r\n\r\n\t\t\ttimeScale = this.timeScale;\r\n\r\n\t\t\tvar interpolant = this._timeScaleInterpolant;\r\n\r\n\t\t\tif ( interpolant !== null ) {\r\n\r\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\r\n\r\n\t\t\t\ttimeScale *= interpolantValue;\r\n\r\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\r\n\r\n\t\t\t\t\tthis.stopWarping();\r\n\r\n\t\t\t\t\tif ( timeScale === 0 ) {\r\n\r\n\t\t\t\t\t\t// motion has halted, pause\r\n\t\t\t\t\t\tthis.pause = true;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// warp done - apply final time scale\r\n\t\t\t\t\t\tthis.timeScale = timeScale;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis._effectiveTimeScale = timeScale;\r\n\t\treturn timeScale;\r\n\r\n\t},\r\n\r\n\t_updateTime: function( deltaTime ) {\r\n\r\n\t\tvar time = this.time + deltaTime;\r\n\r\n\t\tif ( deltaTime === 0 ) return time;\r\n\r\n\t\tvar duration = this._clip.duration,\r\n\r\n\t\t\tloop = this.loop,\r\n\t\t\tloopCount = this._loopCount,\r\n\r\n\t\t\tpingPong = false;\r\n\r\n\t\tswitch ( loop ) {\r\n\r\n\t\t\tcase THREE.LoopOnce:\r\n\r\n\t\t\t\tif ( loopCount === -1 ) {\r\n\r\n\t\t\t\t\t// just started\r\n\r\n\t\t\t\t\tthis.loopCount = 0;\r\n\t\t\t\t\tthis._setEndings( true, true, false );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( time >= duration ) {\r\n\r\n\t\t\t\t\ttime = duration;\r\n\r\n\t\t\t\t} else if ( time < 0 ) {\r\n\r\n\t\t\t\t\ttime = 0;\r\n\r\n\t\t\t\t} else break;\r\n\r\n\t\t\t\t// reached the end\r\n\r\n\t\t\t\tif ( this.clampWhenFinished ) this.pause = true;\r\n\t\t\t\telse this.enabled = false;\r\n\r\n\t\t\t\tthis._mixer.dispatchEvent( {\r\n\t\t\t\t\ttype: 'finished', action: this,\r\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase THREE.LoopPingPong:\r\n\r\n\t\t\t\tpingPong = true;\r\n\r\n\t\t\tcase THREE.LoopRepeat:\r\n\r\n\t\t\t\tif ( loopCount === -1 ) {\r\n\r\n\t\t\t\t\t// just started\r\n\r\n\t\t\t\t\tif ( deltaTime > 0 ) {\r\n\r\n\t\t\t\t\t\tloopCount = 0;\r\n\r\n\t\t\t\t\t\tthis._setEndings(\r\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// when looping in reverse direction, the initial\r\n\t\t\t\t\t\t// transition through zero counts as a repetition,\r\n\t\t\t\t\t\t// so leave loopCount at -1\r\n\r\n\t\t\t\t\t\tthis._setEndings(\r\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( time >= duration || time < 0 ) {\r\n\r\n\t\t\t\t\t// wrap around\r\n\r\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\r\n\t\t\t\t\ttime -= duration * loopDelta;\r\n\r\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\r\n\r\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\r\n\r\n\t\t\t\t\tif ( pending < 0 ) {\r\n\r\n\t\t\t\t\t\t// stop (switch state, clamp time, fire event)\r\n\r\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\r\n\t\t\t\t\t\telse this.enabled = false;\r\n\r\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\r\n\r\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\r\n\t\t\t\t\t\t\ttype: 'finished', action: this,\r\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\r\n\t\t\t\t\t\t} );\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t} else if ( pending === 0 ) {\r\n\r\n\t\t\t\t\t\t// transition to last round\r\n\r\n\t\t\t\t\t\tvar atStart = deltaTime < 0;\r\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._loopCount = loopCount;\r\n\r\n\t\t\t\t\tthis._mixer.dispatchEvent( {\r\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\r\n\t\t\t\t\t} );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( loop === THREE.LoopPingPong && ( loopCount & 1 ) === 1 ) {\r\n\r\n\t\t\t\t\t// invert time for the \"pong round\"\r\n\r\n\t\t\t\t\tthis.time = time;\r\n\r\n\t\t\t\t\treturn duration - time;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t\tthis.time = time;\r\n\r\n\t\treturn time;\r\n\r\n\t},\r\n\r\n\t_setEndings: function( atStart, atEnd, pingPong ) {\r\n\r\n\t\tvar settings = this._interpolantSettings;\r\n\r\n\t\tif ( pingPong ) {\r\n\r\n\t\t\tsettings.endingStart \t= THREE.ZeroSlopeEnding;\r\n\t\t\tsettings.endingEnd\t\t= THREE.ZeroSlopeEnding;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\r\n\r\n\t\t\tif ( atStart ) {\r\n\r\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\r\n\t\t\t\t\t\tTHREE.ZeroSlopeEnding : THREE.ZeroCurvatureEnding;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tsettings.endingStart = THREE.WrapAroundEnding;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( atEnd ) {\r\n\r\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\r\n\t\t\t\t\t\tTHREE.ZeroSlopeEnding : THREE.ZeroCurvatureEnding;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tsettings.endingEnd \t = THREE.WrapAroundEnding;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_scheduleFading: function( duration, weightNow, weightThen ) {\r\n\r\n\t\tvar mixer = this._mixer, now = mixer.time,\r\n\t\t\tinterpolant = this._weightInterpolant;\r\n\r\n\t\tif ( interpolant === null ) {\r\n\r\n\t\t\tinterpolant = mixer._lendControlInterpolant(),\r\n\t\t\tthis._weightInterpolant = interpolant;\r\n\r\n\t\t}\r\n\r\n\t\tvar times = interpolant.parameterPositions,\r\n\t\t\tvalues = interpolant.sampleValues;\r\n\r\n\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\r\n\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Implementation details:\r\n\r\nObject.assign( THREE.AnimationMixer.prototype, {\r\n\r\n\t_bindAction: function( action, prototypeAction ) {\r\n\r\n\t\tvar root = action._localRoot || this._root,\r\n\t\t\ttracks = action._clip.tracks,\r\n\t\t\tnTracks = tracks.length,\r\n\t\t\tbindings = action._propertyBindings,\r\n\t\t\tinterpolants = action._interpolants,\r\n\t\t\trootUuid = root.uuid,\r\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\r\n\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\r\n\r\n\t\tif ( bindingsByName === undefined ) {\r\n\r\n\t\t\tbindingsByName = {};\r\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\r\n\r\n\t\t\tvar track = tracks[ i ],\r\n\t\t\t\ttrackName = track.name,\r\n\t\t\t\tbinding = bindingsByName[ trackName ];\r\n\r\n\t\t\tif ( binding !== undefined ) {\r\n\r\n\t\t\t\tbindings[ i ] = binding;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbinding = bindings[ i ];\r\n\r\n\t\t\t\tif ( binding !== undefined ) {\r\n\r\n\t\t\t\t\t// existing binding, make sure the cache knows\r\n\r\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\r\n\r\n\t\t\t\t\t\t++ binding.referenceCount;\r\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar path = prototypeAction && prototypeAction.\r\n\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\r\n\r\n\t\t\t\tbinding = new THREE.PropertyMixer(\r\n\t\t\t\t\t\tTHREE.PropertyBinding.create( root, trackName, path ),\r\n\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\r\n\r\n\t\t\t\t++ binding.referenceCount;\r\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\r\n\r\n\t\t\t\tbindings[ i ] = binding;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_activateAction: function( action ) {\r\n\r\n\t\tif ( ! this._isActiveAction( action ) ) {\r\n\r\n\t\t\tif ( action._cacheIndex === null ) {\r\n\r\n\t\t\t\t// this action has been forgotten by the cache, but the user\r\n\t\t\t\t// appears to be still using it -> rebind\r\n\r\n\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\r\n\t\t\t\t\tclipName = action._clip.name,\r\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipName ];\r\n\r\n\t\t\t\tthis._bindAction( action,\r\n\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\r\n\r\n\t\t\t\tthis._addInactiveAction( action, clipName, rootUuid );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar bindings = action._propertyBindings;\r\n\r\n\t\t\t// increment reference counts / sort out state\r\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar binding = bindings[ i ];\r\n\r\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\r\n\r\n\t\t\t\t\tthis._lendBinding( binding );\r\n\t\t\t\t\tbinding.saveOriginalState();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis._lendAction( action );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_deactivateAction: function( action ) {\r\n\r\n\t\tif ( this._isActiveAction( action ) ) {\r\n\r\n\t\t\tvar bindings = action._propertyBindings;\r\n\r\n\t\t\t// decrement reference counts / sort out state\r\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar binding = bindings[ i ];\r\n\r\n\t\t\t\tif ( -- binding.useCount === 0 ) {\r\n\r\n\t\t\t\t\tbinding.restoreOriginalState();\r\n\t\t\t\t\tthis._takeBackBinding( binding );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis._takeBackAction( action );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t// Memory manager\r\n\r\n\t_initMemoryManager: function() {\r\n\r\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\r\n\t\tthis._nActiveActions = 0;\r\n\r\n\t\tthis._actionsByClip = {};\r\n\t\t// inside:\r\n\t\t// {\r\n\t\t// \t\tknownActions: Array< _Action >\t- used as prototypes\r\n\t\t// \t\tactionByRoot: _Action\t\t\t- lookup\r\n\t\t// }\r\n\r\n\r\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\r\n\t\tthis._nActiveBindings = 0;\r\n\r\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\r\n\r\n\r\n\t\tthis._controlInterpolants = []; // same game as above\r\n\t\tthis._nActiveControlInterpolants = 0;\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tthis.stats = {\r\n\r\n\t\t\tactions: {\r\n\t\t\t\tget total() { return scope._actions.length; },\r\n\t\t\t\tget inUse() { return scope._nActiveActions; }\r\n\t\t\t},\r\n\t\t\tbindings: {\r\n\t\t\t\tget total() { return scope._bindings.length; },\r\n\t\t\t\tget inUse() { return scope._nActiveBindings; }\r\n\t\t\t},\r\n\t\t\tcontrolInterpolants: {\r\n\t\t\t\tget total() { return scope._controlInterpolants.length; },\r\n\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t// Memory management for _Action objects\r\n\r\n\t_isActiveAction: function( action ) {\r\n\r\n\t\tvar index = action._cacheIndex;\r\n\t\treturn index !== null && index < this._nActiveActions;\r\n\r\n\t},\r\n\r\n\t_addInactiveAction: function( action, clipName, rootUuid ) {\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tactionsByClip = this._actionsByClip,\r\n\t\t\tactionsForClip = actionsByClip[ clipName ];\r\n\r\n\t\tif ( actionsForClip === undefined ) {\r\n\r\n\t\t\tactionsForClip = {\r\n\r\n\t\t\t\tknownActions: [ action ],\r\n\t\t\t\tactionByRoot: {}\r\n\r\n\t\t\t};\r\n\r\n\t\t\taction._byClipCacheIndex = 0;\r\n\r\n\t\t\tactionsByClip[ clipName ] = actionsForClip;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar knownActions = actionsForClip.knownActions;\r\n\r\n\t\t\taction._byClipCacheIndex = knownActions.length;\r\n\t\t\tknownActions.push( action );\r\n\r\n\t\t}\r\n\r\n\t\taction._cacheIndex = actions.length;\r\n\t\tactions.push( action );\r\n\r\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\r\n\r\n\t},\r\n\r\n\t_removeInactiveAction: function( action ) {\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\r\n\t\t\tcacheIndex = action._cacheIndex;\r\n\r\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\r\n\t\tactions[ cacheIndex ] = lastInactiveAction;\r\n\t\tactions.pop();\r\n\r\n\t\taction._cacheIndex = null;\r\n\r\n\r\n\t\tvar clipName = action._clip.name,\r\n\t\t\tactionsByClip = this._actionsByClip,\r\n\t\t\tactionsForClip = actionsByClip[ clipName ],\r\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\r\n\r\n\t\t\tlastKnownAction =\r\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\r\n\r\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\r\n\r\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\r\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\r\n\t\tknownActionsForClip.pop();\r\n\r\n\t\taction._byClipCacheIndex = null;\r\n\r\n\r\n\t\tvar actionByRoot = actionsForClip.actionByRoot,\r\n\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\r\n\r\n\t\tdelete actionByRoot[ rootUuid ];\r\n\r\n\t\tif ( knownActionsForClip.length === 0 ) {\r\n\r\n\t\t\tdelete actionsByClip[ clipName ];\r\n\r\n\t\t}\r\n\r\n\t\tthis._removeInactiveBindingsForAction( action );\r\n\r\n\t},\r\n\r\n\t_removeInactiveBindingsForAction: function( action ) {\r\n\r\n\t\tvar bindings = action._propertyBindings;\r\n\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar binding = bindings[ i ];\r\n\r\n\t\t\tif ( -- binding.referenceCount === 0 ) {\r\n\r\n\t\t\t\tthis._removeInactiveBinding( binding );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_lendAction: function( action ) {\r\n\r\n\t\t// [ active actions | inactive actions ]\r\n\t\t// [ active actions >| inactive actions ]\r\n\t\t// s a\r\n\t\t// <-swap->\r\n\t\t// a s\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tprevIndex = action._cacheIndex,\r\n\r\n\t\t\tlastActiveIndex = this._nActiveActions ++,\r\n\r\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\r\n\r\n\t\taction._cacheIndex = lastActiveIndex;\r\n\t\tactions[ lastActiveIndex ] = action;\r\n\r\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\r\n\t\tactions[ prevIndex ] = firstInactiveAction;\r\n\r\n\t},\r\n\r\n\t_takeBackAction: function( action ) {\r\n\r\n\t\t// [ active actions | inactive actions ]\r\n\t\t// [ active actions |< inactive actions ]\r\n\t\t// a s\r\n\t\t// <-swap->\r\n\t\t// s a\r\n\r\n\t\tvar actions = this._actions,\r\n\t\t\tprevIndex = action._cacheIndex,\r\n\r\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\r\n\r\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\r\n\r\n\t\taction._cacheIndex = firstInactiveIndex;\r\n\t\tactions[ firstInactiveIndex ] = action;\r\n\r\n\t\tlastActiveAction._cacheIndex = prevIndex;\r\n\t\tactions[ prevIndex ] = lastActiveAction;\r\n\r\n\t},\r\n\r\n\t// Memory management for PropertyMixer objects\r\n\r\n\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\r\n\r\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\r\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\r\n\r\n\t\t\tbindings = this._bindings;\r\n\r\n\t\tif ( bindingByName === undefined ) {\r\n\r\n\t\t\tbindingByName = {};\r\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\r\n\r\n\t\t}\r\n\r\n\t\tbindingByName[ trackName ] = binding;\r\n\r\n\t\tbinding._cacheIndex = bindings.length;\r\n\t\tbindings.push( binding );\r\n\r\n\t},\r\n\r\n\t_removeInactiveBinding: function( binding ) {\r\n\r\n\t\tvar bindings = this._bindings,\r\n\t\t\tpropBinding = binding.binding,\r\n\t\t\trootUuid = propBinding.rootNode.uuid,\r\n\t\t\ttrackName = propBinding.path,\r\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\r\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\r\n\r\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\r\n\t\t\tcacheIndex = binding._cacheIndex;\r\n\r\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\r\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\r\n\t\tbindings.pop();\r\n\r\n\t\tdelete bindingByName[ trackName ];\r\n\r\n\t\tremove_empty_map: {\r\n\r\n\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\r\n\r\n\t\t\tdelete bindingsByRoot[ rootUuid ];\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_lendBinding: function( binding ) {\r\n\r\n\t\tvar bindings = this._bindings,\r\n\t\t\tprevIndex = binding._cacheIndex,\r\n\r\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\r\n\r\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\r\n\r\n\t\tbinding._cacheIndex = lastActiveIndex;\r\n\t\tbindings[ lastActiveIndex ] = binding;\r\n\r\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\r\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\r\n\r\n\t},\r\n\r\n\t_takeBackBinding: function( binding ) {\r\n\r\n\t\tvar bindings = this._bindings,\r\n\t\t\tprevIndex = binding._cacheIndex,\r\n\r\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\r\n\r\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\r\n\r\n\t\tbinding._cacheIndex = firstInactiveIndex;\r\n\t\tbindings[ firstInactiveIndex ] = binding;\r\n\r\n\t\tlastActiveBinding._cacheIndex = prevIndex;\r\n\t\tbindings[ prevIndex ] = lastActiveBinding;\r\n\r\n\t},\r\n\r\n\r\n\t// Memory management of Interpolants for weight and time scale\r\n\r\n\t_lendControlInterpolant: function() {\r\n\r\n\t\tvar interpolants = this._controlInterpolants,\r\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\r\n\t\t\tinterpolant = interpolants[ lastActiveIndex ];\r\n\r\n\t\tif ( interpolant === undefined ) {\r\n\r\n\t\t\tinterpolant = new THREE.LinearInterpolant(\r\n\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\r\n\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\r\n\r\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\r\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\r\n\r\n\t\t}\r\n\r\n\t\treturn interpolant;\r\n\r\n\t},\r\n\r\n\t_takeBackControlInterpolant: function( interpolant ) {\r\n\r\n\t\tvar interpolants = this._controlInterpolants,\r\n\t\t\tprevIndex = interpolant.__cacheIndex,\r\n\r\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\r\n\r\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\r\n\r\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\r\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\r\n\r\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\r\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\r\n\r\n\t},\r\n\r\n\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\r\n\r\n} );\r\n\r\n\r\n// File:src/animation/AnimationObjectGroup.js\r\n\r\n/**\r\n *\r\n * A group of objects that receives a shared animation state.\r\n *\r\n * Usage:\r\n *\r\n * \t-\tAdd objects you would otherwise pass as 'root' to the\r\n * \t\tconstructor or the .clipAction method of AnimationMixer.\r\n *\r\n * \t-\tInstead pass this object as 'root'.\r\n *\r\n * \t-\tYou can also add and remove objects later when the mixer\r\n * \t\tis running.\r\n *\r\n * Note:\r\n *\r\n * \tObjects of this class appear as one object to the mixer,\r\n * \tso cache control of the individual objects must be done\r\n * \ton the group.\r\n *\r\n * Limitation:\r\n *\r\n * \t- \tThe animated properties must be compatible among the\r\n * \t\tall objects in the group.\r\n *\r\n * -\tA single property can either be controlled through a\r\n * \ttarget group or directly, but not both.\r\n *\r\n * @author tschw\r\n */\r\n\r\nTHREE.AnimationObjectGroup = function( var_args ) {\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\t// cached objects followed by the active ones\r\n\tthis._objects = Array.prototype.slice.call( arguments );\r\n\r\n\tthis.nCachedObjects_ = 0;\t\t\t// threshold\r\n\t// note: read by PropertyBinding.Composite\r\n\r\n\tvar indices = {};\r\n\tthis._indicesByUUID = indices;\t\t// for bookkeeping\r\n\r\n\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\r\n\r\n\t\tindices[ arguments[ i ].uuid ] = i;\r\n\r\n\t}\r\n\r\n\tthis._paths = [];\t\t\t\t\t// inside: string\r\n\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\r\n\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\r\n\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\r\n\r\n\tvar scope = this;\r\n\r\n\tthis.stats = {\r\n\r\n\t\tobjects: {\r\n\t\t\tget total() { return scope._objects.length; },\r\n\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\r\n\t\t},\r\n\r\n\t\tget bindingsPerObject() { return scope._bindings.length; }\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.AnimationObjectGroup.prototype = {\r\n\r\n\tconstructor: THREE.AnimationObjectGroup,\r\n\r\n\tadd: function( var_args ) {\r\n\r\n\t\tvar objects = this._objects,\r\n\t\t\tnObjects = objects.length,\r\n\t\t\tnCachedObjects = this.nCachedObjects_,\r\n\t\t\tindicesByUUID = this._indicesByUUID,\r\n\t\t\tpaths = this._paths,\r\n\t\t\tparsedPaths = this._parsedPaths,\r\n\t\t\tbindings = this._bindings,\r\n\t\t\tnBindings = bindings.length;\r\n\r\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar object = arguments[ i ],\r\n\t\t\t\tuuid = object.uuid,\r\n\t\t\t\tindex = indicesByUUID[ uuid ];\r\n\r\n\t\t\tif ( index === undefined ) {\r\n\r\n\t\t\t\t// unknown object -> add it to the ACTIVE region\r\n\r\n\t\t\t\tindex = nObjects ++;\r\n\t\t\t\tindicesByUUID[ uuid ] = index;\r\n\t\t\t\tobjects.push( object );\r\n\r\n\t\t\t\t// accounting is done, now do the same for all bindings\r\n\r\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\r\n\r\n\t\t\t\t\tbindings[ j ].push(\r\n\t\t\t\t\t\t\tnew THREE.PropertyBinding(\r\n\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( index < nCachedObjects ) {\r\n\r\n\t\t\t\tvar knownObject = objects[ index ];\r\n\r\n\t\t\t\t// move existing object to the ACTIVE region\r\n\r\n\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\r\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\r\n\r\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\r\n\t\t\t\tobjects[ index ] = lastCachedObject;\r\n\r\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\r\n\t\t\t\tobjects[ firstActiveIndex ] = object;\r\n\r\n\t\t\t\t// accounting is done, now do the same for all bindings\r\n\r\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\r\n\r\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\r\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\r\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\r\n\r\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\r\n\r\n\t\t\t\t\tif ( binding === undefined ) {\r\n\r\n\t\t\t\t\t\t// since we do not bother to create new bindings\r\n\t\t\t\t\t\t// for objects that are cached, the binding may\r\n\t\t\t\t\t\t// or may not exist\r\n\r\n\t\t\t\t\t\tbinding = new THREE.PropertyBinding(\r\n\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( objects[ index ] !== knownObject) {\r\n\r\n\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\r\n\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\r\n\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\r\n\r\n\t\t\t} // else the object is already where we want it to be\r\n\r\n\t\t} // for arguments\r\n\r\n\t\tthis.nCachedObjects_ = nCachedObjects;\r\n\r\n\t},\r\n\r\n\tremove: function( var_args ) {\r\n\r\n\t\tvar objects = this._objects,\r\n\t\t\tnObjects = objects.length,\r\n\t\t\tnCachedObjects = this.nCachedObjects_,\r\n\t\t\tindicesByUUID = this._indicesByUUID,\r\n\t\t\tbindings = this._bindings,\r\n\t\t\tnBindings = bindings.length;\r\n\r\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar object = arguments[ i ],\r\n\t\t\t\tuuid = object.uuid,\r\n\t\t\t\tindex = indicesByUUID[ uuid ];\r\n\r\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\r\n\r\n\t\t\t\t// move existing object into the CACHED region\r\n\r\n\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\r\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\r\n\r\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\r\n\t\t\t\tobjects[ index ] = firstActiveObject;\r\n\r\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\r\n\t\t\t\tobjects[ lastCachedIndex ] = object;\r\n\r\n\t\t\t\t// accounting is done, now do the same for all bindings\r\n\r\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\r\n\r\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\r\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\r\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\r\n\r\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\r\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} // for arguments\r\n\r\n\t\tthis.nCachedObjects_ = nCachedObjects;\r\n\r\n\t},\r\n\r\n\t// remove & forget\r\n\tuncache: function( var_args ) {\r\n\r\n\t\tvar objects = this._objects,\r\n\t\t\tnObjects = objects.length,\r\n\t\t\tnCachedObjects = this.nCachedObjects_,\r\n\t\t\tindicesByUUID = this._indicesByUUID,\r\n\t\t\tbindings = this._bindings,\r\n\t\t\tnBindings = bindings.length;\r\n\r\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar object = arguments[ i ],\r\n\t\t\t\tuuid = object.uuid,\r\n\t\t\t\tindex = indicesByUUID[ uuid ];\r\n\r\n\t\t\tif ( index !== undefined ) {\r\n\r\n\t\t\t\tdelete indicesByUUID[ uuid ];\r\n\r\n\t\t\t\tif ( index < nCachedObjects ) {\r\n\r\n\t\t\t\t\t// object is cached, shrink the CACHED region\r\n\r\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\r\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\r\n\t\t\t\t\t\tlastIndex = -- nObjects,\r\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\r\n\r\n\t\t\t\t\t// last cached object takes this object's place\r\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\r\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\r\n\r\n\t\t\t\t\t// last object goes to the activated slot and pop\r\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\r\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\r\n\t\t\t\t\tobjects.pop();\r\n\r\n\t\t\t\t\t// accounting is done, now do the same for all bindings\r\n\r\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\r\n\r\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\r\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\r\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\r\n\r\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\r\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\r\n\t\t\t\t\t\tbindingsForPath.pop();\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// object is active, just swap with the last and pop\r\n\r\n\t\t\t\t\tvar lastIndex = -- nObjects,\r\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\r\n\r\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\r\n\t\t\t\t\tobjects[ index ] = lastObject;\r\n\t\t\t\t\tobjects.pop();\r\n\r\n\t\t\t\t\t// accounting is done, now do the same for all bindings\r\n\r\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\r\n\r\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\r\n\r\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\r\n\t\t\t\t\t\tbindingsForPath.pop();\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} // cached or active\r\n\r\n\t\t\t} // if object is known\r\n\r\n\t\t} // for arguments\r\n\r\n\t\tthis.nCachedObjects_ = nCachedObjects;\r\n\r\n\t},\r\n\r\n\t// Internal interface used by befriended PropertyBinding.Composite:\r\n\r\n\tsubscribe_: function( path, parsedPath ) {\r\n\t\t// returns an array of bindings for the given path that is changed\r\n\t\t// according to the contained objects in the group\r\n\r\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\r\n\t\t\tindex = indicesByPath[ path ],\r\n\t\t\tbindings = this._bindings;\r\n\r\n\t\tif ( index !== undefined ) return bindings[ index ];\r\n\r\n\t\tvar paths = this._paths,\r\n\t\t\tparsedPaths = this._parsedPaths,\r\n\t\t\tobjects = this._objects,\r\n\t\t\tnObjects = objects.length,\r\n\t\t\tnCachedObjects = this.nCachedObjects_,\r\n\t\t\tbindingsForPath = new Array( nObjects );\r\n\r\n\t\tindex = bindings.length;\r\n\r\n\t\tindicesByPath[ path ] = index;\r\n\r\n\t\tpaths.push( path );\r\n\t\tparsedPaths.push( parsedPath );\r\n\t\tbindings.push( bindingsForPath );\r\n\r\n\t\tfor ( var i = nCachedObjects,\r\n\t\t\t\tn = objects.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar object = objects[ i ];\r\n\r\n\t\t\tbindingsForPath[ i ] =\r\n\t\t\t\t\tnew THREE.PropertyBinding( object, path, parsedPath );\r\n\r\n\t\t}\r\n\r\n\t\treturn bindingsForPath;\r\n\r\n\t},\r\n\r\n\tunsubscribe_: function( path ) {\r\n\t\t// tells the group to forget about a property path and no longer\r\n\t\t// update the array previously obtained with 'subscribe_'\r\n\r\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\r\n\t\t\tindex = indicesByPath[ path ];\r\n\r\n\t\tif ( index !== undefined ) {\r\n\r\n\t\t\tvar paths = this._paths,\r\n\t\t\t\tparsedPaths = this._parsedPaths,\r\n\t\t\t\tbindings = this._bindings,\r\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\r\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\r\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\r\n\r\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\r\n\r\n\t\t\tbindings[ index ] = lastBindings;\r\n\t\t\tbindings.pop();\r\n\r\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\r\n\t\t\tparsedPaths.pop();\r\n\r\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\r\n\t\t\tpaths.pop();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n// File:src/animation/AnimationUtils.js\r\n\r\n/**\r\n * @author tschw\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n */\r\n\r\nTHREE.AnimationUtils = {\r\n\r\n\t// same as Array.prototype.slice, but also works on typed arrays\r\n\tarraySlice: function( array, from, to ) {\r\n\r\n\t\tif ( THREE.AnimationUtils.isTypedArray( array ) ) {\r\n\r\n\t\t\treturn new array.constructor( array.subarray( from, to ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn array.slice( from, to );\r\n\r\n\t},\r\n\r\n\t// converts an array to a specific type\r\n\tconvertArray: function( array, type, forceClone ) {\r\n\r\n\t\tif ( ! array || // let 'undefined' and 'null' pass\r\n\t\t\t\t! forceClone && array.constructor === type ) return array;\r\n\r\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\r\n\r\n\t\t\treturn new type( array ); // create typed array\r\n\r\n\t\t}\r\n\r\n\t\treturn Array.prototype.slice.call( array ); // create Array\r\n\r\n\t},\r\n\r\n\tisTypedArray: function( object ) {\r\n\r\n\t\treturn ArrayBuffer.isView( object ) &&\r\n\t\t\t\t! ( object instanceof DataView );\r\n\r\n\t},\r\n\r\n\t// returns an array by which times and values can be sorted\r\n\tgetKeyframeOrder: function( times ) {\r\n\r\n\t\tfunction compareTime( i, j ) {\r\n\r\n\t\t\treturn times[ i ] - times[ j ];\r\n\r\n\t\t}\r\n\r\n\t\tvar n = times.length;\r\n\t\tvar result = new Array( n );\r\n\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\r\n\r\n\t\tresult.sort( compareTime );\r\n\r\n\t\treturn result;\r\n\r\n\t},\r\n\r\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\r\n\tsortedArray: function( values, stride, order ) {\r\n\r\n\t\tvar nValues = values.length;\r\n\t\tvar result = new values.constructor( nValues );\r\n\r\n\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\r\n\r\n\t\t\tvar srcOffset = order[ i ] * stride;\r\n\r\n\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\r\n\r\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t},\r\n\r\n\t// function for parsing AOS keyframe formats\r\n\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\r\n\r\n\t\tvar i = 1, key = jsonKeys[ 0 ];\r\n\r\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\r\n\r\n\t\t\tkey = jsonKeys[ i ++ ];\r\n\r\n\t\t}\r\n\r\n\t\tif ( key === undefined ) return; // no data\r\n\r\n\t\tvar value = key[ valuePropertyName ];\r\n\t\tif ( value === undefined ) return; // no data\r\n\r\n\t\tif ( Array.isArray( value ) ) {\r\n\r\n\t\t\tdo {\r\n\r\n\t\t\t\tvalue = key[ valuePropertyName ];\r\n\r\n\t\t\t\tif ( value !== undefined ) {\r\n\r\n\t\t\t\t\ttimes.push( key.time );\r\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tkey = jsonKeys[ i ++ ];\r\n\r\n\t\t\t} while ( key !== undefined );\r\n\r\n\t\t} else if ( value.toArray !== undefined ) {\r\n\t\t\t// ...assume THREE.Math-ish\r\n\r\n\t\t\tdo {\r\n\r\n\t\t\t\tvalue = key[ valuePropertyName ];\r\n\r\n\t\t\t\tif ( value !== undefined ) {\r\n\r\n\t\t\t\t\ttimes.push( key.time );\r\n\t\t\t\t\tvalue.toArray( values, values.length );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tkey = jsonKeys[ i ++ ];\r\n\r\n\t\t\t} while ( key !== undefined );\r\n\r\n\t\t} else {\r\n\t\t\t// otherwise push as-is\r\n\r\n\t\t\tdo {\r\n\r\n\t\t\t\tvalue = key[ valuePropertyName ];\r\n\r\n\t\t\t\tif ( value !== undefined ) {\r\n\r\n\t\t\t\t\ttimes.push( key.time );\r\n\t\t\t\t\tvalues.push( value );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tkey = jsonKeys[ i ++ ];\r\n\r\n\t\t\t} while ( key !== undefined );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/animation/KeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A timed sequence of keyframes for a specific property.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.KeyframeTrack = function ( name, times, values, interpolation ) {\r\n\r\n\tif( name === undefined ) throw new Error( \"track name is undefined\" );\r\n\r\n\tif( times === undefined || times.length === 0 ) {\r\n\r\n\t\tthrow new Error( \"no keyframes in track named \" + name );\r\n\r\n\t}\r\n\r\n\tthis.name = name;\r\n\r\n\tthis.times = THREE.AnimationUtils.convertArray( times, this.TimeBufferType );\r\n\tthis.values = THREE.AnimationUtils.convertArray( values, this.ValueBufferType );\r\n\r\n\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\r\n\r\n\tthis.validate();\r\n\tthis.optimize();\r\n\r\n};\r\n\r\nTHREE.KeyframeTrack.prototype = {\r\n\r\n\tconstructor: THREE.KeyframeTrack,\r\n\r\n\tTimeBufferType: Float32Array,\r\n\tValueBufferType: Float32Array,\r\n\r\n\tDefaultInterpolation: THREE.InterpolateLinear,\r\n\r\n\tInterpolantFactoryMethodDiscrete: function( result ) {\r\n\r\n\t\treturn new THREE.DiscreteInterpolant(\r\n\t\t\t\tthis.times, this.values, this.getValueSize(), result );\r\n\r\n\t},\r\n\r\n\tInterpolantFactoryMethodLinear: function( result ) {\r\n\r\n\t\treturn new THREE.LinearInterpolant(\r\n\t\t\t\tthis.times, this.values, this.getValueSize(), result );\r\n\r\n\t},\r\n\r\n\tInterpolantFactoryMethodSmooth: function( result ) {\r\n\r\n\t\treturn new THREE.CubicInterpolant(\r\n\t\t\t\tthis.times, this.values, this.getValueSize(), result );\r\n\r\n\t},\r\n\r\n\tsetInterpolation: function( interpolation ) {\r\n\r\n\t\tvar factoryMethod = undefined;\r\n\r\n\t\tswitch ( interpolation ) {\r\n\r\n\t\t\tcase THREE.InterpolateDiscrete:\r\n\r\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase THREE.InterpolateLinear:\r\n\r\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase THREE.InterpolateSmooth:\r\n\r\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t\tif ( factoryMethod === undefined ) {\r\n\r\n\t\t\tvar message = \"unsupported interpolation for \" +\r\n\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\r\n\r\n\t\t\tif ( this.createInterpolant === undefined ) {\r\n\r\n\t\t\t\t// fall back to default, unless the default itself is messed up\r\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\r\n\r\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconsole.warn( message );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tthis.createInterpolant = factoryMethod;\r\n\r\n\t},\r\n\r\n\tgetInterpolation: function() {\r\n\r\n\t\tswitch ( this.createInterpolant ) {\r\n\r\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\r\n\r\n\t\t\t\treturn THREE.InterpolateDiscrete;\r\n\r\n\t\t\tcase this.InterpolantFactoryMethodLinear:\r\n\r\n\t\t\t\treturn THREE.InterpolateLinear;\r\n\r\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\r\n\r\n\t\t\t\treturn THREE.InterpolateSmooth;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetValueSize: function() {\r\n\r\n\t\treturn this.values.length / this.times.length;\r\n\r\n\t},\r\n\r\n\t// move all keyframes either forwards or backwards in time\r\n\tshift: function( timeOffset ) {\r\n\r\n\t\tif( timeOffset !== 0.0 ) {\r\n\r\n\t\t\tvar times = this.times;\r\n\r\n\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\ttimes[ i ] += timeOffset;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\r\n\tscale: function( timeScale ) {\r\n\r\n\t\tif( timeScale !== 1.0 ) {\r\n\r\n\t\t\tvar times = this.times;\r\n\r\n\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\ttimes[ i ] *= timeScale;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\r\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\r\n\ttrim: function( startTime, endTime ) {\r\n\r\n\t\tvar times = this.times,\r\n\t\t\tnKeys = times.length,\r\n\t\t\tfrom = 0,\r\n\t\t\tto = nKeys - 1;\r\n\r\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\r\n\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\r\n\r\n\t\t++ to; // inclusive -> exclusive bound\r\n\r\n\t\tif( from !== 0 || to !== nKeys ) {\r\n\r\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\r\n\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\r\n\r\n\t\t\tvar stride = this.getValueSize();\r\n\t\t\tthis.times = THREE.AnimationUtils.arraySlice( times, from, to );\r\n\t\t\tthis.values = THREE.AnimationUtils.\r\n\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\r\n\tvalidate: function() {\r\n\r\n\t\tvar valid = true;\r\n\r\n\t\tvar valueSize = this.getValueSize();\r\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\r\n\r\n\t\t\tconsole.error( \"invalid value size in track\", this );\r\n\t\t\tvalid = false;\r\n\r\n\t\t}\r\n\r\n\t\tvar times = this.times,\r\n\t\t\tvalues = this.values,\r\n\r\n\t\t\tnKeys = times.length;\r\n\r\n\t\tif( nKeys === 0 ) {\r\n\r\n\t\t\tconsole.error( \"track is empty\", this );\r\n\t\t\tvalid = false;\r\n\r\n\t\t}\r\n\r\n\t\tvar prevTime = null;\r\n\r\n\t\tfor( var i = 0; i !== nKeys; i ++ ) {\r\n\r\n\t\t\tvar currTime = times[ i ];\r\n\r\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\r\n\r\n\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\r\n\t\t\t\tvalid = false;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif( prevTime !== null && prevTime > currTime ) {\r\n\r\n\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\r\n\t\t\t\tvalid = false;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tprevTime = currTime;\r\n\r\n\t\t}\r\n\r\n\t\tif ( values !== undefined ) {\r\n\r\n\t\t\tif ( THREE.AnimationUtils.isTypedArray( values ) ) {\r\n\r\n\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\t\tvar value = values[ i ];\r\n\r\n\t\t\t\t\tif ( isNaN( value ) ) {\r\n\r\n\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\r\n\t\t\t\t\t\tvalid = false;\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn valid;\r\n\r\n\t},\r\n\r\n\t// removes equivalent sequential keys as common in morph target sequences\r\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\r\n\toptimize: function() {\r\n\r\n\t\tvar times = this.times,\r\n\t\t\tvalues = this.values,\r\n\t\t\tstride = this.getValueSize(),\r\n\r\n\t\t\twriteIndex = 1;\r\n\r\n\t\tfor( var i = 1, n = times.length - 1; i <= n; ++ i ) {\r\n\r\n\t\t\tvar keep = false;\r\n\r\n\t\t\tvar time = times[ i ];\r\n\t\t\tvar timeNext = times[ i + 1 ];\r\n\r\n\t\t\t// remove adjacent keyframes scheduled at the same time\r\n\r\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\r\n\r\n\t\t\t\t// remove unnecessary keyframes same as their neighbors\r\n\t\t\t\tvar offset = i * stride,\r\n\t\t\t\t\toffsetP = offset - stride,\r\n\t\t\t\t\toffsetN = offset + stride;\r\n\r\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\r\n\r\n\t\t\t\t\tvar value = values[ offset + j ];\r\n\r\n\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\r\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\r\n\r\n\t\t\t\t\t\tkeep = true;\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// in-place compaction\r\n\r\n\t\t\tif ( keep ) {\r\n\r\n\t\t\t\tif ( i !== writeIndex ) {\r\n\r\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\r\n\r\n\t\t\t\t\tvar readOffset = i * stride,\r\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\r\n\r\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\r\n\r\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t++ writeIndex;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( writeIndex !== times.length ) {\r\n\r\n\t\t\tthis.times = THREE.AnimationUtils.arraySlice( times, 0, writeIndex );\r\n\t\t\tthis.values = THREE.AnimationUtils.arraySlice( values, 0, writeIndex * stride );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Static methods:\r\n\r\nObject.assign( THREE.KeyframeTrack, {\r\n\r\n\t// Serialization (in static context, because of constructor invocation\r\n\t// and automatic invocation of .toJSON):\r\n\r\n\tparse: function( json ) {\r\n\r\n\t\tif( json.type === undefined ) {\r\n\r\n\t\t\tthrow new Error( \"track type undefined, can not parse\" );\r\n\r\n\t\t}\r\n\r\n\t\tvar trackType = THREE.KeyframeTrack._getTrackTypeForValueTypeName( json.type );\r\n\r\n\t\tif ( json.times === undefined ) {\r\n\r\n\t\t\tconsole.warn( \"legacy JSON format detected, converting\" );\r\n\r\n\t\t\tvar times = [], values = [];\r\n\r\n\t\t\tTHREE.AnimationUtils.flattenJSON( json.keys, times, values, 'value' );\r\n\r\n\t\t\tjson.times = times;\r\n\t\t\tjson.values = values;\r\n\r\n\t\t}\r\n\r\n\t\t// derived classes can define a static parse method\r\n\t\tif ( trackType.parse !== undefined ) {\r\n\r\n\t\t\treturn trackType.parse( json );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// by default, we asssume a constructor compatible with the base\r\n\t\t\treturn new trackType(\r\n\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttoJSON: function( track ) {\r\n\r\n\t\tvar trackType = track.constructor;\r\n\r\n\t\tvar json;\r\n\r\n\t\t// derived classes can define a static toJSON method\r\n\t\tif ( trackType.toJSON !== undefined ) {\r\n\r\n\t\t\tjson = trackType.toJSON( track );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// by default, we assume the data can be serialized as-is\r\n\t\t\tjson = {\r\n\r\n\t\t\t\t'name': track.name,\r\n\t\t\t\t'times': THREE.AnimationUtils.convertArray( track.times, Array ),\r\n\t\t\t\t'values': THREE.AnimationUtils.convertArray( track.values, Array )\r\n\r\n\t\t\t};\r\n\r\n\t\t\tvar interpolation = track.getInterpolation();\r\n\r\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\r\n\r\n\t\t\t\tjson.interpolation = interpolation;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tjson.type = track.ValueTypeName; // mandatory\r\n\r\n\t\treturn json;\r\n\r\n\t},\r\n\r\n\t_getTrackTypeForValueTypeName: function( typeName ) {\r\n\r\n\t\tswitch( typeName.toLowerCase() ) {\r\n\r\n\t\t\tcase \"scalar\":\r\n\t\t\tcase \"double\":\r\n\t\t\tcase \"float\":\r\n\t\t\tcase \"number\":\r\n\t\t\tcase \"integer\":\r\n\r\n\t\t\t\treturn THREE.NumberKeyframeTrack;\r\n\r\n\t\t\tcase \"vector\":\r\n\t\t\tcase \"vector2\":\r\n\t\t\tcase \"vector3\":\r\n\t\t\tcase \"vector4\":\r\n\r\n\t\t\t\treturn THREE.VectorKeyframeTrack;\r\n\r\n\t\t\tcase \"color\":\r\n\r\n\t\t\t\treturn THREE.ColorKeyframeTrack;\r\n\r\n\t\t\tcase \"quaternion\":\r\n\r\n\t\t\t\treturn THREE.QuaternionKeyframeTrack;\r\n\r\n\t\t\tcase \"bool\":\r\n\t\t\tcase \"boolean\":\r\n\r\n\t\t\t\treturn THREE.BooleanKeyframeTrack;\r\n\r\n\t\t\tcase \"string\":\r\n\r\n\t\t\t\treturn THREE.StringKeyframeTrack;\r\n\r\n\t\t};\r\n\r\n\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/animation/PropertyBinding.js\r\n\r\n/**\r\n *\r\n * A reference to a real property in the scene graph.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.PropertyBinding = function ( rootNode, path, parsedPath ) {\r\n\r\n\tthis.path = path;\r\n\tthis.parsedPath = parsedPath ||\r\n\t\t\tTHREE.PropertyBinding.parseTrackName( path );\r\n\r\n\tthis.node = THREE.PropertyBinding.findNode(\r\n\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\r\n\r\n\tthis.rootNode = rootNode;\r\n\r\n};\r\n\r\nTHREE.PropertyBinding.prototype = {\r\n\r\n\tconstructor: THREE.PropertyBinding,\r\n\r\n\tgetValue: function getValue_unbound( targetArray, offset ) {\r\n\r\n\t\tthis.bind();\r\n\t\tthis.getValue( targetArray, offset );\r\n\r\n\t\t// Note: This class uses a State pattern on a per-method basis:\r\n\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\r\n\t\t// prototype version of these methods with one that represents\r\n\t\t// the bound state. When the property is not found, the methods\r\n\t\t// become no-ops.\r\n\r\n\t},\r\n\r\n\tsetValue: function getValue_unbound( sourceArray, offset ) {\r\n\r\n\t\tthis.bind();\r\n\t\tthis.setValue( sourceArray, offset );\r\n\r\n\t},\r\n\r\n\t// create getter / setter pair for a property in the scene graph\r\n\tbind: function() {\r\n\r\n\t\tvar targetObject = this.node,\r\n\t\t\tparsedPath = this.parsedPath,\r\n\r\n\t\t\tobjectName = parsedPath.objectName,\r\n\t\t\tpropertyName = parsedPath.propertyName,\r\n\t\t\tpropertyIndex = parsedPath.propertyIndex;\r\n\r\n\t\tif ( ! targetObject ) {\r\n\r\n\t\t\ttargetObject = THREE.PropertyBinding.findNode(\r\n\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\r\n\r\n\t\t\tthis.node = targetObject;\r\n\r\n\t\t}\r\n\r\n\t\t// set fail state so we can just 'return' on error\r\n\t\tthis.getValue = this._getValue_unavailable;\r\n\t\tthis.setValue = this._setValue_unavailable;\r\n\r\n \t\t// ensure there is a value node\r\n\t\tif ( ! targetObject ) {\r\n\r\n\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tif( objectName ) {\r\n\r\n\t\t\tvar objectIndex = parsedPath.objectIndex;\r\n\r\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\r\n\t\t\tswitch ( objectName ) {\r\n\r\n\t\t\t\tcase 'materials':\r\n\r\n\t\t\t\t\tif( ! targetObject.material ) {\r\n\r\n\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif( ! targetObject.material.materials ) {\r\n\r\n\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttargetObject = targetObject.material.materials;\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'bones':\r\n\r\n\t\t\t\t\tif( ! targetObject.skeleton ) {\r\n\r\n\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\r\n\t\t\t\t\t// and convert the integer string to a true integer.\r\n\r\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\r\n\r\n\t\t\t\t\t// support resolving morphTarget names into indices.\r\n\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\r\n\r\n\t\t\t\t\t\tif ( targetObject[i].name === objectIndex ) {\r\n\r\n\t\t\t\t\t\t\tobjectIndex = i;\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\r\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\r\n\r\n\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif ( objectIndex !== undefined ) {\r\n\r\n\t\t\t\tif( targetObject[ objectIndex ] === undefined ) {\r\n\r\n\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// resolve property\r\n\t\tvar nodeProperty = targetObject[ propertyName ];\r\n\r\n\t\tif ( ! nodeProperty ) {\r\n\r\n\t\t\tvar nodeName = parsedPath.nodeName;\r\n\r\n\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\r\n\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\t// determine versioning scheme\r\n\t\tvar versioning = this.Versioning.None;\r\n\r\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\r\n\r\n\t\t\tversioning = this.Versioning.NeedsUpdate;\r\n\t\t\tthis.targetObject = targetObject;\r\n\r\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\r\n\r\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\r\n\t\t\tthis.targetObject = targetObject;\r\n\r\n\t\t}\r\n\r\n\t\t// determine how the property gets bound\r\n\t\tvar bindingType = this.BindingType.Direct;\r\n\r\n\t\tif ( propertyIndex !== undefined ) {\r\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\r\n\r\n\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\r\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\r\n\r\n\t\t\t\t// support resolving morphTarget names into indices.\r\n\t\t\t\tif ( ! targetObject.geometry ) {\r\n\r\n\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\r\n\r\n\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\r\n\r\n\t\t\t\t\tif ( targetObject.geometry.morphTargets[i].name === propertyIndex ) {\r\n\r\n\t\t\t\t\t\tpropertyIndex = i;\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbindingType = this.BindingType.ArrayElement;\r\n\r\n\t\t\tthis.resolvedProperty = nodeProperty;\r\n\t\t\tthis.propertyIndex = propertyIndex;\r\n\r\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\r\n\t\t\t// must use copy for Object3D.Euler/Quaternion\r\n\r\n\t\t\tbindingType = this.BindingType.HasFromToArray;\r\n\r\n\t\t\tthis.resolvedProperty = nodeProperty;\r\n\r\n\t\t} else if ( nodeProperty.length !== undefined ) {\r\n\r\n\t\t\tbindingType = this.BindingType.EntireArray;\r\n\r\n\t\t\tthis.resolvedProperty = nodeProperty;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.propertyName = propertyName;\r\n\r\n\t\t}\r\n\r\n\t\t// select getter / setter\r\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\r\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\r\n\r\n\t},\r\n\r\n\tunbind: function() {\r\n\r\n\t\tthis.node = null;\r\n\r\n\t\t// back to the prototype version of getValue / setValue\r\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\r\n\t\tthis.getValue = this._getValue_unbound;\r\n\t\tthis.setValue = this._setValue_unbound;\r\n\r\n\t}\r\n\r\n};\r\n\r\nObject.assign( THREE.PropertyBinding.prototype, { // prototype, continued\r\n\r\n\t// these are used to \"bind\" a nonexistent property\r\n\t_getValue_unavailable: function() {},\r\n\t_setValue_unavailable: function() {},\r\n\r\n\t// initial state of these methods that calls 'bind'\r\n\t_getValue_unbound: THREE.PropertyBinding.prototype.getValue,\r\n\t_setValue_unbound: THREE.PropertyBinding.prototype.setValue,\r\n\r\n\tBindingType: {\r\n\t\tDirect: 0,\r\n\t\tEntireArray: 1,\r\n\t\tArrayElement: 2,\r\n\t\tHasFromToArray: 3\r\n\t},\r\n\r\n\tVersioning: {\r\n\t\tNone: 0,\r\n\t\tNeedsUpdate: 1,\r\n\t\tMatrixWorldNeedsUpdate: 2\r\n\t},\r\n\r\n\tGetterByBindingType: [\r\n\r\n\t\tfunction getValue_direct( buffer, offset ) {\r\n\r\n\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\r\n\r\n\t\t},\r\n\r\n\t\tfunction getValue_array( buffer, offset ) {\r\n\r\n\t\t\tvar source = this.resolvedProperty;\r\n\r\n\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\tbuffer[ offset ++ ] = source[ i ];\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tfunction getValue_arrayElement( buffer, offset ) {\r\n\r\n\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\r\n\r\n\t\t},\r\n\r\n\t\tfunction getValue_toArray( buffer, offset ) {\r\n\r\n\t\t\tthis.resolvedProperty.toArray( buffer, offset );\r\n\r\n\t\t}\r\n\r\n\t],\r\n\r\n\tSetterByBindingTypeAndVersioning: [\r\n\r\n\t\t[\r\n\t\t\t// Direct\r\n\r\n\t\t\tfunction setValue_direct( buffer, offset ) {\r\n\r\n\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\r\n\t\t\t\tthis.targetObject.needsUpdate = true;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\r\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t], [\r\n\r\n\t\t\t// EntireArray\r\n\r\n\t\t\tfunction setValue_array( buffer, offset ) {\r\n\r\n\t\t\t\tvar dest = this.resolvedProperty;\r\n\r\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tvar dest = this.resolvedProperty;\r\n\r\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.targetObject.needsUpdate = true;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tvar dest = this.resolvedProperty;\r\n\r\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t], [\r\n\r\n\t\t\t// ArrayElement\r\n\r\n\t\t\tfunction setValue_arrayElement( buffer, offset ) {\r\n\r\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\r\n\t\t\t\tthis.targetObject.needsUpdate = true;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\r\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t], [\r\n\r\n\t\t\t// HasToFromArray\r\n\r\n\t\t\tfunction setValue_fromArray( buffer, offset ) {\r\n\r\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\r\n\t\t\t\tthis.targetObject.needsUpdate = true;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\r\n\r\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\r\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t]\r\n\r\n\t]\r\n\r\n} );\r\n\r\nTHREE.PropertyBinding.Composite =\r\n\t\tfunction( targetGroup, path, optionalParsedPath ) {\r\n\r\n\tvar parsedPath = optionalParsedPath ||\r\n\t\t\tTHREE.PropertyBinding.parseTrackName( path );\r\n\r\n\tthis._targetGroup = targetGroup;\r\n\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\r\n\r\n};\r\n\r\nTHREE.PropertyBinding.Composite.prototype = {\r\n\r\n\tconstructor: THREE.PropertyBinding.Composite,\r\n\r\n\tgetValue: function( array, offset ) {\r\n\r\n\t\tthis.bind(); // bind all binding\r\n\r\n\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\r\n\t\t\tbinding = this._bindings[ firstValidIndex ];\r\n\r\n\t\t// and only call .getValue on the first\r\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\r\n\r\n\t},\r\n\r\n\tsetValue: function( array, offset ) {\r\n\r\n\t\tvar bindings = this._bindings;\r\n\r\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\r\n\t\t\t\tn = bindings.length; i !== n; ++ i ) {\r\n\r\n\t\t\tbindings[ i ].setValue( array, offset );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tbind: function() {\r\n\r\n\t\tvar bindings = this._bindings;\r\n\r\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\r\n\t\t\t\tn = bindings.length; i !== n; ++ i ) {\r\n\r\n\t\t\tbindings[ i ].bind();\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tunbind: function() {\r\n\r\n\t\tvar bindings = this._bindings;\r\n\r\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\r\n\t\t\t\tn = bindings.length; i !== n; ++ i ) {\r\n\r\n\t\t\tbindings[ i ].unbind();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.PropertyBinding.create = function( root, path, parsedPath ) {\r\n\r\n\tif ( ! ( root instanceof THREE.AnimationObjectGroup ) ) {\r\n\r\n\t\treturn new THREE.PropertyBinding( root, path, parsedPath );\r\n\r\n\t} else {\r\n\r\n\t\treturn new THREE.PropertyBinding.Composite( root, path, parsedPath );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.PropertyBinding.parseTrackName = function( trackName ) {\r\n\r\n\t// matches strings in the form of:\r\n\t// nodeName.property\r\n\t// nodeName.property[accessor]\r\n\t// nodeName.material.property[accessor]\r\n\t// uuid.property[accessor]\r\n\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\r\n\t// parentName/nodeName.property\r\n\t// parentName/parentName/nodeName.property[index]\r\n\t//\t .bone[Armature.DEF_cog].position\r\n\t// created and tested via https://regex101.com/#javascript\r\n\r\n\tvar re = /^(([\\w]+\\/)*)([\\w-\\d]+)?(\\.([\\w]+)(\\[([\\w\\d\\[\\]\\_.:\\- ]+)\\])?)?(\\.([\\w.]+)(\\[([\\w\\d\\[\\]\\_. ]+)\\])?)$/;\r\n\tvar matches = re.exec(trackName);\r\n\r\n\tif( ! matches ) {\r\n\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\r\n\t}\r\n\r\n if (matches.index === re.lastIndex) {\r\n re.lastIndex++;\r\n }\r\n\r\n\tvar results = {\r\n\t\t// directoryName: matches[1], // (tschw) currently unused\r\n\t\tnodeName: matches[3], \t// allowed to be null, specified root node.\r\n\t\tobjectName: matches[5],\r\n\t\tobjectIndex: matches[7],\r\n\t\tpropertyName: matches[9],\r\n\t\tpropertyIndex: matches[11]\t// allowed to be null, specifies that the whole property is set.\r\n\t};\r\n\r\n\tif( results.propertyName === null || results.propertyName.length === 0 ) {\r\n\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\r\n\t}\r\n\r\n\treturn results;\r\n\r\n};\r\n\r\nTHREE.PropertyBinding.findNode = function( root, nodeName ) {\r\n\r\n\tif( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\r\n\r\n\t\treturn root;\r\n\r\n\t}\r\n\r\n\t// search into skeleton bones.\r\n\tif( root.skeleton ) {\r\n\r\n\t\tvar searchSkeleton = function( skeleton ) {\r\n\r\n\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\r\n\r\n\t\t\t\tvar bone = skeleton.bones[i];\r\n\r\n\t\t\t\tif( bone.name === nodeName ) {\r\n\r\n\t\t\t\t\treturn bone;\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\r\n\t\t};\r\n\r\n\t\tvar bone = searchSkeleton( root.skeleton );\r\n\r\n\t\tif( bone ) {\r\n\r\n\t\t\treturn bone;\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t// search into node subtree.\r\n\tif( root.children ) {\r\n\r\n\t\tvar searchNodeSubtree = function( children ) {\r\n\r\n\t\t\tfor( var i = 0; i < children.length; i ++ ) {\r\n\r\n\t\t\t\tvar childNode = children[i];\r\n\r\n\t\t\t\tif( childNode.name === nodeName || childNode.uuid === nodeName ) {\r\n\r\n\t\t\t\t\treturn childNode;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar result = searchNodeSubtree( childNode.children );\r\n\r\n\t\t\t\tif( result ) return result;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\r\n\t\t};\r\n\r\n\t\tvar subTreeNode = searchNodeSubtree( root.children );\r\n\r\n\t\tif( subTreeNode ) {\r\n\r\n\t\t\treturn subTreeNode;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn null;\r\n\r\n}\r\n\r\n// File:src/animation/PropertyMixer.js\r\n\r\n/**\r\n *\r\n * Buffered scene graph property that allows weighted accumulation.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.PropertyMixer = function ( binding, typeName, valueSize ) {\r\n\r\n\tthis.binding = binding;\r\n\tthis.valueSize = valueSize;\r\n\r\n\tvar bufferType = Float64Array,\r\n\t\tmixFunction;\r\n\r\n\tswitch ( typeName ) {\r\n\r\n\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\r\n\r\n\t\tcase 'string':\r\n\t\tcase 'bool':\r\n\r\n\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\r\n\r\n\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\r\n\r\n\t}\r\n\r\n\tthis.buffer = new bufferType( valueSize * 4 );\r\n\t// layout: [ incoming | accu0 | accu1 | orig ]\r\n\t//\r\n\t// interpolators can use .buffer as their .result\r\n\t// the data then goes to 'incoming'\r\n\t//\r\n\t// 'accu0' and 'accu1' are used frame-interleaved for\r\n\t// the cumulative result and are compared to detect\r\n\t// changes\r\n\t//\r\n\t// 'orig' stores the original state of the property\r\n\r\n\tthis._mixBufferRegion = mixFunction;\r\n\r\n\tthis.cumulativeWeight = 0;\r\n\r\n\tthis.useCount = 0;\r\n\tthis.referenceCount = 0;\r\n\r\n};\r\n\r\nTHREE.PropertyMixer.prototype = {\r\n\r\n\tconstructor: THREE.PropertyMixer,\r\n\r\n\t// accumulate data in the 'incoming' region into 'accu'\r\n\taccumulate: function( accuIndex, weight ) {\r\n\r\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\r\n\t\t// the weight and shouldn't have made the call in the first place\r\n\r\n\t\tvar buffer = this.buffer,\r\n\t\t\tstride = this.valueSize,\r\n\t\t\toffset = accuIndex * stride + stride,\r\n\r\n\t\t\tcurrentWeight = this.cumulativeWeight;\r\n\r\n\t\tif ( currentWeight === 0 ) {\r\n\r\n\t\t\t// accuN := incoming * weight\r\n\r\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\r\n\r\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcurrentWeight = weight;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// accuN := accuN + incoming * weight\r\n\r\n\t\t\tcurrentWeight += weight;\r\n\t\t\tvar mix = weight / currentWeight;\r\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\r\n\r\n\t\t}\r\n\r\n\t\tthis.cumulativeWeight = currentWeight;\r\n\r\n\t},\r\n\r\n\t// apply the state of 'accu' to the binding when accus differ\r\n\tapply: function( accuIndex ) {\r\n\r\n\t\tvar stride = this.valueSize,\r\n\t\t\tbuffer = this.buffer,\r\n\t\t\toffset = accuIndex * stride + stride,\r\n\r\n\t\t\tweight = this.cumulativeWeight,\r\n\r\n\t\t\tbinding = this.binding;\r\n\r\n\t\tthis.cumulativeWeight = 0;\r\n\r\n\t\tif ( weight < 1 ) {\r\n\r\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\r\n\r\n\t\t\tvar originalValueOffset = stride * 3;\r\n\r\n\t\t\tthis._mixBufferRegion(\r\n\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\r\n\r\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\r\n\r\n\t\t\t\t// value has changed -> update scene graph\r\n\r\n\t\t\t\tbinding.setValue( buffer, offset );\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t// remember the state of the bound property and copy it to both accus\r\n\tsaveOriginalState: function() {\r\n\r\n\t\tvar binding = this.binding;\r\n\r\n\t\tvar buffer = this.buffer,\r\n\t\t\tstride = this.valueSize,\r\n\r\n\t\t\toriginalValueOffset = stride * 3;\r\n\r\n\t\tbinding.getValue( buffer, originalValueOffset );\r\n\r\n\t\t// accu[0..1] := orig -- initially detect changes against the original\r\n\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\r\n\r\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\r\n\r\n\t\t}\r\n\r\n\t\tthis.cumulativeWeight = 0;\r\n\r\n\t},\r\n\r\n\t// apply the state previously taken via 'saveOriginalState' to the binding\r\n\trestoreOriginalState: function() {\r\n\r\n\t\tvar originalValueOffset = this.valueSize * 3;\r\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\r\n\r\n\t},\r\n\r\n\r\n\t// mix functions\r\n\r\n\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\r\n\r\n\t\tif ( t >= 0.5 ) {\r\n\r\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\r\n\r\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\r\n\r\n\t\tTHREE.Quaternion.slerpFlat( buffer, dstOffset,\r\n\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\r\n\r\n\t},\r\n\r\n\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\r\n\r\n\t\tvar s = 1 - t;\r\n\r\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\r\n\r\n\t\t\tvar j = dstOffset + i;\r\n\r\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/animation/tracks/BooleanKeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A Track of Boolean keyframe values.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.BooleanKeyframeTrack = function ( name, times, values ) {\r\n\r\n\tTHREE.KeyframeTrack.call( this, name, times, values );\r\n\r\n};\r\n\r\nTHREE.BooleanKeyframeTrack.prototype =\r\n\t\tObject.assign( Object.create( THREE.KeyframeTrack.prototype ), {\r\n\r\n\tconstructor: THREE.BooleanKeyframeTrack,\r\n\r\n\tValueTypeName: 'bool',\r\n\tValueBufferType: Array,\r\n\r\n\tDefaultInterpolation: THREE.InterpolateDiscrete,\r\n\r\n\tInterpolantFactoryMethodLinear: undefined,\r\n\tInterpolantFactoryMethodSmooth: undefined\r\n\r\n\t// Note: Actually this track could have a optimized / compressed\r\n\t// representation of a single value and a custom interpolant that\r\n\t// computes \"firstValue ^ isOdd( index )\".\r\n\r\n} );\r\n\r\n// File:src/animation/tracks/ColorKeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A Track of keyframe values that represent color.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.ColorKeyframeTrack = function ( name, times, values, interpolation ) {\r\n\r\n\tTHREE.KeyframeTrack.call( this, name, times, values, interpolation );\r\n\r\n};\r\n\r\nTHREE.ColorKeyframeTrack.prototype =\r\n\t\tObject.assign( Object.create( THREE.KeyframeTrack.prototype ), {\r\n\r\n\tconstructor: THREE.ColorKeyframeTrack,\r\n\r\n\tValueTypeName: 'color'\r\n\r\n\t// ValueBufferType is inherited\r\n\r\n\t// DefaultInterpolation is inherited\r\n\r\n\r\n\t// Note: Very basic implementation and nothing special yet.\r\n\t// However, this is the place for color space parameterization.\r\n\r\n} );\r\n\r\n// File:src/animation/tracks/NumberKeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A Track of numeric keyframe values.\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.NumberKeyframeTrack = function ( name, times, values, interpolation ) {\r\n\r\n\tTHREE.KeyframeTrack.call( this, name, times, values, interpolation );\r\n\r\n};\r\n\r\nTHREE.NumberKeyframeTrack.prototype =\r\n\t\tObject.assign( Object.create( THREE.KeyframeTrack.prototype ), {\r\n\r\n\tconstructor: THREE.NumberKeyframeTrack,\r\n\r\n\tValueTypeName: 'number',\r\n\r\n\t// ValueBufferType is inherited\r\n\r\n\t// DefaultInterpolation is inherited\r\n\r\n} );\r\n\r\n// File:src/animation/tracks/QuaternionKeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A Track of quaternion keyframe values.\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.QuaternionKeyframeTrack = function ( name, times, values, interpolation ) {\r\n\r\n\tTHREE.KeyframeTrack.call( this, name, times, values, interpolation );\r\n\r\n};\r\n\r\nTHREE.QuaternionKeyframeTrack.prototype =\r\n\t\tObject.assign( Object.create( THREE.KeyframeTrack.prototype ), {\r\n\r\n\tconstructor: THREE.QuaternionKeyframeTrack,\r\n\r\n\tValueTypeName: 'quaternion',\r\n\r\n\t// ValueBufferType is inherited\r\n\r\n\tDefaultInterpolation: THREE.InterpolateLinear,\r\n\r\n\tInterpolantFactoryMethodLinear: function( result ) {\r\n\r\n\t\treturn new THREE.QuaternionLinearInterpolant(\r\n\t\t\t\tthis.times, this.values, this.getValueSize(), result );\r\n\r\n\t},\r\n\r\n\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\r\n\r\n} );\r\n\r\n// File:src/animation/tracks/StringKeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A Track that interpolates Strings\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.StringKeyframeTrack = function ( name, times, values, interpolation ) {\r\n\r\n\tTHREE.KeyframeTrack.call( this, name, times, values, interpolation );\r\n\r\n};\r\n\r\nTHREE.StringKeyframeTrack.prototype =\r\n\t\tObject.assign( Object.create( THREE.KeyframeTrack.prototype ), {\r\n\r\n\tconstructor: THREE.StringKeyframeTrack,\r\n\r\n\tValueTypeName: 'string',\r\n\tValueBufferType: Array,\r\n\r\n\tDefaultInterpolation: THREE.InterpolateDiscrete,\r\n\r\n\tInterpolantFactoryMethodLinear: undefined,\r\n\r\n\tInterpolantFactoryMethodSmooth: undefined\r\n\r\n} );\r\n\r\n// File:src/animation/tracks/VectorKeyframeTrack.js\r\n\r\n/**\r\n *\r\n * A Track of vectored keyframe values.\r\n *\r\n *\r\n * @author Ben Houston / http://clara.io/\r\n * @author David Sarno / http://lighthaus.us/\r\n * @author tschw\r\n */\r\n\r\nTHREE.VectorKeyframeTrack = function ( name, times, values, interpolation ) {\r\n\r\n\tTHREE.KeyframeTrack.call( this, name, times, values, interpolation );\r\n\r\n};\r\n\r\nTHREE.VectorKeyframeTrack.prototype =\r\n\t\tObject.assign( Object.create( THREE.KeyframeTrack.prototype ), {\r\n\r\n\tconstructor: THREE.VectorKeyframeTrack,\r\n\r\n\tValueTypeName: 'vector'\r\n\r\n\t// ValueBufferType is inherited\r\n\r\n\t// DefaultInterpolation is inherited\r\n\r\n} );\r\n\r\n// File:src/audio/Audio.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\r\n */\r\n\r\nTHREE.Audio = function ( listener ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Audio';\r\n\r\n\tthis.context = listener.context;\r\n\tthis.source = this.context.createBufferSource();\r\n\tthis.source.onended = this.onEnded.bind( this );\r\n\r\n\tthis.gain = this.context.createGain();\r\n\tthis.gain.connect( listener.getInput() );\r\n\r\n\tthis.autoplay = false;\r\n\r\n\tthis.startTime = 0;\r\n\tthis.playbackRate = 1;\r\n\tthis.isPlaying = false;\r\n\tthis.hasPlaybackControl = true;\r\n\tthis.sourceType = 'empty';\r\n\r\n\tthis.filter = null;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Audio.prototype.constructor = THREE.Audio;\r\n\r\nTHREE.Audio.prototype.getOutput = function () {\r\n\r\n\treturn this.gain;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.setNodeSource = function ( audioNode ) {\r\n\r\n\tthis.hasPlaybackControl = false;\r\n\tthis.sourceType = 'audioNode';\r\n\tthis.source = audioNode;\r\n\tthis.connect();\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.setBuffer = function ( audioBuffer ) {\r\n\r\n\tvar scope = this;\r\n\r\n\tscope.source.buffer = audioBuffer;\r\n\tscope.sourceType = 'buffer';\r\n\tif ( scope.autoplay ) scope.play();\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.play = function () {\r\n\r\n\tif ( this.isPlaying === true ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tif ( this.hasPlaybackControl === false ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tvar source = this.context.createBufferSource();\r\n\r\n\tsource.buffer = this.source.buffer;\r\n\tsource.loop = this.source.loop;\r\n\tsource.onended = this.source.onended;\r\n\tsource.start( 0, this.startTime );\r\n\tsource.playbackRate.value = this.playbackRate;\r\n\r\n\tthis.isPlaying = true;\r\n\r\n\tthis.source = source;\r\n\r\n\tthis.connect();\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.pause = function () {\r\n\r\n\tif ( this.hasPlaybackControl === false ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tthis.source.stop();\r\n\tthis.startTime = this.context.currentTime;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.stop = function () {\r\n\r\n\tif ( this.hasPlaybackControl === false ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tthis.source.stop();\r\n\tthis.startTime = 0;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.connect = function () {\r\n\r\n\tif ( this.filter !== null ) {\r\n\r\n\t\tthis.source.connect( this.filter );\r\n\t\tthis.filter.connect( this.getOutput() );\r\n\r\n\t} else {\r\n\r\n\t\tthis.source.connect( this.getOutput() );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.disconnect = function () {\r\n\r\n\tif ( this.filter !== null ) {\r\n\r\n\t\tthis.source.disconnect( this.filter );\r\n\t\tthis.filter.disconnect( this.getOutput() );\r\n\r\n\t} else {\r\n\r\n\t\tthis.source.disconnect( this.getOutput() );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.getFilter = function () {\r\n\r\n\treturn this.filter;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.setFilter = function ( value ) {\r\n\r\n\tif ( value === undefined ) value = null;\r\n\r\n\tif ( this.isPlaying === true ) {\r\n\r\n\t\tthis.disconnect();\r\n\t\tthis.filter = value;\r\n\t\tthis.connect();\r\n\r\n\t} else {\r\n\r\n\t\tthis.filter = value;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.setPlaybackRate = function ( value ) {\r\n\r\n\tif ( this.hasPlaybackControl === false ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tthis.playbackRate = value;\r\n\r\n\tif ( this.isPlaying === true ) {\r\n\r\n\t\tthis.source.playbackRate.value = this.playbackRate;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.getPlaybackRate = function () {\r\n\r\n\treturn this.playbackRate;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.onEnded = function () {\r\n\r\n\tthis.isPlaying = false;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.setLoop = function ( value ) {\r\n\r\n\tif ( this.hasPlaybackControl === false ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tthis.source.loop = value;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.getLoop = function () {\r\n\r\n\tif ( this.hasPlaybackControl === false ) {\r\n\r\n\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\r\n\t\treturn false;\r\n\r\n\t}\r\n\r\n\treturn this.source.loop;\r\n\r\n};\r\n\r\n\r\nTHREE.Audio.prototype.setVolume = function ( value ) {\r\n\r\n\tthis.gain.gain.value = value;\r\n\r\n};\r\n\r\nTHREE.Audio.prototype.getVolume = function () {\r\n\r\n\treturn this.gain.gain.value;\r\n\r\n};\r\n\r\n// File:src/audio/AudioAnalyser.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.AudioAnalyser = function ( audio, fftSize ) {\r\n\r\n\tthis.analyser = audio.context.createAnalyser();\r\n\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\r\n\r\n\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\r\n\r\n\taudio.getOutput().connect( this.analyser );\r\n\r\n};\r\n\r\nTHREE.AudioAnalyser.prototype = {\r\n\r\n\tconstructor: THREE.AudioAnalyser,\r\n\r\n\tgetData: function () {\r\n\r\n\t\tthis.analyser.getByteFrequencyData( this.data );\r\n\t\treturn this.data;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/audio/AudioContext.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nObject.defineProperty( THREE, 'AudioContext', {\r\n\r\n\tget: ( function () {\r\n\r\n\t\tvar context;\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tif ( context === undefined ) {\r\n\r\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn context;\r\n\r\n\t\t};\r\n\r\n\t} )()\r\n\r\n} );\r\n\r\n// File:src/audio/PositionalAudio.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.PositionalAudio = function ( listener ) {\r\n\r\n\tTHREE.Audio.call( this, listener );\r\n\r\n\tthis.panner = this.context.createPanner();\r\n\tthis.panner.connect( this.gain );\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype = Object.create( THREE.Audio.prototype );\r\nTHREE.PositionalAudio.prototype.constructor = THREE.PositionalAudio;\r\n\r\nTHREE.PositionalAudio.prototype.getOutput = function () {\r\n\r\n\treturn this.panner;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.setRefDistance = function ( value ) {\r\n\r\n\tthis.panner.refDistance = value;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.getRefDistance = function () {\r\n\r\n\treturn this.panner.refDistance;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.setRolloffFactor = function ( value ) {\r\n\r\n\tthis.panner.rolloffFactor = value;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.getRolloffFactor = function () {\r\n\r\n\treturn this.panner.rolloffFactor;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.setDistanceModel = function ( value ) {\r\n\r\n\tthis.panner.distanceModel = value;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.getDistanceModel = function () {\r\n\r\n\treturn this.panner.distanceModel;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.setMaxDistance = function ( value ) {\r\n\r\n\tthis.panner.maxDistance = value;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.getMaxDistance = function () {\r\n\r\n\treturn this.panner.maxDistance;\r\n\r\n};\r\n\r\nTHREE.PositionalAudio.prototype.updateMatrixWorld = ( function () {\r\n\r\n\tvar position = new THREE.Vector3();\r\n\r\n\treturn function updateMatrixWorld( force ) {\r\n\r\n\t\tTHREE.Object3D.prototype.updateMatrixWorld.call( this, force );\r\n\r\n\t\tposition.setFromMatrixPosition( this.matrixWorld );\r\n\r\n\t\tthis.panner.setPosition( position.x, position.y, position.z );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n// File:src/audio/AudioListener.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.AudioListener = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'AudioListener';\r\n\r\n\tthis.context = THREE.AudioContext;\r\n\r\n\tthis.gain = this.context.createGain();\r\n\tthis.gain.connect( this.context.destination );\r\n\r\n\tthis.filter = null;\r\n\r\n};\r\n\r\nTHREE.AudioListener.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.AudioListener.prototype.constructor = THREE.AudioListener;\r\n\r\nTHREE.AudioListener.prototype.getInput = function () {\r\n\r\n\treturn this.gain;\r\n\r\n};\r\n\r\nTHREE.AudioListener.prototype.removeFilter = function ( ) {\r\n\r\n\tif ( this.filter !== null ) {\r\n\r\n\t\tthis.gain.disconnect( this.filter );\r\n\t\tthis.filter.disconnect( this.context.destination );\r\n\t\tthis.gain.connect( this.context.destination );\r\n\t\tthis.filter = null;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.AudioListener.prototype.setFilter = function ( value ) {\r\n\r\n\tif ( this.filter !== null ) {\r\n\r\n\t\tthis.gain.disconnect( this.filter );\r\n\t\tthis.filter.disconnect( this.context.destination );\r\n\r\n\t} else {\r\n\r\n\t\tthis.gain.disconnect( this.context.destination );\r\n\r\n\t}\r\n\r\n\tthis.filter = value;\r\n\tthis.gain.connect( this.filter );\r\n\tthis.filter.connect( this.context.destination );\r\n\r\n};\r\n\r\nTHREE.AudioListener.prototype.getFilter = function () {\r\n\r\n\treturn this.filter;\r\n\r\n};\r\n\r\nTHREE.AudioListener.prototype.setMasterVolume = function ( value ) {\r\n\r\n\tthis.gain.gain.value = value;\r\n\r\n};\r\n\r\nTHREE.AudioListener.prototype.getMasterVolume = function () {\r\n\r\n\treturn this.gain.gain.value;\r\n\r\n};\r\n\r\n\r\nTHREE.AudioListener.prototype.updateMatrixWorld = ( function () {\r\n\r\n\tvar position = new THREE.Vector3();\r\n\tvar quaternion = new THREE.Quaternion();\r\n\tvar scale = new THREE.Vector3();\r\n\r\n\tvar orientation = new THREE.Vector3();\r\n\r\n\treturn function updateMatrixWorld( force ) {\r\n\r\n\t\tTHREE.Object3D.prototype.updateMatrixWorld.call( this, force );\r\n\r\n\t\tvar listener = this.context.listener;\r\n\t\tvar up = this.up;\r\n\r\n\t\tthis.matrixWorld.decompose( position, quaternion, scale );\r\n\r\n\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\r\n\r\n\t\tlistener.setPosition( position.x, position.y, position.z );\r\n\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n// File:src/cameras/Camera.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.Camera = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Camera';\r\n\r\n\tthis.matrixWorldInverse = new THREE.Matrix4();\r\n\tthis.projectionMatrix = new THREE.Matrix4();\r\n\r\n};\r\n\r\nTHREE.Camera.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Camera.prototype.constructor = THREE.Camera;\r\n\r\nTHREE.Camera.prototype.getWorldDirection = function () {\r\n\r\n\tvar quaternion = new THREE.Quaternion();\r\n\r\n\treturn function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\tthis.getWorldQuaternion( quaternion );\r\n\r\n\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.Camera.prototype.lookAt = function () {\r\n\r\n\t// This routine does not support cameras with rotated and/or translated parent(s)\r\n\r\n\tvar m1 = new THREE.Matrix4();\r\n\r\n\treturn function ( vector ) {\r\n\r\n\t\tm1.lookAt( this.position, vector, this.up );\r\n\r\n\t\tthis.quaternion.setFromRotationMatrix( m1 );\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.Camera.prototype.clone = function () {\r\n\r\n\treturn new this.constructor().copy( this );\r\n\r\n};\r\n\r\nTHREE.Camera.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Object3D.prototype.copy.call( this, source );\r\n\r\n\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\r\n\tthis.projectionMatrix.copy( source.projectionMatrix );\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/cameras/CubeCamera.js\r\n\r\n/**\r\n * Camera for rendering cube maps\r\n *\t- renders scene into axis-aligned cube\r\n *\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.CubeCamera = function ( near, far, cubeResolution ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'CubeCamera';\r\n\r\n\tvar fov = 90, aspect = 1;\r\n\r\n\tvar cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraPX.up.set( 0, - 1, 0 );\r\n\tcameraPX.lookAt( new THREE.Vector3( 1, 0, 0 ) );\r\n\tthis.add( cameraPX );\r\n\r\n\tvar cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraNX.up.set( 0, - 1, 0 );\r\n\tcameraNX.lookAt( new THREE.Vector3( - 1, 0, 0 ) );\r\n\tthis.add( cameraNX );\r\n\r\n\tvar cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraPY.up.set( 0, 0, 1 );\r\n\tcameraPY.lookAt( new THREE.Vector3( 0, 1, 0 ) );\r\n\tthis.add( cameraPY );\r\n\r\n\tvar cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraNY.up.set( 0, 0, - 1 );\r\n\tcameraNY.lookAt( new THREE.Vector3( 0, - 1, 0 ) );\r\n\tthis.add( cameraNY );\r\n\r\n\tvar cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraPZ.up.set( 0, - 1, 0 );\r\n\tcameraPZ.lookAt( new THREE.Vector3( 0, 0, 1 ) );\r\n\tthis.add( cameraPZ );\r\n\r\n\tvar cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraNZ.up.set( 0, - 1, 0 );\r\n\tcameraNZ.lookAt( new THREE.Vector3( 0, 0, - 1 ) );\r\n\tthis.add( cameraNZ );\r\n\r\n\tvar options = { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter };\r\n\r\n\tthis.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\r\n\r\n\tthis.updateCubeMap = function ( renderer, scene ) {\r\n\r\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\r\n\r\n\t\tvar renderTarget = this.renderTarget;\r\n\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\r\n\r\n\t\trenderTarget.texture.generateMipmaps = false;\r\n\r\n\t\trenderTarget.activeCubeFace = 0;\r\n\t\trenderer.render( scene, cameraPX, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 1;\r\n\t\trenderer.render( scene, cameraNX, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 2;\r\n\t\trenderer.render( scene, cameraPY, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 3;\r\n\t\trenderer.render( scene, cameraNY, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 4;\r\n\t\trenderer.render( scene, cameraPZ, renderTarget );\r\n\r\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\r\n\r\n\t\trenderTarget.activeCubeFace = 5;\r\n\t\trenderer.render( scene, cameraNZ, renderTarget );\r\n\r\n\t\trenderer.setRenderTarget( null );\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.CubeCamera.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.CubeCamera.prototype.constructor = THREE.CubeCamera;\r\n\r\n// File:src/cameras/OrthographicCamera.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) {\r\n\r\n\tTHREE.Camera.call( this );\r\n\r\n\tthis.type = 'OrthographicCamera';\r\n\r\n\tthis.zoom = 1;\r\n\r\n\tthis.left = left;\r\n\tthis.right = right;\r\n\tthis.top = top;\r\n\tthis.bottom = bottom;\r\n\r\n\tthis.near = ( near !== undefined ) ? near : 0.1;\r\n\tthis.far = ( far !== undefined ) ? far : 2000;\r\n\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\nTHREE.OrthographicCamera.prototype = Object.create( THREE.Camera.prototype );\r\nTHREE.OrthographicCamera.prototype.constructor = THREE.OrthographicCamera;\r\n\r\nTHREE.OrthographicCamera.prototype.updateProjectionMatrix = function () {\r\n\r\n\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\r\n\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\r\n\tvar cx = ( this.right + this.left ) / 2;\r\n\tvar cy = ( this.top + this.bottom ) / 2;\r\n\r\n\tthis.projectionMatrix.makeOrthographic( cx - dx, cx + dx, cy + dy, cy - dy, this.near, this.far );\r\n\r\n};\r\n\r\nTHREE.OrthographicCamera.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Camera.prototype.copy.call( this, source );\r\n\r\n\tthis.left = source.left;\r\n\tthis.right = source.right;\r\n\tthis.top = source.top;\r\n\tthis.bottom = source.bottom;\r\n\tthis.near = source.near;\r\n\tthis.far = source.far;\r\n\r\n\tthis.zoom = source.zoom;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.OrthographicCamera.prototype.toJSON = function ( meta ) {\r\n\r\n\tvar data = THREE.Object3D.prototype.toJSON.call( this, meta );\r\n\r\n\tdata.object.zoom = this.zoom;\r\n\tdata.object.left = this.left;\r\n\tdata.object.right = this.right;\r\n\tdata.object.top = this.top;\r\n\tdata.object.bottom = this.bottom;\r\n\tdata.object.near = this.near;\r\n\tdata.object.far = this.far;\r\n\r\n\treturn data;\r\n\r\n};\r\n\r\n// File:src/cameras/PerspectiveCamera.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author greggman / http://games.greggman.com/\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * @author tschw\r\n */\r\n\r\nTHREE.PerspectiveCamera = function( fov, aspect, near, far ) {\r\n\r\n\tTHREE.Camera.call( this );\r\n\r\n\tthis.type = 'PerspectiveCamera';\r\n\r\n\tthis.fov = fov !== undefined ? fov : 50;\r\n\tthis.zoom = 1;\r\n\r\n\tthis.near = near !== undefined ? near : 0.1;\r\n\tthis.far = far !== undefined ? far : 2000;\r\n\tthis.focus = 10;\r\n\r\n\tthis.aspect = aspect !== undefined ? aspect : 1;\r\n\tthis.view = null;\r\n\r\n\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\r\n\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\r\n\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype );\r\nTHREE.PerspectiveCamera.prototype.constructor = THREE.PerspectiveCamera;\r\n\r\n\r\n/**\r\n * Sets the FOV by focal length (DEPRECATED).\r\n *\r\n * Optionally also sets .filmGauge, otherwise uses it. See .setFocalLength.\r\n */\r\nTHREE.PerspectiveCamera.prototype.setLens = function( focalLength, filmGauge ) {\r\n\r\n\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\r\n\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\r\n\r\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\r\n\tthis.setFocalLength( focalLength );\r\n\r\n};\r\n\r\n/**\r\n * Sets the FOV by focal length in respect to the current .filmGauge.\r\n *\r\n * The default film gauge is 35, so that the focal length can be specified for\r\n * a 35mm (full frame) camera.\r\n *\r\n * Values for focal length and film gauge must have the same unit.\r\n */\r\nTHREE.PerspectiveCamera.prototype.setFocalLength = function( focalLength ) {\r\n\r\n\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\r\n\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\r\n\r\n\tthis.fov = THREE.Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\n\r\n/**\r\n * Calculates the focal length from the current .fov and .filmGauge.\r\n */\r\nTHREE.PerspectiveCamera.prototype.getFocalLength = function() {\r\n\r\n\tvar vExtentSlope = Math.tan( THREE.Math.DEG2RAD * 0.5 * this.fov );\r\n\r\n\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype.getEffectiveFOV = function() {\r\n\r\n\treturn THREE.Math.RAD2DEG * 2 * Math.atan(\r\n\t\t\tMath.tan( THREE.Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype.getFilmWidth = function() {\r\n\r\n\t// film not completely covered in portrait format (aspect < 1)\r\n\treturn this.filmGauge * Math.min( this.aspect, 1 );\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype.getFilmHeight = function() {\r\n\r\n\t// film not completely covered in landscape format (aspect > 1)\r\n\treturn this.filmGauge / Math.max( this.aspect, 1 );\r\n\r\n};\r\n\r\n\r\n\r\n/**\r\n * Sets an offset in a larger frustum. This is useful for multi-window or\r\n * multi-monitor/multi-machine setups.\r\n *\r\n * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\r\n * the monitors are in grid like this\r\n *\r\n * +---+---+---+\r\n * | A | B | C |\r\n * +---+---+---+\r\n * | D | E | F |\r\n * +---+---+---+\r\n *\r\n * then for each monitor you would call it like this\r\n *\r\n * var w = 1920;\r\n * var h = 1080;\r\n * var fullWidth = w * 3;\r\n * var fullHeight = h * 2;\r\n *\r\n * --A--\r\n * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\r\n * --B--\r\n * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\r\n * --C--\r\n * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\r\n * --D--\r\n * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\r\n * --E--\r\n * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\r\n * --F--\r\n * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\r\n *\r\n * Note there is no reason monitors have to be the same size or in a grid.\r\n */\r\nTHREE.PerspectiveCamera.prototype.setViewOffset = function( fullWidth, fullHeight, x, y, width, height ) {\r\n\r\n\tthis.aspect = fullWidth / fullHeight;\r\n\r\n\tthis.view = {\r\n\t\tfullWidth: fullWidth,\r\n\t\tfullHeight: fullHeight,\r\n\t\toffsetX: x,\r\n\t\toffsetY: y,\r\n\t\twidth: width,\r\n\t\theight: height\r\n\t};\r\n\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix = function() {\r\n\r\n\tvar near = this.near,\r\n\t\ttop = near * Math.tan(\r\n\t\t\t\tTHREE.Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\r\n\t\theight = 2 * top,\r\n\t\twidth = this.aspect * height,\r\n\t\tleft = - 0.5 * width,\r\n\t\tview = this.view;\r\n\r\n\tif ( view !== null ) {\r\n\r\n\t\tvar fullWidth = view.fullWidth,\r\n\t\t\tfullHeight = view.fullHeight;\r\n\r\n\t\tleft += view.offsetX * width / fullWidth;\r\n\t\ttop -= view.offsetY * height / fullHeight;\r\n\t\twidth *= view.width / fullWidth;\r\n\t\theight *= view.height / fullHeight;\r\n\r\n\t}\r\n\r\n\tvar skew = this.filmOffset;\r\n\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\r\n\r\n\tthis.projectionMatrix.makeFrustum(\r\n\t\t\tleft, left + width, top - height, top, near, this.far );\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype.copy = function( source ) {\r\n\r\n\tTHREE.Camera.prototype.copy.call( this, source );\r\n\r\n\tthis.fov = source.fov;\r\n\tthis.zoom = source.zoom;\r\n\r\n\tthis.near = source.near;\r\n\tthis.far = source.far;\r\n\tthis.focus = source.focus;\r\n\r\n\tthis.aspect = source.aspect;\r\n\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\r\n\r\n\tthis.filmGauge = source.filmGauge;\r\n\tthis.filmOffset = source.filmOffset;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype.toJSON = function( meta ) {\r\n\r\n\tvar data = THREE.Object3D.prototype.toJSON.call( this, meta );\r\n\r\n\tdata.object.fov = this.fov;\r\n\tdata.object.zoom = this.zoom;\r\n\r\n\tdata.object.near = this.near;\r\n\tdata.object.far = this.far;\r\n\tdata.object.focus = this.focus;\r\n\r\n\tdata.object.aspect = this.aspect;\r\n\r\n\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\r\n\r\n\tdata.object.filmGauge = this.filmGauge;\r\n\tdata.object.filmOffset = this.filmOffset;\r\n\r\n\treturn data;\r\n\r\n};\r\n\r\n// File:src/cameras/StereoCamera.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.StereoCamera = function () {\r\n\r\n\tthis.type = 'StereoCamera';\r\n\r\n\tthis.aspect = 1;\r\n\r\n\tthis.cameraL = new THREE.PerspectiveCamera();\r\n\tthis.cameraL.layers.enable( 1 );\r\n\tthis.cameraL.matrixAutoUpdate = false;\r\n\r\n\tthis.cameraR = new THREE.PerspectiveCamera();\r\n\tthis.cameraR.layers.enable( 2 );\r\n\tthis.cameraR.matrixAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.StereoCamera.prototype = {\r\n\r\n\tconstructor: THREE.StereoCamera,\r\n\r\n\tupdate: ( function () {\r\n\r\n\t\tvar focus, fov, aspect, near, far;\r\n\r\n\t\tvar eyeRight = new THREE.Matrix4();\r\n\t\tvar eyeLeft = new THREE.Matrix4();\r\n\r\n\t\treturn function update ( camera ) {\r\n\r\n\t\t\tvar needsUpdate = focus !== camera.focus || fov !== camera.fov ||\r\n\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far;\r\n\r\n\t\t\tif ( needsUpdate ) {\r\n\r\n\t\t\t\tfocus = camera.focus;\r\n\t\t\t\tfov = camera.fov;\r\n\t\t\t\taspect = camera.aspect * this.aspect;\r\n\t\t\t\tnear = camera.near;\r\n\t\t\t\tfar = camera.far;\r\n\r\n\t\t\t\t// Off-axis stereoscopic effect based on\r\n\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\r\n\r\n\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\r\n\t\t\t\tvar eyeSep = 0.064 / 2;\r\n\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\r\n\t\t\t\tvar ymax = near * Math.tan( THREE.Math.DEG2RAD * fov * 0.5 );\r\n\t\t\t\tvar xmin, xmax;\r\n\r\n\t\t\t\t// translate xOffset\r\n\r\n\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\r\n\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\r\n\r\n\t\t\t\t// for left eye\r\n\r\n\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\r\n\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\r\n\r\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\r\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\r\n\r\n\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\r\n\r\n\t\t\t\t// for right eye\r\n\r\n\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\r\n\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\r\n\r\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\r\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\r\n\r\n\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\r\n\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\r\n\r\n\t\t};\r\n\r\n\t} )()\r\n\r\n};\r\n\r\n// File:src/lights/Light.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Light = function ( color, intensity ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Light';\r\n\r\n\tthis.color = new THREE.Color( color );\r\n\tthis.intensity = intensity !== undefined ? intensity : 1;\r\n\r\n\tthis.receiveShadow = undefined;\r\n\r\n};\r\n\r\nTHREE.Light.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Light.prototype.constructor = THREE.Light;\r\n\r\nTHREE.Light.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Object3D.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\tthis.intensity = source.intensity;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.Light.prototype.toJSON = function ( meta ) {\r\n\r\n\tvar data = THREE.Object3D.prototype.toJSON.call( this, meta );\r\n\r\n\tdata.object.color = this.color.getHex();\r\n\tdata.object.intensity = this.intensity;\r\n\r\n\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\r\n\r\n\tif ( this.distance !== undefined ) data.object.distance = this.distance;\r\n\tif ( this.angle !== undefined ) data.object.angle = this.angle;\r\n\tif ( this.decay !== undefined ) data.object.decay = this.decay;\r\n\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\r\n\r\n\treturn data;\r\n\r\n};\r\n\r\n// File:src/lights/LightShadow.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.LightShadow = function ( camera ) {\r\n\r\n\tthis.camera = camera;\r\n\r\n\tthis.bias = 0;\r\n\tthis.radius = 1;\r\n\r\n\tthis.mapSize = new THREE.Vector2( 512, 512 );\r\n\r\n\tthis.map = null;\r\n\tthis.matrix = new THREE.Matrix4();\r\n\r\n};\r\n\r\nTHREE.LightShadow.prototype = {\r\n\r\n\tconstructor: THREE.LightShadow,\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.camera = source.camera.clone();\r\n\r\n\t\tthis.bias = source.bias;\r\n\t\tthis.radius = source.radius;\r\n\r\n\t\tthis.mapSize.copy( source.mapSize );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/lights/AmbientLight.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.AmbientLight = function ( color, intensity ) {\r\n\r\n\tTHREE.Light.call( this, color, intensity );\r\n\r\n\tthis.type = 'AmbientLight';\r\n\r\n\tthis.castShadow = undefined;\r\n\r\n};\r\n\r\nTHREE.AmbientLight.prototype = Object.create( THREE.Light.prototype );\r\nTHREE.AmbientLight.prototype.constructor = THREE.AmbientLight;\r\n\r\n// File:src/lights/DirectionalLight.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.DirectionalLight = function ( color, intensity ) {\r\n\r\n\tTHREE.Light.call( this, color, intensity );\r\n\r\n\tthis.type = 'DirectionalLight';\r\n\r\n\tthis.position.set( 0, 1, 0 );\r\n\tthis.updateMatrix();\r\n\r\n\tthis.target = new THREE.Object3D();\r\n\r\n\tthis.shadow = new THREE.DirectionalLightShadow();\r\n\r\n};\r\n\r\nTHREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype );\r\nTHREE.DirectionalLight.prototype.constructor = THREE.DirectionalLight;\r\n\r\nTHREE.DirectionalLight.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Light.prototype.copy.call( this, source );\r\n\r\n\tthis.target = source.target.clone();\r\n\r\n\tthis.shadow = source.shadow.clone();\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/lights/DirectionalLightShadow.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.DirectionalLightShadow = function ( light ) {\r\n\r\n\tTHREE.LightShadow.call( this, new THREE.OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\r\n\r\n};\r\n\r\nTHREE.DirectionalLightShadow.prototype = Object.create( THREE.LightShadow.prototype );\r\nTHREE.DirectionalLightShadow.prototype.constructor = THREE.DirectionalLightShadow;\r\n\r\n// File:src/lights/HemisphereLight.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.HemisphereLight = function ( skyColor, groundColor, intensity ) {\r\n\r\n\tTHREE.Light.call( this, skyColor, intensity );\r\n\r\n\tthis.type = 'HemisphereLight';\r\n\r\n\tthis.castShadow = undefined;\r\n\r\n\tthis.position.set( 0, 1, 0 );\r\n\tthis.updateMatrix();\r\n\r\n\tthis.groundColor = new THREE.Color( groundColor );\r\n\r\n};\r\n\r\nTHREE.HemisphereLight.prototype = Object.create( THREE.Light.prototype );\r\nTHREE.HemisphereLight.prototype.constructor = THREE.HemisphereLight;\r\n\r\nTHREE.HemisphereLight.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Light.prototype.copy.call( this, source );\r\n\r\n\tthis.groundColor.copy( source.groundColor );\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/lights/PointLight.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\n\r\nTHREE.PointLight = function ( color, intensity, distance, decay ) {\r\n\r\n\tTHREE.Light.call( this, color, intensity );\r\n\r\n\tthis.type = 'PointLight';\r\n\r\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\r\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\r\n\r\n\tthis.shadow = new THREE.LightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\r\n\r\n};\r\n\r\nTHREE.PointLight.prototype = Object.create( THREE.Light.prototype );\r\nTHREE.PointLight.prototype.constructor = THREE.PointLight;\r\n\r\nObject.defineProperty( THREE.PointLight.prototype, \"power\", {\r\n\r\n\tget: function () {\r\n\r\n\t\t// intensity = power per solid angle.\r\n\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\r\n\t\treturn this.intensity * 4 * Math.PI;\r\n\r\n\t},\r\n\r\n\tset: function ( power ) {\r\n\r\n\t\t// intensity = power per solid angle.\r\n\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\r\n\t\tthis.intensity = power / ( 4 * Math.PI );\r\n\r\n\t}\r\n\r\n} );\r\n\r\nTHREE.PointLight.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Light.prototype.copy.call( this, source );\r\n\r\n\tthis.distance = source.distance;\r\n\tthis.decay = source.decay;\r\n\r\n\tthis.shadow = source.shadow.clone();\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/lights/SpotLight.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SpotLight = function ( color, intensity, distance, angle, penumbra, decay ) {\r\n\r\n\tTHREE.Light.call( this, color, intensity );\r\n\r\n\tthis.type = 'SpotLight';\r\n\r\n\tthis.position.set( 0, 1, 0 );\r\n\tthis.updateMatrix();\r\n\r\n\tthis.target = new THREE.Object3D();\r\n\r\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\r\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\r\n\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\r\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\r\n\r\n\tthis.shadow = new THREE.SpotLightShadow();\r\n\r\n};\r\n\r\nTHREE.SpotLight.prototype = Object.create( THREE.Light.prototype );\r\nTHREE.SpotLight.prototype.constructor = THREE.SpotLight;\r\n\r\nObject.defineProperty( THREE.SpotLight.prototype, \"power\", {\r\n\r\n\tget: function () {\r\n\r\n\t\t// intensity = power per solid angle.\r\n\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\r\n\t\treturn this.intensity * Math.PI;\r\n\r\n\t},\r\n\r\n\tset: function ( power ) {\r\n\r\n\t\t// intensity = power per solid angle.\r\n\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\r\n\t\tthis.intensity = power / Math.PI;\r\n\r\n\t}\r\n\r\n} );\r\n\r\nTHREE.SpotLight.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Light.prototype.copy.call( this, source );\r\n\r\n\tthis.distance = source.distance;\r\n\tthis.angle = source.angle;\r\n\tthis.penumbra = source.penumbra;\r\n\tthis.decay = source.decay;\r\n\r\n\tthis.target = source.target.clone();\r\n\r\n\tthis.shadow = source.shadow.clone();\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/lights/SpotLightShadow.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.SpotLightShadow = function () {\r\n\r\n\tTHREE.LightShadow.call( this, new THREE.PerspectiveCamera( 50, 1, 0.5, 500 ) );\r\n\r\n};\r\n\r\nTHREE.SpotLightShadow.prototype = Object.create( THREE.LightShadow.prototype );\r\nTHREE.SpotLightShadow.prototype.constructor = THREE.SpotLightShadow;\r\n\r\nTHREE.SpotLightShadow.prototype.update = function ( light ) {\r\n\r\n\tvar fov = THREE.Math.RAD2DEG * 2 * light.angle;\r\n\tvar aspect = this.mapSize.width / this.mapSize.height;\r\n\tvar far = light.distance || 500;\r\n\r\n\tvar camera = this.camera;\r\n\r\n\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\r\n\r\n\t\tcamera.fov = fov;\r\n\t\tcamera.aspect = aspect;\r\n\t\tcamera.far = far;\r\n\t\tcamera.updateProjectionMatrix();\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/AudioLoader.js\r\n\r\n/**\r\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\r\n */\r\n\r\nTHREE.AudioLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.AudioLoader.prototype = {\r\n\r\n\tconstructor: THREE.AudioLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar loader = new THREE.XHRLoader( this.manager );\r\n\t\tloader.setResponseType( 'arraybuffer' );\r\n\t\tloader.load( url, function ( buffer ) {\r\n\r\n\t\t\tvar context = THREE.AudioContext;\r\n\r\n\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\r\n\r\n\t\t\t\tonLoad( audioBuffer );\r\n\r\n\t\t\t} );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/Cache.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Cache = {\r\n\r\n\tenabled: false,\r\n\r\n\tfiles: {},\r\n\r\n\tadd: function ( key, file ) {\r\n\r\n\t\tif ( this.enabled === false ) return;\r\n\r\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\r\n\r\n\t\tthis.files[ key ] = file;\r\n\r\n\t},\r\n\r\n\tget: function ( key ) {\r\n\r\n\t\tif ( this.enabled === false ) return;\r\n\r\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\r\n\r\n\t\treturn this.files[ key ];\r\n\r\n\t},\r\n\r\n\tremove: function ( key ) {\r\n\r\n\t\tdelete this.files[ key ];\r\n\r\n\t},\r\n\r\n\tclear: function () {\r\n\r\n\t\tthis.files = {};\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/Loader.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Loader = function () {\r\n\r\n\tthis.onLoadStart = function () {};\r\n\tthis.onLoadProgress = function () {};\r\n\tthis.onLoadComplete = function () {};\r\n\r\n};\r\n\r\nTHREE.Loader.prototype = {\r\n\r\n\tconstructor: THREE.Loader,\r\n\r\n\tcrossOrigin: undefined,\r\n\r\n\textractUrlBase: function ( url ) {\r\n\r\n\t\tvar parts = url.split( '/' );\r\n\r\n\t\tif ( parts.length === 1 ) return './';\r\n\r\n\t\tparts.pop();\r\n\r\n\t\treturn parts.join( '/' ) + '/';\r\n\r\n\t},\r\n\r\n\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\r\n\r\n\t\tvar array = [];\r\n\r\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\r\n\r\n\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\r\n\r\n\t\t}\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tcreateMaterial: ( function () {\r\n\r\n\t\tvar color, textureLoader, materialLoader;\r\n\r\n\t\treturn function ( m, texturePath, crossOrigin ) {\r\n\r\n\t\t\tif ( color === undefined ) color = new THREE.Color();\r\n\t\t\tif ( textureLoader === undefined ) textureLoader = new THREE.TextureLoader();\r\n\t\t\tif ( materialLoader === undefined ) materialLoader = new THREE.MaterialLoader();\r\n\r\n\t\t\t// convert from old material format\r\n\r\n\t\t\tvar textures = {};\r\n\r\n\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\r\n\r\n\t\t\t\tvar fullPath = texturePath + path;\r\n\t\t\t\tvar loader = THREE.Loader.Handlers.get( fullPath );\r\n\r\n\t\t\t\tvar texture;\r\n\r\n\t\t\t\tif ( loader !== null ) {\r\n\r\n\t\t\t\t\ttexture = loader.load( fullPath );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\r\n\t\t\t\t\ttexture = textureLoader.load( fullPath );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( repeat !== undefined ) {\r\n\r\n\t\t\t\t\ttexture.repeat.fromArray( repeat );\r\n\r\n\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;\r\n\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( offset !== undefined ) {\r\n\r\n\t\t\t\t\ttexture.offset.fromArray( offset );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( wrap !== undefined ) {\r\n\r\n\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = THREE.RepeatWrapping;\r\n\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = THREE.MirroredRepeatWrapping;\r\n\r\n\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = THREE.RepeatWrapping;\r\n\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = THREE.MirroredRepeatWrapping;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( anisotropy !== undefined ) {\r\n\r\n\t\t\t\t\ttexture.anisotropy = anisotropy;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar uuid = THREE.Math.generateUUID();\r\n\r\n\t\t\t\ttextures[ uuid ] = texture;\r\n\r\n\t\t\t\treturn uuid;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//\r\n\r\n\t\t\tvar json = {\r\n\t\t\t\tuuid: THREE.Math.generateUUID(),\r\n\t\t\t\ttype: 'MeshLambertMaterial'\r\n\t\t\t};\r\n\r\n\t\t\tfor ( var name in m ) {\r\n\r\n\t\t\t\tvar value = m[ name ];\r\n\r\n\t\t\t\tswitch ( name ) {\r\n\t\t\t\t\tcase 'DbgColor':\r\n\t\t\t\t\tcase 'DbgIndex':\r\n\t\t\t\t\tcase 'opticalDensity':\r\n\t\t\t\t\tcase 'illumination':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'DbgName':\r\n\t\t\t\t\t\tjson.name = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'blending':\r\n\t\t\t\t\t\tjson.blending = THREE[ value ];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'colorAmbient':\r\n\t\t\t\t\tcase 'mapAmbient':\r\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'colorDiffuse':\r\n\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'colorSpecular':\r\n\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'colorEmissive':\r\n\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'specularCoef':\r\n\t\t\t\t\t\tjson.shininess = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'shading':\r\n\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\r\n\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapDiffuse':\r\n\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapDiffuseRepeat':\r\n\t\t\t\t\tcase 'mapDiffuseOffset':\r\n\t\t\t\t\tcase 'mapDiffuseWrap':\r\n\t\t\t\t\tcase 'mapDiffuseAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapLight':\r\n\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapLightRepeat':\r\n\t\t\t\t\tcase 'mapLightOffset':\r\n\t\t\t\t\tcase 'mapLightWrap':\r\n\t\t\t\t\tcase 'mapLightAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapAO':\r\n\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapAORepeat':\r\n\t\t\t\t\tcase 'mapAOOffset':\r\n\t\t\t\t\tcase 'mapAOWrap':\r\n\t\t\t\t\tcase 'mapAOAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapBump':\r\n\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapBumpScale':\r\n\t\t\t\t\t\tjson.bumpScale = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapBumpRepeat':\r\n\t\t\t\t\tcase 'mapBumpOffset':\r\n\t\t\t\t\tcase 'mapBumpWrap':\r\n\t\t\t\t\tcase 'mapBumpAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapNormal':\r\n\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapNormalFactor':\r\n\t\t\t\t\t\tjson.normalScale = [ value, value ];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapNormalRepeat':\r\n\t\t\t\t\tcase 'mapNormalOffset':\r\n\t\t\t\t\tcase 'mapNormalWrap':\r\n\t\t\t\t\tcase 'mapNormalAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapSpecular':\r\n\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapSpecularRepeat':\r\n\t\t\t\t\tcase 'mapSpecularOffset':\r\n\t\t\t\t\tcase 'mapSpecularWrap':\r\n\t\t\t\t\tcase 'mapSpecularAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapAlpha':\r\n\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mapAlphaRepeat':\r\n\t\t\t\t\tcase 'mapAlphaOffset':\r\n\t\t\t\t\tcase 'mapAlphaWrap':\r\n\t\t\t\t\tcase 'mapAlphaAnisotropy':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'flipSided':\r\n\t\t\t\t\t\tjson.side = THREE.BackSide;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'doubleSided':\r\n\t\t\t\t\t\tjson.side = THREE.DoubleSide;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'transparency':\r\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\r\n\t\t\t\t\t\tjson.opacity = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'depthTest':\r\n\t\t\t\t\tcase 'depthWrite':\r\n\t\t\t\t\tcase 'colorWrite':\r\n\t\t\t\t\tcase 'opacity':\r\n\t\t\t\t\tcase 'reflectivity':\r\n\t\t\t\t\tcase 'transparent':\r\n\t\t\t\t\tcase 'visible':\r\n\t\t\t\t\tcase 'wireframe':\r\n\t\t\t\t\t\tjson[ name ] = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'vertexColors':\r\n\t\t\t\t\t\tif ( value === true ) json.vertexColors = THREE.VertexColors;\r\n\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = THREE.FaceColors;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\r\n\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\r\n\r\n\t\t\tif ( json.opacity < 1 ) json.transparent = true;\r\n\r\n\t\t\tmaterialLoader.setTextures( textures );\r\n\r\n\t\t\treturn materialLoader.parse( json );\r\n\r\n\t\t};\r\n\r\n\t} )()\r\n\r\n};\r\n\r\nTHREE.Loader.Handlers = {\r\n\r\n\thandlers: [],\r\n\r\n\tadd: function ( regex, loader ) {\r\n\r\n\t\tthis.handlers.push( regex, loader );\r\n\r\n\t},\r\n\r\n\tget: function ( file ) {\r\n\r\n\t\tvar handlers = this.handlers;\r\n\r\n\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\r\n\r\n\t\t\tvar regex = handlers[ i ];\r\n\t\t\tvar loader = handlers[ i + 1 ];\r\n\r\n\t\t\tif ( regex.test( file ) ) {\r\n\r\n\t\t\t\treturn loader;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/XHRLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.XHRLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.XHRLoader.prototype = {\r\n\r\n\tconstructor: THREE.XHRLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tif ( this.path !== undefined ) url = this.path + url;\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar cached = THREE.Cache.get( url );\r\n\r\n\t\tif ( cached !== undefined ) {\r\n\r\n\t\t\tif ( onLoad ) {\r\n\r\n\t\t\t\tsetTimeout( function () {\r\n\r\n\t\t\t\t\tonLoad( cached );\r\n\r\n\t\t\t\t}, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn cached;\r\n\r\n\t\t}\r\n\r\n\t\tvar request = new XMLHttpRequest();\r\n\t\trequest.overrideMimeType( 'text/plain' );\r\n\t\trequest.open( 'GET', url, true );\r\n\r\n\t\trequest.addEventListener( 'load', function ( event ) {\r\n\r\n\t\t\tvar response = event.target.response;\r\n\r\n\t\t\tTHREE.Cache.add( url, response );\r\n\r\n\t\t\tif ( this.status === 200 ) {\r\n\r\n\t\t\t\tif ( onLoad ) onLoad( response );\r\n\r\n\t\t\t\tscope.manager.itemEnd( url );\r\n\r\n\t\t\t} else if ( this.status === 0 ) {\r\n\r\n\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\r\n\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\r\n\r\n\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\r\n\r\n\t\t\t\tif ( onLoad ) onLoad( response );\r\n\r\n\t\t\t\tscope.manager.itemEnd( url );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( onError ) onError( event );\r\n\r\n\t\t\t\tscope.manager.itemError( url );\r\n\r\n\t\t\t}\r\n\r\n\t\t}, false );\r\n\r\n\t\tif ( onProgress !== undefined ) {\r\n\r\n\t\t\trequest.addEventListener( 'progress', function ( event ) {\r\n\r\n\t\t\t\tonProgress( event );\r\n\r\n\t\t\t}, false );\r\n\r\n\t\t}\r\n\r\n\t\trequest.addEventListener( 'error', function ( event ) {\r\n\r\n\t\t\tif ( onError ) onError( event );\r\n\r\n\t\t\tscope.manager.itemError( url );\r\n\r\n\t\t}, false );\r\n\r\n\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\r\n\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\r\n\r\n\t\trequest.send( null );\r\n\r\n\t\tscope.manager.itemStart( url );\r\n\r\n\t\treturn request;\r\n\r\n\t},\r\n\r\n\tsetPath: function ( value ) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t},\r\n\r\n\tsetResponseType: function ( value ) {\r\n\r\n\t\tthis.responseType = value;\r\n\r\n\t},\r\n\r\n\tsetWithCredentials: function ( value ) {\r\n\r\n\t\tthis.withCredentials = value;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/FontLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.FontLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.FontLoader.prototype = {\r\n\r\n\tconstructor: THREE.FontLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar loader = new THREE.XHRLoader( this.manager );\r\n\t\tloader.load( url, function ( text ) {\r\n\r\n\t\t\tonLoad( new THREE.Font( JSON.parse( text.substring( 65, text.length - 2 ) ) ) );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/ImageLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.ImageLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.ImageLoader.prototype = {\r\n\r\n\tconstructor: THREE.ImageLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tif ( this.path !== undefined ) url = this.path + url;\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar cached = THREE.Cache.get( url );\r\n\r\n\t\tif ( cached !== undefined ) {\r\n\r\n\t\t\tscope.manager.itemStart( url );\r\n\r\n\t\t\tif ( onLoad ) {\r\n\r\n\t\t\t\tsetTimeout( function () {\r\n\r\n\t\t\t\t\tonLoad( cached );\r\n\r\n\t\t\t\t\tscope.manager.itemEnd( url );\r\n\r\n\t\t\t\t}, 0 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tscope.manager.itemEnd( url );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn cached;\r\n\r\n\t\t}\r\n\r\n\t\tvar image = document.createElement( 'img' );\r\n\r\n\t\timage.addEventListener( 'load', function ( event ) {\r\n\r\n\t\t\tTHREE.Cache.add( url, this );\r\n\r\n\t\t\tif ( onLoad ) onLoad( this );\r\n\r\n\t\t\tscope.manager.itemEnd( url );\r\n\r\n\t\t}, false );\r\n\r\n\t\tif ( onProgress !== undefined ) {\r\n\r\n\t\t\timage.addEventListener( 'progress', function ( event ) {\r\n\r\n\t\t\t\tonProgress( event );\r\n\r\n\t\t\t}, false );\r\n\r\n\t\t}\r\n\r\n\t\timage.addEventListener( 'error', function ( event ) {\r\n\r\n\t\t\tif ( onError ) onError( event );\r\n\r\n\t\t\tscope.manager.itemError( url );\r\n\r\n\t\t}, false );\r\n\r\n\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\r\n\r\n\t\tscope.manager.itemStart( url );\r\n\r\n\t\timage.src = url;\r\n\r\n\t\treturn image;\r\n\r\n\t},\r\n\r\n\tsetCrossOrigin: function ( value ) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t},\r\n\r\n\tsetPath: function ( value ) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/JSONLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.JSONLoader = function ( manager ) {\r\n\r\n\tif ( typeof manager === 'boolean' ) {\r\n\r\n\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\r\n\t\tmanager = undefined;\r\n\r\n\t}\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\tthis.withCredentials = false;\r\n\r\n};\r\n\r\nTHREE.JSONLoader.prototype = {\r\n\r\n\tconstructor: THREE.JSONLoader,\r\n\r\n\t// Deprecated\r\n\r\n\tget statusDomElement () {\r\n\r\n\t\tif ( this._statusDomElement === undefined ) {\r\n\r\n\t\t\tthis._statusDomElement = document.createElement( 'div' );\r\n\r\n\t\t}\r\n\r\n\t\tconsole.warn( 'THREE.JSONLoader: .statusDomElement has been removed.' );\r\n\t\treturn this._statusDomElement;\r\n\r\n\t},\r\n\r\n\tload: function( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : THREE.Loader.prototype.extractUrlBase( url );\r\n\r\n\t\tvar loader = new THREE.XHRLoader( this.manager );\r\n\t\tloader.setWithCredentials( this.withCredentials );\r\n\t\tloader.load( url, function ( text ) {\r\n\r\n\t\t\tvar json = JSON.parse( text );\r\n\t\t\tvar metadata = json.metadata;\r\n\r\n\t\t\tif ( metadata !== undefined ) {\r\n\r\n\t\t\t\tvar type = metadata.type;\r\n\r\n\t\t\t\tif ( type !== undefined ) {\r\n\r\n\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\r\n\r\n\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\r\n\r\n\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar object = scope.parse( json, texturePath );\r\n\t\t\tonLoad( object.geometry, object.materials );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t},\r\n\r\n\tsetTexturePath: function ( value ) {\r\n\r\n\t\tthis.texturePath = value;\r\n\r\n\t},\r\n\r\n\tparse: function ( json, texturePath ) {\r\n\r\n\t\tvar geometry = new THREE.Geometry(),\r\n\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\r\n\r\n\t\tparseModel( scale );\r\n\r\n\t\tparseSkin();\r\n\t\tparseMorphing( scale );\r\n\t\tparseAnimations();\r\n\r\n\t\tgeometry.computeFaceNormals();\r\n\t\tgeometry.computeBoundingSphere();\r\n\r\n\t\tfunction parseModel( scale ) {\r\n\r\n\t\t\tfunction isBitSet( value, position ) {\r\n\r\n\t\t\t\treturn value & ( 1 << position );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar i, j, fi,\r\n\r\n\t\t\toffset, zLength,\r\n\r\n\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\r\n\r\n\t\t\ttype,\r\n\t\t\tisQuad,\r\n\t\t\thasMaterial,\r\n\t\t\thasFaceVertexUv,\r\n\t\t\thasFaceNormal, hasFaceVertexNormal,\r\n\t\t\thasFaceColor, hasFaceVertexColor,\r\n\r\n\t\tvertex, face, faceA, faceB, hex, normal,\r\n\r\n\t\t\tuvLayer, uv, u, v,\r\n\r\n\t\t\tfaces = json.faces,\r\n\t\t\tvertices = json.vertices,\r\n\t\t\tnormals = json.normals,\r\n\t\t\tcolors = json.colors,\r\n\r\n\t\t\tnUvLayers = 0;\r\n\r\n\t\t\tif ( json.uvs !== undefined ) {\r\n\r\n\t\t\t\t// disregard empty arrays\r\n\r\n\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\r\n\r\n\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\r\n\r\n\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\toffset = 0;\r\n\t\t\tzLength = vertices.length;\r\n\r\n\t\t\twhile ( offset < zLength ) {\r\n\r\n\t\t\t\tvertex = new THREE.Vector3();\r\n\r\n\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\r\n\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\r\n\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\r\n\r\n\t\t\t\tgeometry.vertices.push( vertex );\r\n\r\n\t\t\t}\r\n\r\n\t\t\toffset = 0;\r\n\t\t\tzLength = faces.length;\r\n\r\n\t\t\twhile ( offset < zLength ) {\r\n\r\n\t\t\t\ttype = faces[ offset ++ ];\r\n\r\n\r\n\t\t\t\tisQuad = isBitSet( type, 0 );\r\n\t\t\t\thasMaterial = isBitSet( type, 1 );\r\n\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\r\n\t\t\t\thasFaceNormal = isBitSet( type, 4 );\r\n\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\r\n\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\r\n\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\r\n\r\n\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\r\n\r\n\t\t\t\tif ( isQuad ) {\r\n\r\n\t\t\t\t\tfaceA = new THREE.Face3();\r\n\t\t\t\t\tfaceA.a = faces[ offset ];\r\n\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\r\n\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\r\n\r\n\t\t\t\t\tfaceB = new THREE.Face3();\r\n\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\r\n\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\r\n\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\r\n\r\n\t\t\t\t\toffset += 4;\r\n\r\n\t\t\t\t\tif ( hasMaterial ) {\r\n\r\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\r\n\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\r\n\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// to get face <=> uv index correspondence\r\n\r\n\t\t\t\t\tfi = geometry.faces.length;\r\n\r\n\t\t\t\t\tif ( hasFaceVertexUv ) {\r\n\r\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\r\n\r\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\r\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\r\n\r\n\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\r\n\r\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\r\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\r\n\r\n\t\t\t\t\t\t\t\tuv = new THREE.Vector2( u, v );\r\n\r\n\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\r\n\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( hasFaceNormal ) {\r\n\r\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\r\n\r\n\t\t\t\t\t\tfaceA.normal.set(\r\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\tnormals[ normalIndex ]\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\r\n\r\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\r\n\r\n\t\t\t\t\t\t\tnormal = new THREE.Vector3(\r\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\r\n\t\t\t\t\t\t\t);\r\n\r\n\r\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\r\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif ( hasFaceColor ) {\r\n\r\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\r\n\t\t\t\t\t\thex = colors[ colorIndex ];\r\n\r\n\t\t\t\t\t\tfaceA.color.setHex( hex );\r\n\t\t\t\t\t\tfaceB.color.setHex( hex );\r\n\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif ( hasFaceVertexColor ) {\r\n\r\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\r\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\r\n\r\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new THREE.Color( hex ) );\r\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new THREE.Color( hex ) );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tgeometry.faces.push( faceA );\r\n\t\t\t\t\tgeometry.faces.push( faceB );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tface = new THREE.Face3();\r\n\t\t\t\t\tface.a = faces[ offset ++ ];\r\n\t\t\t\t\tface.b = faces[ offset ++ ];\r\n\t\t\t\t\tface.c = faces[ offset ++ ];\r\n\r\n\t\t\t\t\tif ( hasMaterial ) {\r\n\r\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\r\n\t\t\t\t\t\tface.materialIndex = materialIndex;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// to get face <=> uv index correspondence\r\n\r\n\t\t\t\t\tfi = geometry.faces.length;\r\n\r\n\t\t\t\t\tif ( hasFaceVertexUv ) {\r\n\r\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\r\n\r\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\r\n\r\n\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\r\n\r\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\r\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\r\n\r\n\t\t\t\t\t\t\t\tuv = new THREE.Vector2( u, v );\r\n\r\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( hasFaceNormal ) {\r\n\r\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\r\n\r\n\t\t\t\t\t\tface.normal.set(\r\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\tnormals[ normalIndex ]\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\r\n\r\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\r\n\r\n\t\t\t\t\t\t\tnormal = new THREE.Vector3(\r\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\r\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\tface.vertexNormals.push( normal );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif ( hasFaceColor ) {\r\n\r\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\r\n\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\r\n\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif ( hasFaceVertexColor ) {\r\n\r\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\r\n\t\t\t\t\t\t\tface.vertexColors.push( new THREE.Color( colors[ colorIndex ] ) );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tgeometry.faces.push( face );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tfunction parseSkin() {\r\n\r\n\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\r\n\r\n\t\t\tif ( json.skinWeights ) {\r\n\r\n\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\r\n\r\n\t\t\t\t\tvar x = json.skinWeights[ i ];\r\n\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\r\n\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\r\n\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\r\n\r\n\t\t\t\t\tgeometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( json.skinIndices ) {\r\n\r\n\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\r\n\r\n\t\t\t\t\tvar a = json.skinIndices[ i ];\r\n\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\r\n\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\r\n\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\r\n\r\n\t\t\t\t\tgeometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.bones = json.bones;\r\n\r\n\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\r\n\r\n\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\r\n\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tfunction parseMorphing( scale ) {\r\n\r\n\t\t\tif ( json.morphTargets !== undefined ) {\r\n\r\n\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\r\n\r\n\t\t\t\t\tgeometry.morphTargets[ i ] = {};\r\n\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\r\n\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\r\n\r\n\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\r\n\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\r\n\r\n\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\r\n\r\n\t\t\t\t\t\tvar vertex = new THREE.Vector3();\r\n\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\r\n\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\r\n\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\r\n\r\n\t\t\t\t\t\tdstVertices.push( vertex );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\r\n\r\n\t\t\t\tvar faces = geometry.faces;\r\n\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\r\n\r\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction parseAnimations() {\r\n\r\n\t\t\tvar outputAnimations = [];\r\n\r\n\t\t\t// parse old style Bone/Hierarchy animations\r\n\t\t\tvar animations = [];\r\n\r\n\t\t\tif ( json.animation !== undefined ) {\r\n\r\n\t\t\t\tanimations.push( json.animation );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( json.animations !== undefined ) {\r\n\r\n\t\t\t\tif ( json.animations.length ) {\r\n\r\n\t\t\t\t\tanimations = animations.concat( json.animations );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tanimations.push( json.animations );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\r\n\r\n\t\t\t\tvar clip = THREE.AnimationClip.parseAnimation( animations[ i ], geometry.bones );\r\n\t\t\t\tif ( clip ) outputAnimations.push( clip );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// parse implicit morph animations\r\n\t\t\tif ( geometry.morphTargets ) {\r\n\r\n\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\r\n\t\t\t\tvar morphAnimationClips = THREE.AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\r\n\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\r\n\r\n\t\t};\r\n\r\n\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\r\n\r\n\t\t\treturn { geometry: geometry };\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar materials = THREE.Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\r\n\r\n\t\t\treturn { geometry: geometry, materials: materials };\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/LoadingManager.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.LoadingManager = function ( onLoad, onProgress, onError ) {\r\n\r\n\tvar scope = this;\r\n\r\n\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\r\n\r\n\tthis.onStart = undefined;\r\n\tthis.onLoad = onLoad;\r\n\tthis.onProgress = onProgress;\r\n\tthis.onError = onError;\r\n\r\n\tthis.itemStart = function ( url ) {\r\n\r\n\t\titemsTotal ++;\r\n\r\n\t\tif ( isLoading === false ) {\r\n\r\n\t\t\tif ( scope.onStart !== undefined ) {\r\n\r\n\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tisLoading = true;\r\n\r\n\t};\r\n\r\n\tthis.itemEnd = function ( url ) {\r\n\r\n\t\titemsLoaded ++;\r\n\r\n\t\tif ( scope.onProgress !== undefined ) {\r\n\r\n\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\r\n\r\n\t\t}\r\n\r\n\t\tif ( itemsLoaded === itemsTotal ) {\r\n\r\n\t\t\tisLoading = false;\r\n\r\n\t\t\tif ( scope.onLoad !== undefined ) {\r\n\r\n\t\t\t\tscope.onLoad();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.itemError = function ( url ) {\r\n\r\n\t\tif ( scope.onError !== undefined ) {\r\n\r\n\t\t\tscope.onError( url );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.DefaultLoadingManager = new THREE.LoadingManager();\r\n\r\n// File:src/loaders/BufferGeometryLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.BufferGeometryLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.BufferGeometryLoader.prototype = {\r\n\r\n\tconstructor: THREE.BufferGeometryLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\r\n\t\tloader.load( url, function ( text ) {\r\n\r\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t},\r\n\r\n\tparse: function ( json ) {\r\n\r\n\t\tvar geometry = new THREE.BufferGeometry();\r\n\r\n\t\tvar index = json.data.index;\r\n\r\n\t\tvar TYPED_ARRAYS = {\r\n\t\t\t'Int8Array': Int8Array,\r\n\t\t\t'Uint8Array': Uint8Array,\r\n\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\r\n\t\t\t'Int16Array': Int16Array,\r\n\t\t\t'Uint16Array': Uint16Array,\r\n\t\t\t'Int32Array': Int32Array,\r\n\t\t\t'Uint32Array': Uint32Array,\r\n\t\t\t'Float32Array': Float32Array,\r\n\t\t\t'Float64Array': Float64Array\r\n\t\t};\r\n\r\n\t\tif ( index !== undefined ) {\r\n\r\n\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\r\n\t\t\tgeometry.setIndex( new THREE.BufferAttribute( typedArray, 1 ) );\r\n\r\n\t\t}\r\n\r\n\t\tvar attributes = json.data.attributes;\r\n\r\n\t\tfor ( var key in attributes ) {\r\n\r\n\t\t\tvar attribute = attributes[ key ];\r\n\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\r\n\r\n\t\t\tgeometry.addAttribute( key, new THREE.BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\r\n\r\n\t\t}\r\n\r\n\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\r\n\r\n\t\tif ( groups !== undefined ) {\r\n\r\n\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar group = groups[ i ];\r\n\r\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar boundingSphere = json.data.boundingSphere;\r\n\r\n\t\tif ( boundingSphere !== undefined ) {\r\n\r\n\t\t\tvar center = new THREE.Vector3();\r\n\r\n\t\t\tif ( boundingSphere.center !== undefined ) {\r\n\r\n\t\t\t\tcenter.fromArray( boundingSphere.center );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.boundingSphere = new THREE.Sphere( center, boundingSphere.radius );\r\n\r\n\t\t}\r\n\r\n\t\treturn geometry;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/MaterialLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.MaterialLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\tthis.textures = {};\r\n\r\n};\r\n\r\nTHREE.MaterialLoader.prototype = {\r\n\r\n\tconstructor: THREE.MaterialLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\r\n\t\tloader.load( url, function ( text ) {\r\n\r\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t},\r\n\r\n\tsetTextures: function ( value ) {\r\n\r\n\t\tthis.textures = value;\r\n\r\n\t},\r\n\r\n\tgetTexture: function ( name ) {\r\n\r\n\t\tvar textures = this.textures;\r\n\r\n\t\tif ( textures[ name ] === undefined ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\r\n\r\n\t\t}\r\n\r\n\t\treturn textures[ name ];\r\n\r\n\t},\r\n\r\n\tparse: function ( json ) {\r\n\r\n\t\tvar material = new THREE[ json.type ];\r\n\r\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\r\n\t\tif ( json.name !== undefined ) material.name = json.name;\r\n\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\r\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\r\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\r\n\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\r\n\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\r\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\r\n\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\r\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\r\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\r\n\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\r\n\t\tif ( json.shading !== undefined ) material.shading = json.shading;\r\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\r\n\t\tif ( json.side !== undefined ) material.side = json.side;\r\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\r\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\r\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\r\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\r\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\r\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\r\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\r\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\r\n\r\n\t\t// for PointsMaterial\r\n\t\tif ( json.size !== undefined ) material.size = json.size;\r\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\r\n\r\n\t\t// maps\r\n\r\n\t\tif ( json.map !== undefined ) material.map = this.getTexture( json.map );\r\n\r\n\t\tif ( json.alphaMap !== undefined ) {\r\n\r\n\t\t\tmaterial.alphaMap = this.getTexture( json.alphaMap );\r\n\t\t\tmaterial.transparent = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = this.getTexture( json.bumpMap );\r\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\r\n\r\n\t\tif ( json.normalMap !== undefined ) material.normalMap = this.getTexture( json.normalMap );\r\n\t\tif ( json.normalScale !== undefined ) {\r\n\r\n\t\t\tvar normalScale = json.normalScale;\r\n\r\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\r\n\r\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\r\n\r\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tmaterial.normalScale = new THREE.Vector2().fromArray( normalScale );\r\n\r\n\t\t}\r\n\r\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = this.getTexture( json.displacementMap );\r\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\r\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\r\n\r\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = this.getTexture( json.roughnessMap );\r\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = this.getTexture( json.metalnessMap );\r\n\r\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = this.getTexture( json.emissiveMap );\r\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\r\n\r\n\t\tif ( json.specularMap !== undefined ) material.specularMap = this.getTexture( json.specularMap );\r\n\r\n\t\tif ( json.envMap !== undefined ) {\r\n\r\n\t\t\tmaterial.envMap = this.getTexture( json.envMap );\r\n\t\t\tmaterial.combine = THREE.MultiplyOperation;\r\n\r\n\t\t}\r\n\r\n\t\tif ( json.reflectivity ) material.reflectivity = json.reflectivity;\r\n\r\n\t\tif ( json.lightMap !== undefined ) material.lightMap = this.getTexture( json.lightMap );\r\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\r\n\r\n\t\tif ( json.aoMap !== undefined ) material.aoMap = this.getTexture( json.aoMap );\r\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\r\n\r\n\t\t// MultiMaterial\r\n\r\n\t\tif ( json.materials !== undefined ) {\r\n\r\n\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn material;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/ObjectLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.ObjectLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\tthis.texturePath = '';\r\n\r\n};\r\n\r\nTHREE.ObjectLoader.prototype = {\r\n\r\n\tconstructor: THREE.ObjectLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tif ( this.texturePath === '' ) {\r\n\r\n\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\r\n\r\n\t\t}\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\r\n\t\tloader.load( url, function ( text ) {\r\n\r\n\t\t\tscope.parse( JSON.parse( text ), onLoad );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t},\r\n\r\n\tsetTexturePath: function ( value ) {\r\n\r\n\t\tthis.texturePath = value;\r\n\r\n\t},\r\n\r\n\tsetCrossOrigin: function ( value ) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t},\r\n\r\n\tparse: function ( json, onLoad ) {\r\n\r\n\t\tvar geometries = this.parseGeometries( json.geometries );\r\n\r\n\t\tvar images = this.parseImages( json.images, function () {\r\n\r\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\r\n\r\n\t\t} );\r\n\r\n\t\tvar textures = this.parseTextures( json.textures, images );\r\n\t\tvar materials = this.parseMaterials( json.materials, textures );\r\n\r\n\t\tvar object = this.parseObject( json.object, geometries, materials );\r\n\r\n\t\tif ( json.animations ) {\r\n\r\n\t\t\tobject.animations = this.parseAnimations( json.animations );\r\n\r\n\t\t}\r\n\r\n\t\tif ( json.images === undefined || json.images.length === 0 ) {\r\n\r\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\r\n\r\n\t\t}\r\n\r\n\t\treturn object;\r\n\r\n\t},\r\n\r\n\tparseGeometries: function ( json ) {\r\n\r\n\t\tvar geometries = {};\r\n\r\n\t\tif ( json !== undefined ) {\r\n\r\n\t\t\tvar geometryLoader = new THREE.JSONLoader();\r\n\t\t\tvar bufferGeometryLoader = new THREE.BufferGeometryLoader();\r\n\r\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar geometry;\r\n\t\t\t\tvar data = json[ i ];\r\n\r\n\t\t\t\tswitch ( data.type ) {\r\n\r\n\t\t\t\t\tcase 'PlaneGeometry':\r\n\t\t\t\t\tcase 'PlaneBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.width,\r\n\t\t\t\t\t\t\tdata.height,\r\n\t\t\t\t\t\t\tdata.widthSegments,\r\n\t\t\t\t\t\t\tdata.heightSegments\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'BoxGeometry':\r\n\t\t\t\t\tcase 'BoxBufferGeometry':\r\n\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.width,\r\n\t\t\t\t\t\t\tdata.height,\r\n\t\t\t\t\t\t\tdata.depth,\r\n\t\t\t\t\t\t\tdata.widthSegments,\r\n\t\t\t\t\t\t\tdata.heightSegments,\r\n\t\t\t\t\t\t\tdata.depthSegments\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'CircleGeometry':\r\n\t\t\t\t\tcase 'CircleBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.segments,\r\n\t\t\t\t\t\t\tdata.thetaStart,\r\n\t\t\t\t\t\t\tdata.thetaLength\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'CylinderGeometry':\r\n\t\t\t\t\tcase 'CylinderBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.radiusTop,\r\n\t\t\t\t\t\t\tdata.radiusBottom,\r\n\t\t\t\t\t\t\tdata.height,\r\n\t\t\t\t\t\t\tdata.radialSegments,\r\n\t\t\t\t\t\t\tdata.heightSegments,\r\n\t\t\t\t\t\t\tdata.openEnded,\r\n\t\t\t\t\t\t\tdata.thetaStart,\r\n\t\t\t\t\t\t\tdata.thetaLength\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'SphereGeometry':\r\n\t\t\t\t\tcase 'SphereBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.widthSegments,\r\n\t\t\t\t\t\t\tdata.heightSegments,\r\n\t\t\t\t\t\t\tdata.phiStart,\r\n\t\t\t\t\t\t\tdata.phiLength,\r\n\t\t\t\t\t\t\tdata.thetaStart,\r\n\t\t\t\t\t\t\tdata.thetaLength\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'DodecahedronGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE.DodecahedronGeometry(\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.detail\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'IcosahedronGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE.IcosahedronGeometry(\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.detail\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'OctahedronGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE.OctahedronGeometry(\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.detail\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'TetrahedronGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE.TetrahedronGeometry(\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.detail\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'RingGeometry':\r\n\t\t\t\t\tcase 'RingBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.innerRadius,\r\n\t\t\t\t\t\t\tdata.outerRadius,\r\n\t\t\t\t\t\t\tdata.thetaSegments,\r\n\t\t\t\t\t\t\tdata.phiSegments,\r\n\t\t\t\t\t\t\tdata.thetaStart,\r\n\t\t\t\t\t\t\tdata.thetaLength\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'TorusGeometry':\r\n\t\t\t\t\tcase 'TorusBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.tube,\r\n\t\t\t\t\t\t\tdata.radialSegments,\r\n\t\t\t\t\t\t\tdata.tubularSegments,\r\n\t\t\t\t\t\t\tdata.arc\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'TorusKnotGeometry':\r\n\t\t\t\t\tcase 'TorusKnotBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.radius,\r\n\t\t\t\t\t\t\tdata.tube,\r\n\t\t\t\t\t\t\tdata.tubularSegments,\r\n\t\t\t\t\t\t\tdata.radialSegments,\r\n\t\t\t\t\t\t\tdata.p,\r\n\t\t\t\t\t\t\tdata.q\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'LatheGeometry':\r\n\t\t\t\t\tcase 'LatheBufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = new THREE[ data.type ](\r\n\t\t\t\t\t\t\tdata.points,\r\n\t\t\t\t\t\t\tdata.segments,\r\n\t\t\t\t\t\t\tdata.phiStart,\r\n\t\t\t\t\t\t\tdata.phiLength\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'BufferGeometry':\r\n\r\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'Geometry':\r\n\r\n\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tdefault:\r\n\r\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\r\n\r\n\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tgeometry.uuid = data.uuid;\r\n\r\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\r\n\r\n\t\t\t\tgeometries[ data.uuid ] = geometry;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn geometries;\r\n\r\n\t},\r\n\r\n\tparseMaterials: function ( json, textures ) {\r\n\r\n\t\tvar materials = {};\r\n\r\n\t\tif ( json !== undefined ) {\r\n\r\n\t\t\tvar loader = new THREE.MaterialLoader();\r\n\t\t\tloader.setTextures( textures );\r\n\r\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar material = loader.parse( json[ i ] );\r\n\t\t\t\tmaterials[ material.uuid ] = material;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn materials;\r\n\r\n\t},\r\n\r\n\tparseAnimations: function ( json ) {\r\n\r\n\t\tvar animations = [];\r\n\r\n\t\tfor ( var i = 0; i < json.length; i ++ ) {\r\n\r\n\t\t\tvar clip = THREE.AnimationClip.parse( json[ i ] );\r\n\r\n\t\t\tanimations.push( clip );\r\n\r\n\t\t}\r\n\r\n\t\treturn animations;\r\n\r\n\t},\r\n\r\n\tparseImages: function ( json, onLoad ) {\r\n\r\n\t\tvar scope = this;\r\n\t\tvar images = {};\r\n\r\n\t\tfunction loadImage( url ) {\r\n\r\n\t\t\tscope.manager.itemStart( url );\r\n\r\n\t\t\treturn loader.load( url, function () {\r\n\r\n\t\t\t\tscope.manager.itemEnd( url );\r\n\r\n\t\t\t} );\r\n\r\n\t\t}\r\n\r\n\t\tif ( json !== undefined && json.length > 0 ) {\r\n\r\n\t\t\tvar manager = new THREE.LoadingManager( onLoad );\r\n\r\n\t\t\tvar loader = new THREE.ImageLoader( manager );\r\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\r\n\r\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar image = json[ i ];\r\n\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\r\n\r\n\t\t\t\timages[ image.uuid ] = loadImage( path );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn images;\r\n\r\n\t},\r\n\r\n\tparseTextures: function ( json, images ) {\r\n\r\n\t\tfunction parseConstant( value ) {\r\n\r\n\t\t\tif ( typeof( value ) === 'number' ) return value;\r\n\r\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\r\n\r\n\t\t\treturn THREE[ value ];\r\n\r\n\t\t}\r\n\r\n\t\tvar textures = {};\r\n\r\n\t\tif ( json !== undefined ) {\r\n\r\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar data = json[ i ];\r\n\r\n\t\t\t\tif ( data.image === undefined ) {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( images[ data.image ] === undefined ) {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar texture = new THREE.Texture( images[ data.image ] );\r\n\t\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\t\ttexture.uuid = data.uuid;\r\n\r\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\r\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping );\r\n\t\t\t\tif ( data.offset !== undefined ) texture.offset = new THREE.Vector2( data.offset[ 0 ], data.offset[ 1 ] );\r\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat = new THREE.Vector2( data.repeat[ 0 ], data.repeat[ 1 ] );\r\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter );\r\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter );\r\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\r\n\t\t\t\tif ( Array.isArray( data.wrap ) ) {\r\n\r\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ] );\r\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttextures[ data.uuid ] = texture;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn textures;\r\n\r\n\t},\r\n\r\n\tparseObject: function () {\r\n\r\n\t\tvar matrix = new THREE.Matrix4();\r\n\r\n\t\treturn function ( data, geometries, materials ) {\r\n\r\n\t\t\tvar object;\r\n\r\n\t\t\tfunction getGeometry( name ) {\r\n\r\n\t\t\t\tif ( geometries[ name ] === undefined ) {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn geometries[ name ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfunction getMaterial( name ) {\r\n\r\n\t\t\t\tif ( name === undefined ) return undefined;\r\n\r\n\t\t\t\tif ( materials[ name ] === undefined ) {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn materials[ name ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tswitch ( data.type ) {\r\n\r\n\t\t\t\tcase 'Scene':\r\n\r\n\t\t\t\t\tobject = new THREE.Scene();\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'PerspectiveCamera':\r\n\r\n\t\t\t\t\tobject = new THREE.PerspectiveCamera(\r\n\t\t\t\t\t\t\tdata.fov, data.aspect, data.near, data.far );\r\n\r\n\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\r\n\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\r\n\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\r\n\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\r\n\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'OrthographicCamera':\r\n\r\n\t\t\t\t\tobject = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'AmbientLight':\r\n\r\n\t\t\t\t\tobject = new THREE.AmbientLight( data.color, data.intensity );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'DirectionalLight':\r\n\r\n\t\t\t\t\tobject = new THREE.DirectionalLight( data.color, data.intensity );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'PointLight':\r\n\r\n\t\t\t\t\tobject = new THREE.PointLight( data.color, data.intensity, data.distance, data.decay );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'SpotLight':\r\n\r\n\t\t\t\t\tobject = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'HemisphereLight':\r\n\r\n\t\t\t\t\tobject = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'Mesh':\r\n\r\n\t\t\t\t\tvar geometry = getGeometry( data.geometry );\r\n\t\t\t\t\tvar material = getMaterial( data.material );\r\n\r\n\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\r\n\r\n\t\t\t\t\t\tobject = new THREE.SkinnedMesh( geometry, material );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tobject = new THREE.Mesh( geometry, material );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'LOD':\r\n\r\n\t\t\t\t\tobject = new THREE.LOD();\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'Line':\r\n\r\n\t\t\t\t\tobject = new THREE.Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'PointCloud':\r\n\t\t\t\tcase 'Points':\r\n\r\n\t\t\t\t\tobject = new THREE.Points( getGeometry( data.geometry ), getMaterial( data.material ) );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'Sprite':\r\n\r\n\t\t\t\t\tobject = new THREE.Sprite( getMaterial( data.material ) );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'Group':\r\n\r\n\t\t\t\t\tobject = new THREE.Group();\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\r\n\t\t\t\t\tobject = new THREE.Object3D();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobject.uuid = data.uuid;\r\n\r\n\t\t\tif ( data.name !== undefined ) object.name = data.name;\r\n\t\t\tif ( data.matrix !== undefined ) {\r\n\r\n\t\t\t\tmatrix.fromArray( data.matrix );\r\n\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\r\n\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\r\n\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\r\n\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\r\n\r\n\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\r\n\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\r\n\r\n\t\t\tif ( data.children !== undefined ) {\r\n\r\n\t\t\t\tfor ( var child in data.children ) {\r\n\r\n\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( data.type === 'LOD' ) {\r\n\r\n\t\t\t\tvar levels = data.levels;\r\n\r\n\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\r\n\r\n\t\t\t\t\tvar level = levels[ l ];\r\n\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\r\n\r\n\t\t\t\t\tif ( child !== undefined ) {\r\n\r\n\t\t\t\t\t\tobject.addLevel( child, level.distance );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn object;\r\n\r\n\t\t};\r\n\r\n\t}()\r\n\r\n};\r\n\r\n// File:src/loaders/TextureLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.TextureLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.TextureLoader.prototype = {\r\n\r\n\tconstructor: THREE.TextureLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar texture = new THREE.Texture();\r\n\r\n\t\tvar loader = new THREE.ImageLoader( this.manager );\r\n\t\tloader.setCrossOrigin( this.crossOrigin );\r\n\t\tloader.setPath( this.path );\r\n\t\tloader.load( url, function ( image ) {\r\n\r\n\t\t\ttexture.image = image;\r\n\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\tif ( onLoad !== undefined ) {\r\n\r\n\t\t\t\tonLoad( texture );\r\n\r\n\t\t\t}\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tsetCrossOrigin: function ( value ) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t},\r\n\r\n\tsetPath: function ( value ) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/CubeTextureLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.CubeTextureLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.CubeTextureLoader.prototype = {\r\n\r\n\tconstructor: THREE.CubeTextureLoader,\r\n\r\n\tload: function ( urls, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar texture = new THREE.CubeTexture();\r\n\r\n\t\tvar loader = new THREE.ImageLoader( this.manager );\r\n\t\tloader.setCrossOrigin( this.crossOrigin );\r\n\t\tloader.setPath( this.path );\r\n\r\n\t\tvar loaded = 0;\r\n\r\n\t\tfunction loadTexture( i ) {\r\n\r\n\t\t\tloader.load( urls[ i ], function ( image ) {\r\n\r\n\t\t\t\ttexture.images[ i ] = image;\r\n\r\n\t\t\t\tloaded ++;\r\n\r\n\t\t\t\tif ( loaded === 6 ) {\r\n\r\n\t\t\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, undefined, onError );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0; i < urls.length; ++ i ) {\r\n\r\n\t\t\tloadTexture( i );\r\n\r\n\t\t}\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tsetCrossOrigin: function ( value ) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t},\r\n\r\n\tsetPath: function ( value ) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/BinaryTextureLoader.js\r\n\r\n/**\r\n * @author Nikos M. / https://github.com/foo123/\r\n *\r\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\r\n */\r\n\r\nTHREE.DataTextureLoader = THREE.BinaryTextureLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\t// override in sub classes\r\n\tthis._parser = null;\r\n\r\n};\r\n\r\nTHREE.BinaryTextureLoader.prototype = {\r\n\r\n\tconstructor: THREE.BinaryTextureLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar texture = new THREE.DataTexture();\r\n\r\n\t\tvar loader = new THREE.XHRLoader( this.manager );\r\n\t\tloader.setResponseType( 'arraybuffer' );\r\n\r\n\t\tloader.load( url, function ( buffer ) {\r\n\r\n\t\t\tvar texData = scope._parser( buffer );\r\n\r\n\t\t\tif ( ! texData ) return;\r\n\r\n\t\t\tif ( undefined !== texData.image ) {\r\n\r\n\t\t\t\ttexture.image = texData.image;\r\n\r\n\t\t\t} else if ( undefined !== texData.data ) {\r\n\r\n\t\t\t\ttexture.image.width = texData.width;\r\n\t\t\t\ttexture.image.height = texData.height;\r\n\t\t\t\ttexture.image.data = texData.data;\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : THREE.ClampToEdgeWrapping;\r\n\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : THREE.ClampToEdgeWrapping;\r\n\r\n\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : THREE.LinearFilter;\r\n\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : THREE.LinearMipMapLinearFilter;\r\n\r\n\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\r\n\r\n\t\t\tif ( undefined !== texData.format ) {\r\n\r\n\t\t\t\ttexture.format = texData.format;\r\n\r\n\t\t\t}\r\n\t\t\tif ( undefined !== texData.type ) {\r\n\r\n\t\t\t\ttexture.type = texData.type;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( undefined !== texData.mipmaps ) {\r\n\r\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( 1 === texData.mipmapCount ) {\r\n\r\n\t\t\t\ttexture.minFilter = THREE.LinearFilter;\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\tif ( onLoad ) onLoad( texture, texData );\r\n\r\n\t\t}, onProgress, onError );\r\n\r\n\r\n\t\treturn texture;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/loaders/CompressedTextureLoader.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n *\r\n * Abstract Base class to block based textures loader (dds, pvr, ...)\r\n */\r\n\r\nTHREE.CompressedTextureLoader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\t// override in sub classes\r\n\tthis._parser = null;\r\n\r\n};\r\n\r\n\r\nTHREE.CompressedTextureLoader.prototype = {\r\n\r\n\tconstructor: THREE.CompressedTextureLoader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar images = [];\r\n\r\n\t\tvar texture = new THREE.CompressedTexture();\r\n\t\ttexture.image = images;\r\n\r\n\t\tvar loader = new THREE.XHRLoader( this.manager );\r\n\t\tloader.setPath( this.path );\r\n\t\tloader.setResponseType( 'arraybuffer' );\r\n\r\n\t\tfunction loadTexture( i ) {\r\n\r\n\t\t\tloader.load( url[ i ], function ( buffer ) {\r\n\r\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\r\n\r\n\t\t\t\timages[ i ] = {\r\n\t\t\t\t\twidth: texDatas.width,\r\n\t\t\t\t\theight: texDatas.height,\r\n\t\t\t\t\tformat: texDatas.format,\r\n\t\t\t\t\tmipmaps: texDatas.mipmaps\r\n\t\t\t\t};\r\n\r\n\t\t\t\tloaded += 1;\r\n\r\n\t\t\t\tif ( loaded === 6 ) {\r\n\r\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\r\n\t\t\t\t\t\ttexture.minFilter = THREE.LinearFilter;\r\n\r\n\t\t\t\t\ttexture.format = texDatas.format;\r\n\t\t\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, onProgress, onError );\r\n\r\n\t\t}\r\n\r\n\t\tif ( Array.isArray( url ) ) {\r\n\r\n\t\t\tvar loaded = 0;\r\n\r\n\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\r\n\r\n\t\t\t\tloadTexture( i );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// compressed cubemap texture stored in a single DDS file\r\n\r\n\t\t\tloader.load( url, function ( buffer ) {\r\n\r\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\r\n\r\n\t\t\t\tif ( texDatas.isCubemap ) {\r\n\r\n\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\r\n\r\n\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\r\n\r\n\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\r\n\r\n\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\r\n\r\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\r\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\r\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\r\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttexture.image.width = texDatas.width;\r\n\t\t\t\t\ttexture.image.height = texDatas.height;\r\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\r\n\r\n\t\t\t\t\ttexture.minFilter = THREE.LinearFilter;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttexture.format = texDatas.format;\r\n\t\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t\t}, onProgress, onError );\r\n\r\n\t\t}\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tsetPath: function ( value ) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/materials/Material.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Material = function () {\r\n\r\n\tObject.defineProperty( this, 'id', { value: THREE.MaterialIdCount ++ } );\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.name = '';\r\n\tthis.type = 'Material';\r\n\r\n\tthis.side = THREE.FrontSide;\r\n\r\n\tthis.opacity = 1;\r\n\tthis.transparent = false;\r\n\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.blendSrc = THREE.SrcAlphaFactor;\r\n\tthis.blendDst = THREE.OneMinusSrcAlphaFactor;\r\n\tthis.blendEquation = THREE.AddEquation;\r\n\tthis.blendSrcAlpha = null;\r\n\tthis.blendDstAlpha = null;\r\n\tthis.blendEquationAlpha = null;\r\n\r\n\tthis.depthFunc = THREE.LessEqualDepth;\r\n\tthis.depthTest = true;\r\n\tthis.depthWrite = true;\r\n\r\n\tthis.clippingPlanes = null;\r\n\tthis.clipShadows = false;\r\n\r\n\tthis.colorWrite = true;\r\n\r\n\tthis.precision = null; // override the renderer's default precision for this material\r\n\r\n\tthis.polygonOffset = false;\r\n\tthis.polygonOffsetFactor = 0;\r\n\tthis.polygonOffsetUnits = 0;\r\n\r\n\tthis.alphaTest = 0;\r\n\tthis.premultipliedAlpha = false;\r\n\r\n\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\r\n\r\n\tthis.visible = true;\r\n\r\n\tthis._needsUpdate = true;\r\n\r\n};\r\n\r\nTHREE.Material.prototype = {\r\n\r\n\tconstructor: THREE.Material,\r\n\r\n\tget needsUpdate () {\r\n\r\n\t\treturn this._needsUpdate;\r\n\r\n\t},\r\n\r\n\tset needsUpdate ( value ) {\r\n\r\n\t\tif ( value === true ) this.update();\r\n\r\n\t\tthis._needsUpdate = value;\r\n\r\n\t},\r\n\r\n\tsetValues: function ( values ) {\r\n\r\n\t\tif ( values === undefined ) return;\r\n\r\n\t\tfor ( var key in values ) {\r\n\r\n\t\t\tvar newValue = values[ key ];\r\n\r\n\t\t\tif ( newValue === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar currentValue = this[ key ];\r\n\r\n\t\t\tif ( currentValue === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( currentValue instanceof THREE.Color ) {\r\n\r\n\t\t\t\tcurrentValue.set( newValue );\r\n\r\n\t\t\t} else if ( currentValue instanceof THREE.Vector3 && newValue instanceof THREE.Vector3 ) {\r\n\r\n\t\t\t\tcurrentValue.copy( newValue );\r\n\r\n\t\t\t} else if ( key === 'overdraw' ) {\r\n\r\n\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\r\n\t\t\t\tthis[ key ] = Number( newValue );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis[ key ] = newValue;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttoJSON: function ( meta ) {\r\n\r\n\t\tvar isRoot = meta === undefined;\r\n\r\n\t\tif ( isRoot ) {\r\n\r\n\t\t\tmeta = {\r\n\t\t\t\ttextures: {},\r\n\t\t\t\timages: {}\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tmetadata: {\r\n\t\t\t\tversion: 4.4,\r\n\t\t\t\ttype: 'Material',\r\n\t\t\t\tgenerator: 'Material.toJSON'\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// standard Material serialization\r\n\t\tdata.uuid = this.uuid;\r\n\t\tdata.type = this.type;\r\n\t\tif ( this.name !== '' ) data.name = this.name;\r\n\r\n\t\tif ( this.color instanceof THREE.Color ) data.color = this.color.getHex();\r\n\r\n\t\tif ( this.roughness !== 0.5 ) data.roughness = this.roughness;\r\n\t\tif ( this.metalness !== 0.5 ) data.metalness = this.metalness;\r\n\r\n\t\tif ( this.emissive instanceof THREE.Color ) data.emissive = this.emissive.getHex();\r\n\t\tif ( this.specular instanceof THREE.Color ) data.specular = this.specular.getHex();\r\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\r\n\r\n\t\tif ( this.map instanceof THREE.Texture ) data.map = this.map.toJSON( meta ).uuid;\r\n\t\tif ( this.alphaMap instanceof THREE.Texture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\r\n\t\tif ( this.lightMap instanceof THREE.Texture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\r\n\t\tif ( this.bumpMap instanceof THREE.Texture ) {\r\n\r\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\r\n\t\t\tdata.bumpScale = this.bumpScale;\r\n\r\n\t\t}\r\n\t\tif ( this.normalMap instanceof THREE.Texture ) {\r\n\r\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\r\n\t\t\tdata.normalScale = this.normalScale.toArray();\r\n\r\n\t\t}\r\n\t\tif ( this.displacementMap instanceof THREE.Texture ) {\r\n\r\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\r\n\t\t\tdata.displacementScale = this.displacementScale;\r\n\t\t\tdata.displacementBias = this.displacementBias;\r\n\r\n\t\t}\r\n\t\tif ( this.roughnessMap instanceof THREE.Texture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\r\n\t\tif ( this.metalnessMap instanceof THREE.Texture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\r\n\r\n\t\tif ( this.emissiveMap instanceof THREE.Texture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\r\n\t\tif ( this.specularMap instanceof THREE.Texture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\r\n\r\n\t\tif ( this.envMap instanceof THREE.Texture ) {\r\n\r\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\r\n\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.size !== undefined ) data.size = this.size;\r\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\r\n\r\n\t\tif ( this.vertexColors !== undefined && this.vertexColors !== THREE.NoColors ) data.vertexColors = this.vertexColors;\r\n\t\tif ( this.shading !== undefined && this.shading !== THREE.SmoothShading ) data.shading = this.shading;\r\n\t\tif ( this.blending !== undefined && this.blending !== THREE.NormalBlending ) data.blending = this.blending;\r\n\t\tif ( this.side !== undefined && this.side !== THREE.FrontSide ) data.side = this.side;\r\n\r\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\r\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\r\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\r\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\r\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\r\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\r\n\r\n\t\t// TODO: Copied from Object3D.toJSON\r\n\r\n\t\tfunction extractFromCache ( cache ) {\r\n\r\n\t\t\tvar values = [];\r\n\r\n\t\t\tfor ( var key in cache ) {\r\n\r\n\t\t\t\tvar data = cache[ key ];\r\n\t\t\t\tdelete data.metadata;\r\n\t\t\t\tvalues.push( data );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn values;\r\n\r\n\t\t}\r\n\r\n\t\tif ( isRoot ) {\r\n\r\n\t\t\tvar textures = extractFromCache( meta.textures );\r\n\t\t\tvar images = extractFromCache( meta.images );\r\n\r\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\r\n\t\t\tif ( images.length > 0 ) data.images = images;\r\n\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.name = source.name;\r\n\r\n\t\tthis.side = source.side;\r\n\r\n\t\tthis.opacity = source.opacity;\r\n\t\tthis.transparent = source.transparent;\r\n\r\n\t\tthis.blending = source.blending;\r\n\r\n\t\tthis.blendSrc = source.blendSrc;\r\n\t\tthis.blendDst = source.blendDst;\r\n\t\tthis.blendEquation = source.blendEquation;\r\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\r\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\r\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\r\n\r\n\t\tthis.depthFunc = source.depthFunc;\r\n\t\tthis.depthTest = source.depthTest;\r\n\t\tthis.depthWrite = source.depthWrite;\r\n\r\n\t\tthis.colorWrite = source.colorWrite;\r\n\r\n\t\tthis.precision = source.precision;\r\n\r\n\t\tthis.polygonOffset = source.polygonOffset;\r\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\r\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\r\n\r\n\t\tthis.alphaTest = source.alphaTest;\r\n\r\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\r\n\r\n\t\tthis.overdraw = source.overdraw;\r\n\r\n\t\tthis.visible = source.visible;\r\n\t\tthis.clipShadows = source.clipShadows;\r\n\r\n\t\tvar srcPlanes = source.clippingPlanes,\r\n\t\t\tdstPlanes = null;\r\n\r\n\t\tif ( srcPlanes !== null ) {\r\n\r\n\t\t\tvar n = srcPlanes.length;\r\n\t\t\tdstPlanes = new Array( n );\r\n\r\n\t\t\tfor ( var i = 0; i !== n; ++ i )\r\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\r\n\r\n\t\t}\r\n\r\n\t\tthis.clippingPlanes = dstPlanes;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'update' } );\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.Material.prototype );\r\n\r\nTHREE.MaterialIdCount = 0;\r\n\r\n// File:src/materials/LineBasicMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n *\r\n * linewidth: ,\r\n * linecap: \"round\",\r\n * linejoin: \"round\",\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * vertexColors: \r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.LineBasicMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'LineBasicMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\r\n\tthis.linewidth = 1;\r\n\tthis.linecap = 'round';\r\n\tthis.linejoin = 'round';\r\n\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.LineBasicMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.LineBasicMaterial.prototype.constructor = THREE.LineBasicMaterial;\r\n\r\nTHREE.LineBasicMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\r\n\tthis.linewidth = source.linewidth;\r\n\tthis.linecap = source.linecap;\r\n\tthis.linejoin = source.linejoin;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/LineDashedMaterial.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n *\r\n * linewidth: ,\r\n *\r\n * scale: ,\r\n * dashSize: ,\r\n * gapSize: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.FaceColors / THREE.VertexColors\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.LineDashedMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'LineDashedMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\r\n\tthis.linewidth = 1;\r\n\r\n\tthis.scale = 1;\r\n\tthis.dashSize = 3;\r\n\tthis.gapSize = 1;\r\n\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.LineDashedMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.LineDashedMaterial.prototype.constructor = THREE.LineDashedMaterial;\r\n\r\nTHREE.LineDashedMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\r\n\tthis.linewidth = source.linewidth;\r\n\r\n\tthis.scale = source.scale;\r\n\tthis.dashSize = source.dashSize;\r\n\tthis.gapSize = source.gapSize;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshBasicMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n * map: new THREE.Texture( ),\r\n *\r\n * aoMap: new THREE.Texture( ),\r\n * aoMapIntensity: \r\n *\r\n * specularMap: new THREE.Texture( ),\r\n *\r\n * alphaMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\r\n * combine: THREE.Multiply,\r\n * reflectivity: ,\r\n * refractionRatio: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.MeshBasicMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'MeshBasicMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // emissive\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.aoMap = null;\r\n\tthis.aoMapIntensity = 1.0;\r\n\r\n\tthis.specularMap = null;\r\n\r\n\tthis.alphaMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.combine = THREE.MultiplyOperation;\r\n\tthis.reflectivity = 1;\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshBasicMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.MeshBasicMaterial.prototype.constructor = THREE.MeshBasicMaterial;\r\n\r\nTHREE.MeshBasicMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\r\n\tthis.map = source.map;\r\n\r\n\tthis.aoMap = source.aoMap;\r\n\tthis.aoMapIntensity = source.aoMapIntensity;\r\n\r\n\tthis.specularMap = source.specularMap;\r\n\r\n\tthis.alphaMap = source.alphaMap;\r\n\r\n\tthis.envMap = source.envMap;\r\n\tthis.combine = source.combine;\r\n\tthis.reflectivity = source.reflectivity;\r\n\tthis.refractionRatio = source.refractionRatio;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\tthis.shading = source.shading;\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\tthis.wireframeLinecap = source.wireframeLinecap;\r\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.skinning = source.skinning;\r\n\tthis.morphTargets = source.morphTargets;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshDepthMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author bhouston / https://clara.io\r\n * @author WestLangley / http://github.com/WestLangley\r\n *\r\n * parameters = {\r\n *\r\n * opacity: ,\r\n *\r\n * map: new THREE.Texture( ),\r\n *\r\n * alphaMap: new THREE.Texture( ),\r\n *\r\n * displacementMap: new THREE.Texture( ),\r\n * displacementScale: ,\r\n * displacementBias: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: \r\n * }\r\n */\r\n\r\nTHREE.MeshDepthMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'MeshDepthMaterial';\r\n\r\n\tthis.depthPacking = THREE.BasicDepthPacking;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.alphaMap = null;\r\n\r\n\tthis.displacementMap = null;\r\n\tthis.displacementScale = 1;\r\n\tthis.displacementBias = 0;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshDepthMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.MeshDepthMaterial.prototype.constructor = THREE.MeshDepthMaterial;\r\n\r\nTHREE.MeshDepthMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.depthPacking = source.depthPacking;\r\n\r\n\tthis.skinning = source.skinning;\r\n\tthis.morphTargets = source.morphTargets;\r\n\r\n\tthis.map = source.map;\r\n\r\n\tthis.alphaMap = source.alphaMap;\r\n\r\n\tthis.displacementMap = source.displacementMap;\r\n\tthis.displacementScale = source.displacementScale;\r\n\tthis.displacementBias = source.displacementBias;\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshLambertMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n *\r\n * map: new THREE.Texture( ),\r\n *\r\n * lightMap: new THREE.Texture( ),\r\n * lightMapIntensity: \r\n *\r\n * aoMap: new THREE.Texture( ),\r\n * aoMapIntensity: \r\n *\r\n * emissive: ,\r\n * emissiveIntensity: \r\n * emissiveMap: new THREE.Texture( ),\r\n *\r\n * specularMap: new THREE.Texture( ),\r\n *\r\n * alphaMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\r\n * combine: THREE.Multiply,\r\n * reflectivity: ,\r\n * refractionRatio: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.MeshLambertMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'MeshLambertMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // diffuse\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.lightMap = null;\r\n\tthis.lightMapIntensity = 1.0;\r\n\r\n\tthis.aoMap = null;\r\n\tthis.aoMapIntensity = 1.0;\r\n\r\n\tthis.emissive = new THREE.Color( 0x000000 );\r\n\tthis.emissiveIntensity = 1.0;\r\n\tthis.emissiveMap = null;\r\n\r\n\tthis.specularMap = null;\r\n\r\n\tthis.alphaMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.combine = THREE.MultiplyOperation;\r\n\tthis.reflectivity = 1;\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\tthis.morphNormals = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshLambertMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.MeshLambertMaterial.prototype.constructor = THREE.MeshLambertMaterial;\r\n\r\nTHREE.MeshLambertMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\r\n\tthis.map = source.map;\r\n\r\n\tthis.lightMap = source.lightMap;\r\n\tthis.lightMapIntensity = source.lightMapIntensity;\r\n\r\n\tthis.aoMap = source.aoMap;\r\n\tthis.aoMapIntensity = source.aoMapIntensity;\r\n\r\n\tthis.emissive.copy( source.emissive );\r\n\tthis.emissiveMap = source.emissiveMap;\r\n\tthis.emissiveIntensity = source.emissiveIntensity;\r\n\r\n\tthis.specularMap = source.specularMap;\r\n\r\n\tthis.alphaMap = source.alphaMap;\r\n\r\n\tthis.envMap = source.envMap;\r\n\tthis.combine = source.combine;\r\n\tthis.reflectivity = source.reflectivity;\r\n\tthis.refractionRatio = source.refractionRatio;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\tthis.wireframeLinecap = source.wireframeLinecap;\r\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.skinning = source.skinning;\r\n\tthis.morphTargets = source.morphTargets;\r\n\tthis.morphNormals = source.morphNormals;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshNormalMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n *\r\n * parameters = {\r\n * opacity: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: \r\n * }\r\n */\r\n\r\nTHREE.MeshNormalMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this, parameters );\r\n\r\n\tthis.type = 'MeshNormalMaterial';\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\r\n\tthis.morphTargets = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshNormalMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.MeshNormalMaterial.prototype.constructor = THREE.MeshNormalMaterial;\r\n\r\nTHREE.MeshNormalMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshPhongMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * specular: ,\r\n * shininess: ,\r\n * opacity: ,\r\n *\r\n * map: new THREE.Texture( ),\r\n *\r\n * lightMap: new THREE.Texture( ),\r\n * lightMapIntensity: \r\n *\r\n * aoMap: new THREE.Texture( ),\r\n * aoMapIntensity: \r\n *\r\n * emissive: ,\r\n * emissiveIntensity: \r\n * emissiveMap: new THREE.Texture( ),\r\n *\r\n * bumpMap: new THREE.Texture( ),\r\n * bumpScale: ,\r\n *\r\n * normalMap: new THREE.Texture( ),\r\n * normalScale: ,\r\n *\r\n * displacementMap: new THREE.Texture( ),\r\n * displacementScale: ,\r\n * displacementBias: ,\r\n *\r\n * specularMap: new THREE.Texture( ),\r\n *\r\n * alphaMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\r\n * combine: THREE.Multiply,\r\n * reflectivity: ,\r\n * refractionRatio: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.MeshPhongMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'MeshPhongMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // diffuse\r\n\tthis.specular = new THREE.Color( 0x111111 );\r\n\tthis.shininess = 30;\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.lightMap = null;\r\n\tthis.lightMapIntensity = 1.0;\r\n\r\n\tthis.aoMap = null;\r\n\tthis.aoMapIntensity = 1.0;\r\n\r\n\tthis.emissive = new THREE.Color( 0x000000 );\r\n\tthis.emissiveIntensity = 1.0;\r\n\tthis.emissiveMap = null;\r\n\r\n\tthis.bumpMap = null;\r\n\tthis.bumpScale = 1;\r\n\r\n\tthis.normalMap = null;\r\n\tthis.normalScale = new THREE.Vector2( 1, 1 );\r\n\r\n\tthis.displacementMap = null;\r\n\tthis.displacementScale = 1;\r\n\tthis.displacementBias = 0;\r\n\r\n\tthis.specularMap = null;\r\n\r\n\tthis.alphaMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.combine = THREE.MultiplyOperation;\r\n\tthis.reflectivity = 1;\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\tthis.morphNormals = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshPhongMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.MeshPhongMaterial.prototype.constructor = THREE.MeshPhongMaterial;\r\n\r\nTHREE.MeshPhongMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\tthis.specular.copy( source.specular );\r\n\tthis.shininess = source.shininess;\r\n\r\n\tthis.map = source.map;\r\n\r\n\tthis.lightMap = source.lightMap;\r\n\tthis.lightMapIntensity = source.lightMapIntensity;\r\n\r\n\tthis.aoMap = source.aoMap;\r\n\tthis.aoMapIntensity = source.aoMapIntensity;\r\n\r\n\tthis.emissive.copy( source.emissive );\r\n\tthis.emissiveMap = source.emissiveMap;\r\n\tthis.emissiveIntensity = source.emissiveIntensity;\r\n\r\n\tthis.bumpMap = source.bumpMap;\r\n\tthis.bumpScale = source.bumpScale;\r\n\r\n\tthis.normalMap = source.normalMap;\r\n\tthis.normalScale.copy( source.normalScale );\r\n\r\n\tthis.displacementMap = source.displacementMap;\r\n\tthis.displacementScale = source.displacementScale;\r\n\tthis.displacementBias = source.displacementBias;\r\n\r\n\tthis.specularMap = source.specularMap;\r\n\r\n\tthis.alphaMap = source.alphaMap;\r\n\r\n\tthis.envMap = source.envMap;\r\n\tthis.combine = source.combine;\r\n\tthis.reflectivity = source.reflectivity;\r\n\tthis.refractionRatio = source.refractionRatio;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\tthis.shading = source.shading;\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\tthis.wireframeLinecap = source.wireframeLinecap;\r\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.skinning = source.skinning;\r\n\tthis.morphTargets = source.morphTargets;\r\n\tthis.morphNormals = source.morphNormals;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshStandardMaterial.js\r\n\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n *\r\n * parameters = {\r\n * color: ,\r\n * roughness: ,\r\n * metalness: ,\r\n * opacity: ,\r\n *\r\n * map: new THREE.Texture( ),\r\n *\r\n * lightMap: new THREE.Texture( ),\r\n * lightMapIntensity: \r\n *\r\n * aoMap: new THREE.Texture( ),\r\n * aoMapIntensity: \r\n *\r\n * emissive: ,\r\n * emissiveIntensity: \r\n * emissiveMap: new THREE.Texture( ),\r\n *\r\n * bumpMap: new THREE.Texture( ),\r\n * bumpScale: ,\r\n *\r\n * normalMap: new THREE.Texture( ),\r\n * normalScale: ,\r\n *\r\n * displacementMap: new THREE.Texture( ),\r\n * displacementScale: ,\r\n * displacementBias: ,\r\n *\r\n * roughnessMap: new THREE.Texture( ),\r\n *\r\n * metalnessMap: new THREE.Texture( ),\r\n *\r\n * alphaMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\r\n * envMapIntensity: \r\n *\r\n * refractionRatio: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.MeshStandardMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.defines = { 'STANDARD': '' };\r\n\r\n\tthis.type = 'MeshStandardMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // diffuse\r\n\tthis.roughness = 0.5;\r\n\tthis.metalness = 0.5;\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.lightMap = null;\r\n\tthis.lightMapIntensity = 1.0;\r\n\r\n\tthis.aoMap = null;\r\n\tthis.aoMapIntensity = 1.0;\r\n\r\n\tthis.emissive = new THREE.Color( 0x000000 );\r\n\tthis.emissiveIntensity = 1.0;\r\n\tthis.emissiveMap = null;\r\n\r\n\tthis.bumpMap = null;\r\n\tthis.bumpScale = 1;\r\n\r\n\tthis.normalMap = null;\r\n\tthis.normalScale = new THREE.Vector2( 1, 1 );\r\n\r\n\tthis.displacementMap = null;\r\n\tthis.displacementScale = 1;\r\n\tthis.displacementBias = 0;\r\n\r\n\tthis.roughnessMap = null;\r\n\r\n\tthis.metalnessMap = null;\r\n\r\n\tthis.alphaMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.envMapIntensity = 1.0;\r\n\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\tthis.morphNormals = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshStandardMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.MeshStandardMaterial.prototype.constructor = THREE.MeshStandardMaterial;\r\n\r\nTHREE.MeshStandardMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.defines = { 'STANDARD': '' };\r\n\r\n\tthis.color.copy( source.color );\r\n\tthis.roughness = source.roughness;\r\n\tthis.metalness = source.metalness;\r\n\r\n\tthis.map = source.map;\r\n\r\n\tthis.lightMap = source.lightMap;\r\n\tthis.lightMapIntensity = source.lightMapIntensity;\r\n\r\n\tthis.aoMap = source.aoMap;\r\n\tthis.aoMapIntensity = source.aoMapIntensity;\r\n\r\n\tthis.emissive.copy( source.emissive );\r\n\tthis.emissiveMap = source.emissiveMap;\r\n\tthis.emissiveIntensity = source.emissiveIntensity;\r\n\r\n\tthis.bumpMap = source.bumpMap;\r\n\tthis.bumpScale = source.bumpScale;\r\n\r\n\tthis.normalMap = source.normalMap;\r\n\tthis.normalScale.copy( source.normalScale );\r\n\r\n\tthis.displacementMap = source.displacementMap;\r\n\tthis.displacementScale = source.displacementScale;\r\n\tthis.displacementBias = source.displacementBias;\r\n\r\n\tthis.roughnessMap = source.roughnessMap;\r\n\r\n\tthis.metalnessMap = source.metalnessMap;\r\n\r\n\tthis.alphaMap = source.alphaMap;\r\n\r\n\tthis.envMap = source.envMap;\r\n\tthis.envMapIntensity = source.envMapIntensity;\r\n\r\n\tthis.refractionRatio = source.refractionRatio;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\tthis.shading = source.shading;\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\tthis.wireframeLinecap = source.wireframeLinecap;\r\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.skinning = source.skinning;\r\n\tthis.morphTargets = source.morphTargets;\r\n\tthis.morphNormals = source.morphNormals;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MeshPhysicalMaterial.js\r\n\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n *\r\n * parameters = {\r\n * reflectivity: \r\n * }\r\n */\r\n\r\nTHREE.MeshPhysicalMaterial = function ( parameters ) {\r\n\r\n\tTHREE.MeshStandardMaterial.call( this );\r\n\r\n\tthis.defines = { 'PHYSICAL': '' };\r\n\r\n\tthis.type = 'MeshPhysicalMaterial';\r\n\r\n\tthis.reflectivity = 0.5; // maps to F0 = 0.04\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshPhysicalMaterial.prototype = Object.create( THREE.MeshStandardMaterial.prototype );\r\nTHREE.MeshPhysicalMaterial.prototype.constructor = THREE.MeshPhysicalMaterial;\r\n\r\nTHREE.MeshPhysicalMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.MeshStandardMaterial.prototype.copy.call( this, source );\r\n\r\n\tthis.defines = { 'PHYSICAL': '' };\r\n\r\n\tthis.reflectivity = source.reflectivity;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/MultiMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.MultiMaterial = function ( materials ) {\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.type = 'MultiMaterial';\r\n\r\n\tthis.materials = materials instanceof Array ? materials : [];\r\n\r\n\tthis.visible = true;\r\n\r\n};\r\n\r\nTHREE.MultiMaterial.prototype = {\r\n\r\n\tconstructor: THREE.MultiMaterial,\r\n\r\n\ttoJSON: function ( meta ) {\r\n\r\n\t\tvar output = {\r\n\t\t\tmetadata: {\r\n\t\t\t\tversion: 4.2,\r\n\t\t\t\ttype: 'material',\r\n\t\t\t\tgenerator: 'MaterialExporter'\r\n\t\t\t},\r\n\t\t\tuuid: this.uuid,\r\n\t\t\ttype: this.type,\r\n\t\t\tmaterials: []\r\n\t\t};\r\n\r\n\t\tvar materials = this.materials;\r\n\r\n\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar material = materials[ i ].toJSON( meta );\r\n\t\t\tdelete material.metadata;\r\n\r\n\t\t\toutput.materials.push( material );\r\n\r\n\t\t}\r\n\r\n\t\toutput.visible = this.visible;\r\n\r\n\t\treturn output;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar material = new this.constructor();\r\n\r\n\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\r\n\r\n\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\r\n\r\n\t\t}\r\n\r\n\t\tmaterial.visible = this.visible;\r\n\r\n\t\treturn material;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/materials/PointsMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n * map: new THREE.Texture( ),\r\n *\r\n * size: ,\r\n * sizeAttenuation: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * vertexColors: ,\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.PointsMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'PointsMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.size = 1;\r\n\tthis.sizeAttenuation = true;\r\n\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.PointsMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.PointsMaterial.prototype.constructor = THREE.PointsMaterial;\r\n\r\nTHREE.PointsMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\r\n\tthis.map = source.map;\r\n\r\n\tthis.size = source.size;\r\n\tthis.sizeAttenuation = source.sizeAttenuation;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/materials/ShaderMaterial.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * defines: { \"label\" : \"value\" },\r\n * uniforms: { \"parameter1\": { type: \"1f\", value: 1.0 }, \"parameter2\": { type: \"1i\" value2: 2 } },\r\n *\r\n * fragmentShader: ,\r\n * vertexShader: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * lights: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.ShaderMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'ShaderMaterial';\r\n\r\n\tthis.defines = {};\r\n\tthis.uniforms = {};\r\n\r\n\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\r\n\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\r\n\tthis.linewidth = 1;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\r\n\tthis.fog = false; // set to use scene fog\r\n\r\n\tthis.lights = false; // set to use scene lights\r\n\tthis.clipping = false; // set to use user-defined clipping planes\r\n\r\n\tthis.vertexColors = THREE.NoColors; // set to use \"color\" attribute stream\r\n\r\n\tthis.skinning = false; // set to use skinning attribute streams\r\n\r\n\tthis.morphTargets = false; // set to use morph targets\r\n\tthis.morphNormals = false; // set to use morph normals\r\n\r\n\tthis.extensions = {\r\n\t\tderivatives: false, // set to use derivatives\r\n\t\tfragDepth: false, // set to use fragment depth values\r\n\t\tdrawBuffers: false, // set to use draw buffers\r\n\t\tshaderTextureLOD: false // set to use shader texture LOD\r\n\t};\r\n\r\n\t// When rendered geometry doesn't include these attributes but the material does,\r\n\t// use these default values in WebGL. This avoids errors when buffer data is missing.\r\n\tthis.defaultAttributeValues = {\r\n\t\t'color': [ 1, 1, 1 ],\r\n\t\t'uv': [ 0, 0 ],\r\n\t\t'uv2': [ 0, 0 ]\r\n\t};\r\n\r\n\tthis.index0AttributeName = undefined;\r\n\r\n\tif ( parameters !== undefined ) {\r\n\r\n\t\tif ( parameters.attributes !== undefined ) {\r\n\r\n\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\r\n\r\n\t\t}\r\n\r\n\t\tthis.setValues( parameters );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ShaderMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.ShaderMaterial.prototype.constructor = THREE.ShaderMaterial;\r\n\r\nTHREE.ShaderMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.fragmentShader = source.fragmentShader;\r\n\tthis.vertexShader = source.vertexShader;\r\n\r\n\tthis.uniforms = THREE.UniformsUtils.clone( source.uniforms );\r\n\r\n\tthis.defines = source.defines;\r\n\r\n\tthis.shading = source.shading;\r\n\r\n\tthis.wireframe = source.wireframe;\r\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\tthis.lights = source.lights;\r\n\tthis.clipping = source.clipping;\r\n\r\n\tthis.vertexColors = source.vertexColors;\r\n\r\n\tthis.skinning = source.skinning;\r\n\r\n\tthis.morphTargets = source.morphTargets;\r\n\tthis.morphNormals = source.morphNormals;\r\n\r\n\tthis.extensions = source.extensions;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.ShaderMaterial.prototype.toJSON = function ( meta ) {\r\n\r\n\tvar data = THREE.Material.prototype.toJSON.call( this, meta );\r\n\r\n\tdata.uniforms = this.uniforms;\r\n\tdata.vertexShader = this.vertexShader;\r\n\tdata.fragmentShader = this.fragmentShader;\r\n\r\n\treturn data;\r\n\r\n};\r\n\r\n// File:src/materials/RawShaderMaterial.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RawShaderMaterial = function ( parameters ) {\r\n\r\n\tTHREE.ShaderMaterial.call( this, parameters );\r\n\r\n\tthis.type = 'RawShaderMaterial';\r\n\r\n};\r\n\r\nTHREE.RawShaderMaterial.prototype = Object.create( THREE.ShaderMaterial.prototype );\r\nTHREE.RawShaderMaterial.prototype.constructor = THREE.RawShaderMaterial;\r\n\r\n// File:src/materials/SpriteMaterial.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n * map: new THREE.Texture( ),\r\n *\r\n *\tuvOffset: new THREE.Vector2(),\r\n *\tuvScale: new THREE.Vector2(),\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.SpriteMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.type = 'SpriteMaterial';\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\tthis.map = null;\r\n\r\n\tthis.rotation = 0;\r\n\r\n\tthis.fog = false;\r\n\r\n\t// set parameters\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.SpriteMaterial.prototype = Object.create( THREE.Material.prototype );\r\nTHREE.SpriteMaterial.prototype.constructor = THREE.SpriteMaterial;\r\n\r\nTHREE.SpriteMaterial.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Material.prototype.copy.call( this, source );\r\n\r\n\tthis.color.copy( source.color );\r\n\tthis.map = source.map;\r\n\r\n\tthis.rotation = source.rotation;\r\n\r\n\tthis.fog = source.fog;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/textures/Texture.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author szimek / https://github.com/szimek/\r\n */\r\n\r\nTHREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\r\n\r\n\tObject.defineProperty( this, 'id', { value: THREE.TextureIdCount ++ } );\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.name = '';\r\n\tthis.sourceFile = '';\r\n\r\n\tthis.image = image !== undefined ? image : THREE.Texture.DEFAULT_IMAGE;\r\n\tthis.mipmaps = [];\r\n\r\n\tthis.mapping = mapping !== undefined ? mapping : THREE.Texture.DEFAULT_MAPPING;\r\n\r\n\tthis.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping;\r\n\tthis.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping;\r\n\r\n\tthis.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter;\r\n\tthis.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter;\r\n\r\n\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\r\n\r\n\tthis.format = format !== undefined ? format : THREE.RGBAFormat;\r\n\tthis.type = type !== undefined ? type : THREE.UnsignedByteType;\r\n\r\n\tthis.offset = new THREE.Vector2( 0, 0 );\r\n\tthis.repeat = new THREE.Vector2( 1, 1 );\r\n\r\n\tthis.generateMipmaps = true;\r\n\tthis.premultiplyAlpha = false;\r\n\tthis.flipY = true;\r\n\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\r\n\r\n\r\n\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\r\n\t//\r\n\t// Also changing the encoding after already used by a Material will not automatically make the Material\r\n\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\r\n\tthis.encoding = encoding !== undefined ? encoding : THREE.LinearEncoding;\r\n\r\n\tthis.version = 0;\r\n\tthis.onUpdate = null;\r\n\r\n};\r\n\r\nTHREE.Texture.DEFAULT_IMAGE = undefined;\r\nTHREE.Texture.DEFAULT_MAPPING = THREE.UVMapping;\r\n\r\nTHREE.Texture.prototype = {\r\n\r\n\tconstructor: THREE.Texture,\r\n\r\n\tset needsUpdate ( value ) {\r\n\r\n\t\tif ( value === true ) this.version ++;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.image = source.image;\r\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\r\n\r\n\t\tthis.mapping = source.mapping;\r\n\r\n\t\tthis.wrapS = source.wrapS;\r\n\t\tthis.wrapT = source.wrapT;\r\n\r\n\t\tthis.magFilter = source.magFilter;\r\n\t\tthis.minFilter = source.minFilter;\r\n\r\n\t\tthis.anisotropy = source.anisotropy;\r\n\r\n\t\tthis.format = source.format;\r\n\t\tthis.type = source.type;\r\n\r\n\t\tthis.offset.copy( source.offset );\r\n\t\tthis.repeat.copy( source.repeat );\r\n\r\n\t\tthis.generateMipmaps = source.generateMipmaps;\r\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\r\n\t\tthis.flipY = source.flipY;\r\n\t\tthis.unpackAlignment = source.unpackAlignment;\r\n\t\tthis.encoding = source.encoding;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoJSON: function ( meta ) {\r\n\r\n\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\r\n\r\n\t\t\treturn meta.textures[ this.uuid ];\r\n\r\n\t\t}\r\n\r\n\t\tfunction getDataURL( image ) {\r\n\r\n\t\t\tvar canvas;\r\n\r\n\t\t\tif ( image.toDataURL !== undefined ) {\r\n\r\n\t\t\t\tcanvas = image;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tcanvas = document.createElement( 'canvas' );\r\n\t\t\t\tcanvas.width = image.width;\r\n\t\t\t\tcanvas.height = image.height;\r\n\r\n\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\r\n\r\n\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\treturn canvas.toDataURL( 'image/png' );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar output = {\r\n\t\t\tmetadata: {\r\n\t\t\t\tversion: 4.4,\r\n\t\t\t\ttype: 'Texture',\r\n\t\t\t\tgenerator: 'Texture.toJSON'\r\n\t\t\t},\r\n\r\n\t\t\tuuid: this.uuid,\r\n\t\t\tname: this.name,\r\n\r\n\t\t\tmapping: this.mapping,\r\n\r\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\r\n\t\t\toffset: [ this.offset.x, this.offset.y ],\r\n\t\t\twrap: [ this.wrapS, this.wrapT ],\r\n\r\n\t\t\tminFilter: this.minFilter,\r\n\t\t\tmagFilter: this.magFilter,\r\n\t\t\tanisotropy: this.anisotropy\r\n\t\t};\r\n\r\n\t\tif ( this.image !== undefined ) {\r\n\r\n\t\t\t// TODO: Move to THREE.Image\r\n\r\n\t\t\tvar image = this.image;\r\n\r\n\t\t\tif ( image.uuid === undefined ) {\r\n\r\n\t\t\t\timage.uuid = THREE.Math.generateUUID(); // UGH\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\r\n\r\n\t\t\t\tmeta.images[ image.uuid ] = {\r\n\t\t\t\t\tuuid: image.uuid,\r\n\t\t\t\t\turl: getDataURL( image )\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\r\n\t\t\toutput.image = image.uuid;\r\n\r\n\t\t}\r\n\r\n\t\tmeta.textures[ this.uuid ] = output;\r\n\r\n\t\treturn output;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t},\r\n\r\n\ttransformUv: function ( uv ) {\r\n\r\n\t\tif ( this.mapping !== THREE.UVMapping ) return;\r\n\r\n\t\tuv.multiply( this.repeat );\r\n\t\tuv.add( this.offset );\r\n\r\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\r\n\r\n\t\t\tswitch ( this.wrapS ) {\r\n\r\n\t\t\t\tcase THREE.RepeatWrapping:\r\n\r\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.ClampToEdgeWrapping:\r\n\r\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.MirroredRepeatWrapping:\r\n\r\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\r\n\r\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\r\n\r\n\t\t\tswitch ( this.wrapT ) {\r\n\r\n\t\t\t\tcase THREE.RepeatWrapping:\r\n\r\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.ClampToEdgeWrapping:\r\n\r\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.MirroredRepeatWrapping:\r\n\r\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\r\n\r\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.flipY ) {\r\n\r\n\t\t\tuv.y = 1 - uv.y;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.Texture.prototype );\r\n\r\nTHREE.TextureIdCount = 0;\r\n\r\n// File:src/textures/DepthTexture.js\r\n\r\n/**\r\n * @author Matt DesLauriers / @mattdesl\r\n */\r\n\r\nTHREE.DepthTexture = function ( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) {\r\n\r\n THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, THREE.DepthFormat, type, anisotropy );\r\n\r\n this.image = { width: width, height: height };\r\n\r\n this.type = type !== undefined ? type : THREE.UnsignedShortType;\r\n\r\n this.magFilter = magFilter !== undefined ? magFilter : THREE.NearestFilter;\r\n this.minFilter = minFilter !== undefined ? minFilter : THREE.NearestFilter;\r\n\r\n this.flipY = false;\r\n this.generateMipmaps = false;\r\n\r\n};\r\n\r\nTHREE.DepthTexture.prototype = Object.create( THREE.Texture.prototype );\r\nTHREE.DepthTexture.prototype.constructor = THREE.DepthTexture;\r\n\r\n// File:src/textures/CanvasTexture.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.CanvasTexture = function ( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\r\n\r\n\tTHREE.Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\r\n\r\n\tthis.needsUpdate = true;\r\n\r\n};\r\n\r\nTHREE.CanvasTexture.prototype = Object.create( THREE.Texture.prototype );\r\nTHREE.CanvasTexture.prototype.constructor = THREE.CanvasTexture;\r\n\r\n// File:src/textures/CubeTexture.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.CubeTexture = function ( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\r\n\r\n\timages = images !== undefined ? images : [];\r\n\tmapping = mapping !== undefined ? mapping : THREE.CubeReflectionMapping;\r\n\r\n\tTHREE.Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\r\n\r\n\tthis.flipY = false;\r\n\r\n};\r\n\r\nTHREE.CubeTexture.prototype = Object.create( THREE.Texture.prototype );\r\nTHREE.CubeTexture.prototype.constructor = THREE.CubeTexture;\r\n\r\nObject.defineProperty( THREE.CubeTexture.prototype, 'images', {\r\n\r\n\tget: function () {\r\n\r\n\t\treturn this.image;\r\n\r\n\t},\r\n\r\n\tset: function ( value ) {\r\n\r\n\t\tthis.image = value;\r\n\r\n\t}\r\n\r\n} );\r\n\r\n// File:src/textures/CompressedTexture.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.CompressedTexture = function ( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\r\n\r\n\tTHREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\r\n\r\n\tthis.image = { width: width, height: height };\r\n\tthis.mipmaps = mipmaps;\r\n\r\n\t// no flipping for cube textures\r\n\t// (also flipping doesn't work for compressed textures )\r\n\r\n\tthis.flipY = false;\r\n\r\n\t// can't generate mipmaps for compressed textures\r\n\t// mips must be embedded in DDS files\r\n\r\n\tthis.generateMipmaps = false;\r\n\r\n};\r\n\r\nTHREE.CompressedTexture.prototype = Object.create( THREE.Texture.prototype );\r\nTHREE.CompressedTexture.prototype.constructor = THREE.CompressedTexture;\r\n\r\n// File:src/textures/DataTexture.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\r\n\r\n\tTHREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\r\n\r\n\tthis.image = { data: data, width: width, height: height };\r\n\r\n\tthis.magFilter = magFilter !== undefined ? magFilter : THREE.NearestFilter;\r\n\tthis.minFilter = minFilter !== undefined ? minFilter : THREE.NearestFilter;\r\n\r\n\tthis.flipY = false;\r\n\tthis.generateMipmaps = false;\r\n\r\n};\r\n\r\nTHREE.DataTexture.prototype = Object.create( THREE.Texture.prototype );\r\nTHREE.DataTexture.prototype.constructor = THREE.DataTexture;\r\n\r\n// File:src/textures/VideoTexture.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.VideoTexture = function ( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\r\n\r\n\tTHREE.Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\r\n\r\n\tthis.generateMipmaps = false;\r\n\r\n\tvar scope = this;\r\n\r\n\tfunction update() {\r\n\r\n\t\trequestAnimationFrame( update );\r\n\r\n\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\r\n\r\n\t\t\tscope.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tupdate();\r\n\r\n};\r\n\r\nTHREE.VideoTexture.prototype = Object.create( THREE.Texture.prototype );\r\nTHREE.VideoTexture.prototype.constructor = THREE.VideoTexture;\r\n\r\n// File:src/objects/Group.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Group = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Group';\r\n\r\n};\r\n\r\nTHREE.Group.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Group.prototype.constructor = THREE.Group;\r\n\r\n// File:src/objects/Points.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Points = function ( geometry, material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Points';\r\n\r\n\tthis.geometry = geometry !== undefined ? geometry : new THREE.Geometry();\r\n\tthis.material = material !== undefined ? material : new THREE.PointsMaterial( { color: Math.random() * 0xffffff } );\r\n\r\n};\r\n\r\nTHREE.Points.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Points.prototype.constructor = THREE.Points;\r\n\r\nTHREE.Points.prototype.raycast = ( function () {\r\n\r\n\tvar inverseMatrix = new THREE.Matrix4();\r\n\tvar ray = new THREE.Ray();\r\n\tvar sphere = new THREE.Sphere();\r\n\r\n\treturn function raycast( raycaster, intersects ) {\r\n\r\n\t\tvar object = this;\r\n\t\tvar geometry = this.geometry;\r\n\t\tvar matrixWorld = this.matrixWorld;\r\n\t\tvar threshold = raycaster.params.Points.threshold;\r\n\r\n\t\t// Checking boundingSphere distance to ray\r\n\r\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\r\n\r\n\t\tsphere.copy( geometry.boundingSphere );\r\n\t\tsphere.applyMatrix4( matrixWorld );\r\n\r\n\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\r\n\r\n\t\t//\r\n\r\n\t\tinverseMatrix.getInverse( matrixWorld );\r\n\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\r\n\r\n\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\r\n\t\tvar localThresholdSq = localThreshold * localThreshold;\r\n\t\tvar position = new THREE.Vector3();\r\n\r\n\t\tfunction testPoint( point, index ) {\r\n\r\n\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\r\n\r\n\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\r\n\r\n\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\r\n\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\r\n\r\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\r\n\r\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\r\n\r\n\t\t\t\tintersects.push( {\r\n\r\n\t\t\t\t\tdistance: distance,\r\n\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\r\n\t\t\t\t\tpoint: intersectPoint.clone(),\r\n\t\t\t\t\tindex: index,\r\n\t\t\t\t\tface: null,\r\n\t\t\t\t\tobject: object\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\tvar index = geometry.index;\r\n\t\t\tvar attributes = geometry.attributes;\r\n\t\t\tvar positions = attributes.position.array;\r\n\r\n\t\t\tif ( index !== null ) {\r\n\r\n\t\t\t\tvar indices = index.array;\r\n\r\n\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tvar a = indices[ i ];\r\n\r\n\t\t\t\t\tposition.fromArray( positions, a * 3 );\r\n\r\n\t\t\t\t\ttestPoint( position, a );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\r\n\r\n\t\t\t\t\tposition.fromArray( positions, i * 3 );\r\n\r\n\t\t\t\t\ttestPoint( position, i );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar vertices = geometry.vertices;\r\n\r\n\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\r\n\r\n\t\t\t\ttestPoint( vertices[ i ], i );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}() );\r\n\r\nTHREE.Points.prototype.clone = function () {\r\n\r\n\treturn new this.constructor( this.geometry, this.material ).copy( this );\r\n\r\n};\r\n\r\n// File:src/objects/Line.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Line = function ( geometry, material, mode ) {\r\n\r\n\tif ( mode === 1 ) {\r\n\r\n\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\r\n\t\treturn new THREE.LineSegments( geometry, material );\r\n\r\n\t}\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Line';\r\n\r\n\tthis.geometry = geometry !== undefined ? geometry : new THREE.Geometry();\r\n\tthis.material = material !== undefined ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } );\r\n\r\n};\r\n\r\nTHREE.Line.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Line.prototype.constructor = THREE.Line;\r\n\r\nTHREE.Line.prototype.raycast = ( function () {\r\n\r\n\tvar inverseMatrix = new THREE.Matrix4();\r\n\tvar ray = new THREE.Ray();\r\n\tvar sphere = new THREE.Sphere();\r\n\r\n\treturn function raycast( raycaster, intersects ) {\r\n\r\n\t\tvar precision = raycaster.linePrecision;\r\n\t\tvar precisionSq = precision * precision;\r\n\r\n\t\tvar geometry = this.geometry;\r\n\t\tvar matrixWorld = this.matrixWorld;\r\n\r\n\t\t// Checking boundingSphere distance to ray\r\n\r\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\r\n\r\n\t\tsphere.copy( geometry.boundingSphere );\r\n\t\tsphere.applyMatrix4( matrixWorld );\r\n\r\n\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\r\n\r\n\t\t//\r\n\r\n\t\tinverseMatrix.getInverse( matrixWorld );\r\n\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\r\n\r\n\t\tvar vStart = new THREE.Vector3();\r\n\t\tvar vEnd = new THREE.Vector3();\r\n\t\tvar interSegment = new THREE.Vector3();\r\n\t\tvar interRay = new THREE.Vector3();\r\n\t\tvar step = this instanceof THREE.LineSegments ? 2 : 1;\r\n\r\n\t\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\tvar index = geometry.index;\r\n\t\t\tvar attributes = geometry.attributes;\r\n\t\t\tvar positions = attributes.position.array;\r\n\r\n\t\t\tif ( index !== null ) {\r\n\r\n\t\t\t\tvar indices = index.array;\r\n\r\n\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\r\n\r\n\t\t\t\t\tvar a = indices[ i ];\r\n\t\t\t\t\tvar b = indices[ i + 1 ];\r\n\r\n\t\t\t\t\tvStart.fromArray( positions, a * 3 );\r\n\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\r\n\r\n\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\r\n\r\n\t\t\t\t\tif ( distSq > precisionSq ) continue;\r\n\r\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\r\n\r\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\r\n\r\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\r\n\r\n\t\t\t\t\tintersects.push( {\r\n\r\n\t\t\t\t\t\tdistance: distance,\r\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\r\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\r\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\r\n\t\t\t\t\t\tindex: i,\r\n\t\t\t\t\t\tface: null,\r\n\t\t\t\t\t\tfaceIndex: null,\r\n\t\t\t\t\t\tobject: this\r\n\r\n\t\t\t\t\t} );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\r\n\r\n\t\t\t\t\tvStart.fromArray( positions, 3 * i );\r\n\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\r\n\r\n\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\r\n\r\n\t\t\t\t\tif ( distSq > precisionSq ) continue;\r\n\r\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\r\n\r\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\r\n\r\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\r\n\r\n\t\t\t\t\tintersects.push( {\r\n\r\n\t\t\t\t\t\tdistance: distance,\r\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\r\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\r\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\r\n\t\t\t\t\t\tindex: i,\r\n\t\t\t\t\t\tface: null,\r\n\t\t\t\t\t\tfaceIndex: null,\r\n\t\t\t\t\t\tobject: this\r\n\r\n\t\t\t\t\t} );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\tvar vertices = geometry.vertices;\r\n\t\t\tvar nbVertices = vertices.length;\r\n\r\n\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\r\n\r\n\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\r\n\r\n\t\t\t\tif ( distSq > precisionSq ) continue;\r\n\r\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\r\n\r\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\r\n\r\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\r\n\r\n\t\t\t\tintersects.push( {\r\n\r\n\t\t\t\t\tdistance: distance,\r\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\r\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\r\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\r\n\t\t\t\t\tindex: i,\r\n\t\t\t\t\tface: null,\r\n\t\t\t\t\tfaceIndex: null,\r\n\t\t\t\t\tobject: this\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}() );\r\n\r\nTHREE.Line.prototype.clone = function () {\r\n\r\n\treturn new this.constructor( this.geometry, this.material ).copy( this );\r\n\r\n};\r\n\r\n// DEPRECATED\r\n\r\nTHREE.LineStrip = 0;\r\nTHREE.LinePieces = 1;\r\n\r\n// File:src/objects/LineSegments.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.LineSegments = function ( geometry, material ) {\r\n\r\n\tTHREE.Line.call( this, geometry, material );\r\n\r\n\tthis.type = 'LineSegments';\r\n\r\n};\r\n\r\nTHREE.LineSegments.prototype = Object.create( THREE.Line.prototype );\r\nTHREE.LineSegments.prototype.constructor = THREE.LineSegments;\r\n\r\n// File:src/objects/Mesh.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author jonobr1 / http://jonobr1.com/\r\n */\r\n\r\nTHREE.Mesh = function ( geometry, material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Mesh';\r\n\r\n\tthis.geometry = geometry !== undefined ? geometry : new THREE.Geometry();\r\n\tthis.material = material !== undefined ? material : new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff } );\r\n\r\n\tthis.drawMode = THREE.TrianglesDrawMode;\r\n\r\n\tthis.updateMorphTargets();\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Mesh.prototype.constructor = THREE.Mesh;\r\n\r\nTHREE.Mesh.prototype.setDrawMode = function ( value ) {\r\n\r\n\tthis.drawMode = value;\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.updateMorphTargets = function () {\r\n\r\n\tif ( this.geometry.morphTargets !== undefined && this.geometry.morphTargets.length > 0 ) {\r\n\r\n\t\tthis.morphTargetBase = - 1;\r\n\t\tthis.morphTargetInfluences = [];\r\n\t\tthis.morphTargetDictionary = {};\r\n\r\n\t\tfor ( var m = 0, ml = this.geometry.morphTargets.length; m < ml; m ++ ) {\r\n\r\n\t\t\tthis.morphTargetInfluences.push( 0 );\r\n\t\t\tthis.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.getMorphTargetIndexByName = function ( name ) {\r\n\r\n\tif ( this.morphTargetDictionary[ name ] !== undefined ) {\r\n\r\n\t\treturn this.morphTargetDictionary[ name ];\r\n\r\n\t}\r\n\r\n\tconsole.warn( 'THREE.Mesh.getMorphTargetIndexByName: morph target ' + name + ' does not exist. Returning 0.' );\r\n\r\n\treturn 0;\r\n\r\n};\r\n\r\n\r\nTHREE.Mesh.prototype.raycast = ( function () {\r\n\r\n\tvar inverseMatrix = new THREE.Matrix4();\r\n\tvar ray = new THREE.Ray();\r\n\tvar sphere = new THREE.Sphere();\r\n\r\n\tvar vA = new THREE.Vector3();\r\n\tvar vB = new THREE.Vector3();\r\n\tvar vC = new THREE.Vector3();\r\n\r\n\tvar tempA = new THREE.Vector3();\r\n\tvar tempB = new THREE.Vector3();\r\n\tvar tempC = new THREE.Vector3();\r\n\r\n\tvar uvA = new THREE.Vector2();\r\n\tvar uvB = new THREE.Vector2();\r\n\tvar uvC = new THREE.Vector2();\r\n\r\n\tvar barycoord = new THREE.Vector3();\r\n\r\n\tvar intersectionPoint = new THREE.Vector3();\r\n\tvar intersectionPointWorld = new THREE.Vector3();\r\n\r\n\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\r\n\r\n\t\tTHREE.Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\r\n\r\n\t\tuv1.multiplyScalar( barycoord.x );\r\n\t\tuv2.multiplyScalar( barycoord.y );\r\n\t\tuv3.multiplyScalar( barycoord.z );\r\n\r\n\t\tuv1.add( uv2 ).add( uv3 );\r\n\r\n\t\treturn uv1.clone();\r\n\r\n\t}\r\n\r\n\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\r\n\r\n\t\tvar intersect;\r\n\t\tvar material = object.material;\r\n\r\n\t\tif ( material.side === THREE.BackSide ) {\r\n\r\n\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== THREE.DoubleSide, point );\r\n\r\n\t\t}\r\n\r\n\t\tif ( intersect === null ) return null;\r\n\r\n\t\tintersectionPointWorld.copy( point );\r\n\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\r\n\r\n\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\r\n\r\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\r\n\r\n\t\treturn {\r\n\t\t\tdistance: distance,\r\n\t\t\tpoint: intersectionPointWorld.clone(),\r\n\t\t\tobject: object\r\n\t\t};\r\n\r\n\t}\r\n\r\n\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\r\n\r\n\t\tvA.fromArray( positions, a * 3 );\r\n\t\tvB.fromArray( positions, b * 3 );\r\n\t\tvC.fromArray( positions, c * 3 );\r\n\r\n\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\r\n\r\n\t\tif ( intersection ) {\r\n\r\n\t\t\tif ( uvs ) {\r\n\r\n\t\t\t\tuvA.fromArray( uvs, a * 2 );\r\n\t\t\t\tuvB.fromArray( uvs, b * 2 );\r\n\t\t\t\tuvC.fromArray( uvs, c * 2 );\r\n\r\n\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tintersection.face = new THREE.Face3( a, b, c, THREE.Triangle.normal( vA, vB, vC ) );\r\n\t\t\tintersection.faceIndex = a;\r\n\r\n\t\t}\r\n\r\n\t\treturn intersection;\r\n\r\n\t}\r\n\r\n\treturn function raycast( raycaster, intersects ) {\r\n\r\n\t\tvar geometry = this.geometry;\r\n\t\tvar material = this.material;\r\n\t\tvar matrixWorld = this.matrixWorld;\r\n\r\n\t\tif ( material === undefined ) return;\r\n\r\n\t\t// Checking boundingSphere distance to ray\r\n\r\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\r\n\r\n\t\tsphere.copy( geometry.boundingSphere );\r\n\t\tsphere.applyMatrix4( matrixWorld );\r\n\r\n\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\r\n\r\n\t\t//\r\n\r\n\t\tinverseMatrix.getInverse( matrixWorld );\r\n\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\r\n\r\n\t\t// Check boundingBox before continuing\r\n\r\n\t\tif ( geometry.boundingBox !== null ) {\r\n\r\n\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\r\n\r\n\t\t}\r\n\r\n\t\tvar uvs, intersection;\r\n\r\n\t\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\tvar a, b, c;\r\n\t\t\tvar index = geometry.index;\r\n\t\t\tvar attributes = geometry.attributes;\r\n\t\t\tvar positions = attributes.position.array;\r\n\r\n\t\t\tif ( attributes.uv !== undefined ) {\r\n\r\n\t\t\t\tuvs = attributes.uv.array;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( index !== null ) {\r\n\r\n\t\t\t\tvar indices = index.array;\r\n\r\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\ta = indices[ i ];\r\n\t\t\t\t\tb = indices[ i + 1 ];\r\n\t\t\t\t\tc = indices[ i + 2 ];\r\n\r\n\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\r\n\r\n\t\t\t\t\tif ( intersection ) {\r\n\r\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\r\n\t\t\t\t\t\tintersects.push( intersection );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\r\n\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\r\n\r\n\t\t\t\t\ta = i / 3;\r\n\t\t\t\t\tb = a + 1;\r\n\t\t\t\t\tc = a + 2;\r\n\r\n\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\r\n\r\n\t\t\t\t\tif ( intersection ) {\r\n\r\n\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\r\n\t\t\t\t\t\tintersects.push( intersection );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\tvar fvA, fvB, fvC;\r\n\t\t\tvar isFaceMaterial = material instanceof THREE.MultiMaterial;\r\n\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\r\n\r\n\t\t\tvar vertices = geometry.vertices;\r\n\t\t\tvar faces = geometry.faces;\r\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\r\n\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\r\n\r\n\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tvar face = faces[ f ];\r\n\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\r\n\r\n\t\t\t\tif ( faceMaterial === undefined ) continue;\r\n\r\n\t\t\t\tfvA = vertices[ face.a ];\r\n\t\t\t\tfvB = vertices[ face.b ];\r\n\t\t\t\tfvC = vertices[ face.c ];\r\n\r\n\t\t\t\tif ( faceMaterial.morphTargets === true ) {\r\n\r\n\t\t\t\t\tvar morphTargets = geometry.morphTargets;\r\n\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\r\n\r\n\t\t\t\t\tvA.set( 0, 0, 0 );\r\n\t\t\t\t\tvB.set( 0, 0, 0 );\r\n\t\t\t\t\tvC.set( 0, 0, 0 );\r\n\r\n\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\r\n\r\n\t\t\t\t\t\tvar influence = morphInfluences[ t ];\r\n\r\n\t\t\t\t\t\tif ( influence === 0 ) continue;\r\n\r\n\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\r\n\r\n\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\r\n\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\r\n\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvA.add( fvA );\r\n\t\t\t\t\tvB.add( fvB );\r\n\t\t\t\t\tvC.add( fvC );\r\n\r\n\t\t\t\t\tfvA = vA;\r\n\t\t\t\t\tfvB = vB;\r\n\t\t\t\t\tfvC = vC;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\r\n\r\n\t\t\t\tif ( intersection ) {\r\n\r\n\t\t\t\t\tif ( uvs ) {\r\n\r\n\t\t\t\t\t\tvar uvs_f = uvs[ f ];\r\n\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\r\n\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\r\n\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\r\n\r\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tintersection.face = face;\r\n\t\t\t\t\tintersection.faceIndex = f;\r\n\t\t\t\t\tintersects.push( intersection );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}() );\r\n\r\nTHREE.Mesh.prototype.clone = function () {\r\n\r\n\treturn new this.constructor( this.geometry, this.material ).copy( this );\r\n\r\n};\r\n\r\n// File:src/objects/Bone.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author ikerr / http://verold.com\r\n */\r\n\r\nTHREE.Bone = function ( skin ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Bone';\r\n\r\n\tthis.skin = skin;\r\n\r\n};\r\n\r\nTHREE.Bone.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Bone.prototype.constructor = THREE.Bone;\r\n\r\nTHREE.Bone.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Object3D.prototype.copy.call( this, source );\r\n\r\n\tthis.skin = source.skin;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/objects/Skeleton.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author michael guerrero / http://realitymeltdown.com\r\n * @author ikerr / http://verold.com\r\n */\r\n\r\nTHREE.Skeleton = function ( bones, boneInverses, useVertexTexture ) {\r\n\r\n\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\r\n\r\n\tthis.identityMatrix = new THREE.Matrix4();\r\n\r\n\t// copy the bone array\r\n\r\n\tbones = bones || [];\r\n\r\n\tthis.bones = bones.slice( 0 );\r\n\r\n\t// create a bone texture or an array of floats\r\n\r\n\tif ( this.useVertexTexture ) {\r\n\r\n\t\t// layout (1 matrix = 4 pixels)\r\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\r\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\r\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\r\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\r\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\r\n\r\n\t\t\r\n\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\r\n\t\tsize = THREE.Math.nextPowerOfTwo( Math.ceil( size ) );\r\n\t\tsize = Math.max( size, 4 );\r\n\r\n\t\tthis.boneTextureWidth = size;\r\n\t\tthis.boneTextureHeight = size;\r\n\r\n\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\r\n\t\tthis.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType );\r\n\r\n\t} else {\r\n\r\n\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\r\n\r\n\t}\r\n\r\n\t// use the supplied bone inverses or calculate the inverses\r\n\r\n\tif ( boneInverses === undefined ) {\r\n\r\n\t\tthis.calculateInverses();\r\n\r\n\t} else {\r\n\r\n\t\tif ( this.bones.length === boneInverses.length ) {\r\n\r\n\t\t\tthis.boneInverses = boneInverses.slice( 0 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\r\n\r\n\t\t\tthis.boneInverses = [];\r\n\r\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\t\t\tthis.boneInverses.push( new THREE.Matrix4() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Skeleton.prototype.calculateInverses = function () {\r\n\r\n\tthis.boneInverses = [];\r\n\r\n\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\tvar inverse = new THREE.Matrix4();\r\n\r\n\t\tif ( this.bones[ b ] ) {\r\n\r\n\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\r\n\r\n\t\t}\r\n\r\n\t\tthis.boneInverses.push( inverse );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Skeleton.prototype.pose = function () {\r\n\r\n\tvar bone;\r\n\r\n\t// recover the bind-time world matrices\r\n\r\n\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\tbone = this.bones[ b ];\r\n\r\n\t\tif ( bone ) {\r\n\r\n\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// compute the local matrices, positions, rotations and scales\r\n\r\n\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\tbone = this.bones[ b ];\r\n\r\n\t\tif ( bone ) {\r\n\r\n\t\t\tif ( bone.parent ) {\r\n\r\n\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\r\n\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbone.matrix.copy( bone.matrixWorld );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Skeleton.prototype.update = ( function () {\r\n\r\n\tvar offsetMatrix = new THREE.Matrix4();\r\n\r\n\treturn function update() {\r\n\r\n\t\t// flatten bone matrices to array\r\n\r\n\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\t\t// compute the offset between the current and the original transform\r\n\r\n\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\r\n\r\n\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\r\n\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.useVertexTexture ) {\r\n\r\n\t\t\tthis.boneTexture.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nTHREE.Skeleton.prototype.clone = function () {\r\n\r\n\treturn new THREE.Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\r\n\r\n};\r\n\r\n// File:src/objects/SkinnedMesh.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author ikerr / http://verold.com\r\n */\r\n\r\nTHREE.SkinnedMesh = function ( geometry, material, useVertexTexture ) {\r\n\r\n\tTHREE.Mesh.call( this, geometry, material );\r\n\r\n\tthis.type = 'SkinnedMesh';\r\n\r\n\tthis.bindMode = \"attached\";\r\n\tthis.bindMatrix = new THREE.Matrix4();\r\n\tthis.bindMatrixInverse = new THREE.Matrix4();\r\n\r\n\t// init bones\r\n\r\n\t// TODO: remove bone creation as there is no reason (other than\r\n\t// convenience) for THREE.SkinnedMesh to do this.\r\n\r\n\tvar bones = [];\r\n\r\n\tif ( this.geometry && this.geometry.bones !== undefined ) {\r\n\r\n\t\tvar bone, gbone;\r\n\r\n\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\r\n\r\n\t\t\tgbone = this.geometry.bones[ b ];\r\n\r\n\t\t\tbone = new THREE.Bone( this );\r\n\t\t\tbones.push( bone );\r\n\r\n\t\t\tbone.name = gbone.name;\r\n\t\t\tbone.position.fromArray( gbone.pos );\r\n\t\t\tbone.quaternion.fromArray( gbone.rotq );\r\n\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\r\n\r\n\t\t\tgbone = this.geometry.bones[ b ];\r\n\r\n\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\r\n\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\r\n\r\n\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.add( bones[ b ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.normalizeSkinWeights();\r\n\r\n\tthis.updateMatrixWorld( true );\r\n\tthis.bind( new THREE.Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\r\n\r\n};\r\n\r\n\r\nTHREE.SkinnedMesh.prototype = Object.create( THREE.Mesh.prototype );\r\nTHREE.SkinnedMesh.prototype.constructor = THREE.SkinnedMesh;\r\n\r\nTHREE.SkinnedMesh.prototype.bind = function( skeleton, bindMatrix ) {\r\n\r\n\tthis.skeleton = skeleton;\r\n\r\n\tif ( bindMatrix === undefined ) {\r\n\r\n\t\tthis.updateMatrixWorld( true );\r\n\r\n\t\tthis.skeleton.calculateInverses();\r\n\r\n\t\tbindMatrix = this.matrixWorld;\r\n\r\n\t}\r\n\r\n\tthis.bindMatrix.copy( bindMatrix );\r\n\tthis.bindMatrixInverse.getInverse( bindMatrix );\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.pose = function () {\r\n\r\n\tthis.skeleton.pose();\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.normalizeSkinWeights = function () {\r\n\r\n\tif ( this.geometry instanceof THREE.Geometry ) {\r\n\r\n\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\r\n\r\n\t\t\tvar sw = this.geometry.skinWeights[ i ];\r\n\r\n\t\t\tvar scale = 1.0 / sw.lengthManhattan();\r\n\r\n\t\t\tif ( scale !== Infinity ) {\r\n\r\n\t\t\t\tsw.multiplyScalar( scale );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t} else if ( this.geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\tvar vec = new THREE.Vector4();\r\n\r\n\t\tvar skinWeight = this.geometry.attributes.skinWeight;\r\n\r\n\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\r\n\r\n\t\t\tvec.x = skinWeight.getX( i );\r\n\t\t\tvec.y = skinWeight.getY( i );\r\n\t\t\tvec.z = skinWeight.getZ( i );\r\n\t\t\tvec.w = skinWeight.getW( i );\r\n\r\n\t\t\tvar scale = 1.0 / vec.lengthManhattan();\r\n\r\n\t\t\tif ( scale !== Infinity ) {\r\n\r\n\t\t\t\tvec.multiplyScalar( scale );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\r\n\r\n\t\t\t}\r\n\r\n\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.updateMatrixWorld = function( force ) {\r\n\r\n\tTHREE.Mesh.prototype.updateMatrixWorld.call( this, true );\r\n\r\n\tif ( this.bindMode === \"attached\" ) {\r\n\r\n\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\r\n\r\n\t} else if ( this.bindMode === \"detached\" ) {\r\n\r\n\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.clone = function() {\r\n\r\n\treturn new this.constructor( this.geometry, this.material, this.useVertexTexture ).copy( this );\r\n\r\n};\r\n\r\n// File:src/objects/LOD.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.LOD = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'LOD';\r\n\r\n\tObject.defineProperties( this, {\r\n\t\tlevels: {\r\n\t\t\tenumerable: true,\r\n\t\t\tvalue: []\r\n\t\t}\r\n\t} );\r\n\r\n};\r\n\r\n\r\nTHREE.LOD.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.LOD.prototype.constructor = THREE.LOD;\r\n\r\nTHREE.LOD.prototype.addLevel = function ( object, distance ) {\r\n\r\n\tif ( distance === undefined ) distance = 0;\r\n\r\n\tdistance = Math.abs( distance );\r\n\r\n\tvar levels = this.levels;\r\n\r\n\tfor ( var l = 0; l < levels.length; l ++ ) {\r\n\r\n\t\tif ( distance < levels[ l ].distance ) {\r\n\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tlevels.splice( l, 0, { distance: distance, object: object } );\r\n\r\n\tthis.add( object );\r\n\r\n};\r\n\r\nTHREE.LOD.prototype.getObjectForDistance = function ( distance ) {\r\n\r\n\tvar levels = this.levels;\r\n\r\n\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\r\n\r\n\t\tif ( distance < levels[ i ].distance ) {\r\n\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn levels[ i - 1 ].object;\r\n\r\n};\r\n\r\nTHREE.LOD.prototype.raycast = ( function () {\r\n\r\n\tvar matrixPosition = new THREE.Vector3();\r\n\r\n\treturn function raycast( raycaster, intersects ) {\r\n\r\n\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\r\n\r\n\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\r\n\r\n\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\r\n\r\n\t};\r\n\r\n}() );\r\n\r\nTHREE.LOD.prototype.update = function () {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\r\n\treturn function update( camera ) {\r\n\r\n\t\tvar levels = this.levels;\r\n\r\n\t\tif ( levels.length > 1 ) {\r\n\r\n\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\r\n\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\r\n\r\n\t\t\tvar distance = v1.distanceTo( v2 );\r\n\r\n\t\t\tlevels[ 0 ].object.visible = true;\r\n\r\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tif ( distance >= levels[ i ].distance ) {\r\n\r\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\r\n\t\t\t\t\tlevels[ i ].object.visible = true;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( ; i < l; i ++ ) {\r\n\r\n\t\t\t\tlevels[ i ].object.visible = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.LOD.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Object3D.prototype.copy.call( this, source, false );\r\n\r\n\tvar levels = source.levels;\r\n\r\n\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\r\n\r\n\t\tvar level = levels[ i ];\r\n\r\n\t\tthis.addLevel( level.object.clone(), level.distance );\r\n\r\n\t}\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.LOD.prototype.toJSON = function ( meta ) {\r\n\r\n\tvar data = THREE.Object3D.prototype.toJSON.call( this, meta );\r\n\r\n\tdata.object.levels = [];\r\n\r\n\tvar levels = this.levels;\r\n\r\n\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\r\n\r\n\t\tvar level = levels[ i ];\r\n\r\n\t\tdata.object.levels.push( {\r\n\t\t\tobject: level.object.uuid,\r\n\t\t\tdistance: level.distance\r\n\t\t} );\r\n\r\n\t}\r\n\r\n\treturn data;\r\n\r\n};\r\n\r\n// File:src/objects/Sprite.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Sprite = ( function () {\r\n\r\n\tvar indices = new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] );\r\n\tvar vertices = new Float32Array( [ - 0.5, - 0.5, 0, 0.5, - 0.5, 0, 0.5, 0.5, 0, - 0.5, 0.5, 0 ] );\r\n\tvar uvs = new Float32Array( [ 0, 0, 1, 0, 1, 1, 0, 1 ] );\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\r\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\r\n\tgeometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\r\n\r\n\treturn function Sprite( material ) {\r\n\r\n\t\tTHREE.Object3D.call( this );\r\n\r\n\t\tthis.type = 'Sprite';\r\n\r\n\t\tthis.geometry = geometry;\r\n\t\tthis.material = ( material !== undefined ) ? material : new THREE.SpriteMaterial();\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nTHREE.Sprite.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Sprite.prototype.constructor = THREE.Sprite;\r\n\r\nTHREE.Sprite.prototype.raycast = ( function () {\r\n\r\n\tvar matrixPosition = new THREE.Vector3();\r\n\r\n\treturn function raycast( raycaster, intersects ) {\r\n\r\n\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\r\n\r\n\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\r\n\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\r\n\r\n\t\tif ( distanceSq > guessSizeSq ) {\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tintersects.push( {\r\n\r\n\t\t\tdistance: Math.sqrt( distanceSq ),\r\n\t\t\tpoint: this.position,\r\n\t\t\tface: null,\r\n\t\t\tobject: this\r\n\r\n\t\t} );\r\n\r\n\t};\r\n\r\n}() );\r\n\r\nTHREE.Sprite.prototype.clone = function () {\r\n\r\n\treturn new this.constructor( this.material ).copy( this );\r\n\r\n};\r\n\r\n// Backwards compatibility\r\n\r\nTHREE.Particle = THREE.Sprite;\r\n\r\n// File:src/objects/LensFlare.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.LensFlare = function ( texture, size, distance, blending, color ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.lensFlares = [];\r\n\r\n\tthis.positionScreen = new THREE.Vector3();\r\n\tthis.customUpdateCallback = undefined;\r\n\r\n\tif ( texture !== undefined ) {\r\n\r\n\t\tthis.add( texture, size, distance, blending, color );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.LensFlare.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.LensFlare.prototype.constructor = THREE.LensFlare;\r\n\r\n\r\n/*\r\n * Add: adds another flare\r\n */\r\n\r\nTHREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) {\r\n\r\n\tif ( size === undefined ) size = - 1;\r\n\tif ( distance === undefined ) distance = 0;\r\n\tif ( opacity === undefined ) opacity = 1;\r\n\tif ( color === undefined ) color = new THREE.Color( 0xffffff );\r\n\tif ( blending === undefined ) blending = THREE.NormalBlending;\r\n\r\n\tdistance = Math.min( distance, Math.max( 0, distance ) );\r\n\r\n\tthis.lensFlares.push( {\r\n\t\ttexture: texture,\t// THREE.Texture\r\n\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\r\n\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\r\n\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\r\n\t\tscale: 1, \t\t// scale\r\n\t\trotation: 0, \t\t// rotation\r\n\t\topacity: opacity,\t// opacity\r\n\t\tcolor: color,\t\t// color\r\n\t\tblending: blending\t// blending\r\n\t} );\r\n\r\n};\r\n\r\n/*\r\n * Update lens flares update positions on all flares based on the screen position\r\n * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\r\n */\r\n\r\nTHREE.LensFlare.prototype.updateLensFlares = function () {\r\n\r\n\tvar f, fl = this.lensFlares.length;\r\n\tvar flare;\r\n\tvar vecX = - this.positionScreen.x * 2;\r\n\tvar vecY = - this.positionScreen.y * 2;\r\n\r\n\tfor ( f = 0; f < fl; f ++ ) {\r\n\r\n\t\tflare = this.lensFlares[ f ];\r\n\r\n\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\r\n\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\r\n\r\n\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\r\n\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.LensFlare.prototype.copy = function ( source ) {\r\n\r\n\tTHREE.Object3D.prototype.copy.call( this, source );\r\n\r\n\tthis.positionScreen.copy( source.positionScreen );\r\n\tthis.customUpdateCallback = source.customUpdateCallback;\r\n\r\n\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\r\n\r\n\t\tthis.lensFlares.push( source.lensFlares[ i ] );\r\n\r\n\t}\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/scenes/Scene.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Scene = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.type = 'Scene';\r\n\r\n\tthis.fog = null;\r\n\tthis.overrideMaterial = null;\r\n\r\n\tthis.autoUpdate = true; // checked by the renderer\r\n\r\n};\r\n\r\nTHREE.Scene.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.Scene.prototype.constructor = THREE.Scene;\r\n\r\nTHREE.Scene.prototype.copy = function ( source, recursive ) {\r\n\r\n\tTHREE.Object3D.prototype.copy.call( this, source, recursive );\r\n\r\n\tif ( source.fog !== null ) this.fog = source.fog.clone();\r\n\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\r\n\r\n\tthis.autoUpdate = source.autoUpdate;\r\n\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n// File:src/scenes/Fog.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Fog = function ( color, near, far ) {\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.color = new THREE.Color( color );\r\n\r\n\tthis.near = ( near !== undefined ) ? near : 1;\r\n\tthis.far = ( far !== undefined ) ? far : 1000;\r\n\r\n};\r\n\r\nTHREE.Fog.prototype.clone = function () {\r\n\r\n\treturn new THREE.Fog( this.color.getHex(), this.near, this.far );\r\n\r\n};\r\n\r\n// File:src/scenes/FogExp2.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.FogExp2 = function ( color, density ) {\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.color = new THREE.Color( color );\r\n\tthis.density = ( density !== undefined ) ? density : 0.00025;\r\n\r\n};\r\n\r\nTHREE.FogExp2.prototype.clone = function () {\r\n\r\n\treturn new THREE.FogExp2( this.color.getHex(), this.density );\r\n\r\n};\r\n\r\n// File:src/renderers/shaders/ShaderChunk.js\r\n\r\nTHREE.ShaderChunk = {};\r\n\r\n// File:src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'alphamap_fragment' ] = \"#ifdef USE_ALPHAMAP\\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'alphamap_pars_fragment' ] = \"#ifdef USE_ALPHAMAP\\n\tuniform sampler2D alphaMap;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'alphatest_fragment' ] = \"#ifdef ALPHATEST\\n\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/aomap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'aomap_pars_fragment' ] = \"#ifdef USE_AOMAP\\n\tuniform sampler2D aoMap;\\n\tuniform float aoMapIntensity;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/begin_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'begin_vertex' ] = \"\\nvec3 transformed = vec3( position );\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'beginnormal_vertex' ] = \"\\nvec3 objectNormal = vec3( normal );\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/bsdfs.glsl\r\n\r\nTHREE.ShaderChunk[ 'bsdfs' ] = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\t\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\t\t}\\n\t\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}\\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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 = dFdx( surf_pos );\\n\t\tvec3 vSigmaY = dFdy( surf_pos );\\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\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\t}\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'clipping_planes_fragment' ] = \"#if NUM_CLIPPING_PLANES > 0\\n\tfor ( int i = 0; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\t\tvec4 plane = clippingPlanes[ i ];\\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\t}\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'clipping_planes_pars_vertex' ] = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\tvarying vec3 vViewPosition;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'clipping_planes_vertex' ] = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/color_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'color_fragment' ] = \"#ifdef USE_COLOR\\n\tdiffuseColor.rgb *= vColor;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'color_pars_fragment' ] = \"#ifdef USE_COLOR\\n\tvarying vec3 vColor;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'color_pars_vertex' ] = \"#ifdef USE_COLOR\\n\tvarying vec3 vColor;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/color_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'color_vertex' ] = \"#ifdef USE_COLOR\\n\tvColor.xyz = color.xyz;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/common.glsl\r\n\r\nTHREE.ShaderChunk[ 'common' ] = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\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}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'cube_uv_reflection_fragment' ] = \"#ifdef ENVMAP_TYPE_CUBE_UV\\nconst float 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}\\nfloat cubeUV_maxLods1 = log2(cubeUV_textureSize*0.25) - 1.0;\\nfloat 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}\\nfloat cubeUV_maxLods2 = log2(cubeUV_textureSize*0.25) - 2.0;\\nconst float 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}\\nfloat 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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'defaultnormal_vertex' ] = \"#ifdef FLIP_SIDED\\n\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'displacementmap_vertex' ] = \"#ifdef USE_DISPLACEMENTMAP\\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'displacementmap_pars_vertex' ] = \"#ifdef USE_DISPLACEMENTMAP\\n\tuniform sampler2D displacementMap;\\n\tuniform float displacementScale;\\n\tuniform float displacementBias;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'emissivemap_fragment' ] = \"#ifdef USE_EMISSIVEMAP\\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'emissivemap_pars_fragment' ] = \"#ifdef USE_EMISSIVEMAP\\n\tuniform sampler2D emissiveMap;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'encodings_pars_fragment' ] = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return 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 return 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 return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return 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 vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return 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 float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/encodings_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'encodings_fragment' ] = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/envmap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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 DOUBLE_SIDED\\n\t\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\t#else\\n\t\tfloat flipNormal = 1.0;\\n\t#endif\\n\t#ifdef ENVMAP_TYPE_CUBE\\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\t\tvec2 sampleUV;\\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\\n\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\t\tvec3 reflectView = flipNormal * 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#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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'envmap_pars_fragment' ] = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\tuniform float reflectivity;\\n\tuniform float envMapIntenstiy;\\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\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/envmap_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/fog_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'fog_fragment' ] = \"#ifdef USE_FOG\\n\t#ifdef USE_LOGDEPTHBUF_EXT\\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\t#else\\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\t#endif\\n\t#ifdef FOG_EXP2\\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\t#else\\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\t#endif\\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'fog_pars_fragment' ] = \"#ifdef USE_FOG\\n\tuniform vec3 fogColor;\\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'lightmap_fragment' ] = \"#ifdef USE_LIGHTMAP\\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'lightmap_pars_fragment' ] = \"#ifdef USE_LIGHTMAP\\n\tuniform sampler2D lightMap;\\n\tuniform float lightMapIntensity;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\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\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\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\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_pars.glsl\r\n\r\nTHREE.ShaderChunk[ 'lights_pars' ] = \"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};\\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\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\t\t\tdirectLight.color = pointLight.color;\\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.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_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 ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\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_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#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\t\t#ifdef DOUBLE_SIDED\\n\t\t\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\t\t#else\\n\t\t\tfloat flipNormal = 1.0;\\n\t\t#endif\\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\t\t#ifdef ENVMAP_TYPE_CUBE\\n\t\t\tvec3 queryVec = flipNormal * 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 = flipNormal * 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\t#ifdef DOUBLE_SIDED\\n\t\t\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\t\t#else\\n\t\t\tfloat flipNormal = 1.0;\\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 = flipNormal * 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 = flipNormal * 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 = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * 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 = flipNormal * 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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'lights_phong_fragment' ] = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\tvec3 irradiance = dotNL * directLight.color;\\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\t\tirradiance *= PI;\\n\t#endif\\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\t(0)\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\tmaterial.specularColor = mix( vec3( 0.16 * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'lights_physical_pars_fragment' ] = \"struct PhysicalMaterial {\\n\tvec3\tdiffuseColor;\\n\tfloat\tspecularRoughness;\\n\tvec3\tspecularColor;\\n\t#ifndef STANDARD\\n\t#endif\\n};\\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\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\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 GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\treflectedLight.indirectSpecular += radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n}\\n#define RE_Direct\t\t\t\tRE_Direct_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 )\\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/lights_template.glsl\r\n\r\nTHREE.ShaderChunk[ 'lights_template' ] = \"\\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\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 ] ) : 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\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\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 defined( RE_IndirectDiffuse )\\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\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 ( NUM_HEMI_LIGHTS > 0 )\\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\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\t#endif\\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\tRE_IndirectSpecular( radiance, geometry, material, reflectedLight );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'logdepthbuf_fragment' ] = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'logdepthbuf_vertex' ] = \"#ifdef USE_LOGDEPTHBUF\\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\t#ifdef USE_LOGDEPTHBUF_EXT\\n\t\tvFragDepth = 1.0 + gl_Position.w;\\n\t#else\\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\t#endif\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/map_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'map_fragment' ] = \"#ifdef USE_MAP\\n\tvec4 texelColor = texture2D( map, vUv );\\n\ttexelColor = mapTexelToLinear( texelColor );\\n\tdiffuseColor *= texelColor;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'map_pars_fragment' ] = \"#ifdef USE_MAP\\n\tuniform sampler2D map;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'map_particle_fragment' ] = \"#ifdef USE_MAP\\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'map_particle_pars_fragment' ] = \"#ifdef USE_MAP\\n\tuniform vec4 offsetRepeat;\\n\tuniform sampler2D map;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'metalnessmap_fragment' ] = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'metalnessmap_pars_fragment' ] = \"#ifdef USE_METALNESSMAP\\n\tuniform sampler2D metalnessMap;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/normal_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'normal_fragment' ] = \"#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 * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n\t#endif\\n#endif\\n#ifdef USE_NORMALMAP\\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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 = dFdx( eye_pos.xyz );\\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\\n\t\tvec2 st0 = dFdx( vUv.st );\\n\t\tvec2 st1 = dFdy( vUv.st );\\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\t\tvec3 N = normalize( surf_norm );\\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\t\tmapN.xy = normalScale * mapN.xy;\\n\t\tmat3 tsn = mat3( S, T, N );\\n\t\treturn normalize( tsn * mapN );\\n\t}\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/packing.glsl\r\n\r\nTHREE.ShaderChunk[ 'packing' ] = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nvec4 packDepthToRGBA( const in float value ) {\\n\tconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\n\tconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\n\tvec4 res = mod( value * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );\\n\tres -= res.xxyz * bit_mask;\\n\treturn res;\\n}\\nfloat unpackRGBAToDepth( const in vec4 rgba ) {\\n\tconst vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\n\treturn dot( rgba, bitSh );\\n}\\nfloat viewZToOrthoDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat OrthoDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'premultiplied_alpha_fragment' ] = \"#ifdef PREMULTIPLIED_ALPHA\\n\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/project_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'project_vertex' ] = \"#ifdef USE_SKINNING\\n\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'roughnessmap_fragment' ] = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'roughnessmap_pars_fragment' ] = \"#ifdef USE_ROUGHNESSMAP\\n\tuniform sampler2D roughnessMap;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\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\treturn (\\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\treturn (\\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\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\t\t#endif\\n\t\t}\\n\t\treturn 1.0;\\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 ) {\\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\t\tvec3 lightToPosition = shadowCoord.xyz;\\n\t\tvec3 bd3D = normalize( lightToPosition );\\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'shadowmap_vertex' ] = \"#ifdef USE_SHADOWMAP\\n\t#if NUM_DIR_LIGHTS > 0\\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\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\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\t}\\n\t#endif\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\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\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\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 ] ) : 1.0;\\n\t}\\n\t#endif\\n\t#endif\\n\treturn shadow;\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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 boneTextureWidth;\\n\t\tuniform int boneTextureHeight;\\n\t\tmat4 getBoneMatrix( const in float i ) {\\n\t\t\tfloat j = i * 4.0;\\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\\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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/skinning_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\tskinned = bindMatrixInverse * skinned;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'specularmap_pars_fragment' ] = \"#ifdef USE_SPECULARMAP\\n\tuniform sampler2D specularMap;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'tonemapping_fragment' ] = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'tonemapping_pars_fragment' ] = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return 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 color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n color = max( vec3( 0.0 ), color - 0.004 );\\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ 'uv2_pars_fragment' ] = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\tvarying vec2 vUv2;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'uv2_pars_vertex' ] = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\tattribute vec2 uv2;\\n\tvarying vec2 vUv2;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/uv2_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'uv2_vertex' ] = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\tvUv2 = uv2;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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 vec4 offsetRepeat;\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/uv_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ '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 = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\r\n\r\n// File:src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl\r\n\r\nTHREE.ShaderChunk[ 'worldpos_vertex' ] = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\t#ifdef USE_SKINNING\\n\t\tvec4 worldPosition = modelMatrix * skinned;\\n\t#else\\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\t#endif\\n#endif\\n\";\r\n\r\n// File:src/renderers/shaders/UniformsUtils.js\r\n\r\n/**\r\n * Uniform Utilities\r\n */\r\n\r\nTHREE.UniformsUtils = {\r\n\r\n\tmerge: function ( uniforms ) {\r\n\r\n\t\tvar merged = {};\r\n\r\n\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\r\n\r\n\t\t\tvar tmp = this.clone( uniforms[ u ] );\r\n\r\n\t\t\tfor ( var p in tmp ) {\r\n\r\n\t\t\t\tmerged[ p ] = tmp[ p ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn merged;\r\n\r\n\t},\r\n\r\n\tclone: function ( uniforms_src ) {\r\n\r\n\t\tvar uniforms_dst = {};\r\n\r\n\t\tfor ( var u in uniforms_src ) {\r\n\r\n\t\t\tuniforms_dst[ u ] = {};\r\n\r\n\t\t\tfor ( var p in uniforms_src[ u ] ) {\r\n\r\n\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\r\n\r\n\t\t\t\tif ( parameter_src instanceof THREE.Color ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Vector2 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Vector3 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Vector4 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Matrix3 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Matrix4 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Texture ) {\r\n\r\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\r\n\r\n\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\r\n\r\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn uniforms_dst;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/renderers/shaders/UniformsLib.js\r\n\r\n/**\r\n * Uniforms library for shared webgl shaders\r\n */\r\n\r\nTHREE.UniformsLib = {\r\n\r\n\tcommon: {\r\n\r\n\t\t\"diffuse\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\r\n\t\t\"opacity\": { type: \"1f\", value: 1.0 },\r\n\r\n\t\t\"map\": { type: \"t\", value: null },\r\n\t\t\"offsetRepeat\": { type: \"v4\", value: new THREE.Vector4( 0, 0, 1, 1 ) },\r\n\r\n\t\t\"specularMap\": { type: \"t\", value: null },\r\n\t\t\"alphaMap\": { type: \"t\", value: null },\r\n\r\n\t\t\"envMap\": { type: \"t\", value: null },\r\n\t\t\"flipEnvMap\": { type: \"1f\", value: - 1 },\r\n\t\t\"reflectivity\": { type: \"1f\", value: 1.0 },\r\n\t\t\"refractionRatio\": { type: \"1f\", value: 0.98 }\r\n\r\n\t},\r\n\r\n\taomap: {\r\n\r\n\t\t\"aoMap\": { type: \"t\", value: null },\r\n\t\t\"aoMapIntensity\": { type: \"1f\", value: 1 }\r\n\r\n\t},\r\n\r\n\tlightmap: {\r\n\r\n\t\t\"lightMap\": { type: \"t\", value: null },\r\n\t\t\"lightMapIntensity\": { type: \"1f\", value: 1 }\r\n\r\n\t},\r\n\r\n\temissivemap: {\r\n\r\n\t\t\"emissiveMap\": { type: \"t\", value: null }\r\n\r\n\t},\r\n\r\n\tbumpmap: {\r\n\r\n\t\t\"bumpMap\": { type: \"t\", value: null },\r\n\t\t\"bumpScale\": { type: \"1f\", value: 1 }\r\n\r\n\t},\r\n\r\n\tnormalmap: {\r\n\r\n\t\t\"normalMap\": { type: \"t\", value: null },\r\n\t\t\"normalScale\": { type: \"v2\", value: new THREE.Vector2( 1, 1 ) }\r\n\r\n\t},\r\n\r\n\tdisplacementmap: {\r\n\r\n\t\t\"displacementMap\": { type: \"t\", value: null },\r\n\t\t\"displacementScale\": { type: \"1f\", value: 1 },\r\n\t\t\"displacementBias\": { type: \"1f\", value: 0 }\r\n\r\n\t},\r\n\r\n\troughnessmap: {\r\n\r\n\t\t\"roughnessMap\": { type: \"t\", value: null }\r\n\r\n\t},\r\n\r\n\tmetalnessmap: {\r\n\r\n\t\t\"metalnessMap\": { type: \"t\", value: null }\r\n\r\n\t},\r\n\r\n\tfog: {\r\n\r\n\t\t\"fogDensity\": { type: \"1f\", value: 0.00025 },\r\n\t\t\"fogNear\": { type: \"1f\", value: 1 },\r\n\t\t\"fogFar\": { type: \"1f\", value: 2000 },\r\n\t\t\"fogColor\": { type: \"c\", value: new THREE.Color( 0xffffff ) }\r\n\r\n\t},\r\n\r\n\tlights: {\r\n\r\n\t\t\"ambientLightColor\": { type: \"3fv\", value: [] },\r\n\r\n\t\t\"directionalLights\": { type: \"sa\", value: [], properties: {\r\n\t\t\t\"direction\": { type: \"v3\" },\r\n\t\t\t\"color\": { type: \"c\" },\r\n\r\n\t\t\t\"shadow\": { type: \"1i\" },\r\n\t\t\t\"shadowBias\": { type: \"1f\" },\r\n\t\t\t\"shadowRadius\": { type: \"1f\" },\r\n\t\t\t\"shadowMapSize\": { type: \"v2\" }\r\n\t\t} },\r\n\r\n\t\t\"directionalShadowMap\": { type: \"tv\", value: [] },\r\n\t\t\"directionalShadowMatrix\": { type: \"m4v\", value: [] },\r\n\r\n\t\t\"spotLights\": { type: \"sa\", value: [], properties: {\r\n\t\t\t\"color\": { type: \"c\" },\r\n\t\t\t\"position\": { type: \"v3\" },\r\n\t\t\t\"direction\": { type: \"v3\" },\r\n\t\t\t\"distance\": { type: \"1f\" },\r\n\t\t\t\"coneCos\": { type: \"1f\" },\r\n\t\t\t\"penumbraCos\": { type: \"1f\" },\r\n\t\t\t\"decay\": { type: \"1f\" },\r\n\r\n\t\t\t\"shadow\": { type: \"1i\" },\r\n\t\t\t\"shadowBias\": { type: \"1f\" },\r\n\t\t\t\"shadowRadius\": { type: \"1f\" },\r\n\t\t\t\"shadowMapSize\": { type: \"v2\" }\r\n\t\t} },\r\n\r\n\t\t\"spotShadowMap\": { type: \"tv\", value: [] },\r\n\t\t\"spotShadowMatrix\": { type: \"m4v\", value: [] },\r\n\r\n\t\t\"pointLights\": { type: \"sa\", value: [], properties: {\r\n\t\t\t\"color\": { type: \"c\" },\r\n\t\t\t\"position\": { type: \"v3\" },\r\n\t\t\t\"decay\": { type: \"1f\" },\r\n\t\t\t\"distance\": { type: \"1f\" },\r\n\r\n\t\t\t\"shadow\": { type: \"1i\" },\r\n\t\t\t\"shadowBias\": { type: \"1f\" },\r\n\t\t\t\"shadowRadius\": { type: \"1f\" },\r\n\t\t\t\"shadowMapSize\": { type: \"v2\" }\r\n\t\t} },\r\n\r\n\t\t\"pointShadowMap\": { type: \"tv\", value: [] },\r\n\t\t\"pointShadowMatrix\": { type: \"m4v\", value: [] },\r\n\r\n\t\t\"hemisphereLights\": { type: \"sa\", value: [], properties: {\r\n\t\t\t\"direction\": { type: \"v3\" },\r\n\t\t\t\"skyColor\": { type: \"c\" },\r\n\t\t\t\"groundColor\": { type: \"c\" }\r\n\t\t} }\r\n\r\n\t},\r\n\r\n\tpoints: {\r\n\r\n\t\t\"diffuse\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\r\n\t\t\"opacity\": { type: \"1f\", value: 1.0 },\r\n\t\t\"size\": { type: \"1f\", value: 1.0 },\r\n\t\t\"scale\": { type: \"1f\", value: 1.0 },\r\n\t\t\"map\": { type: \"t\", value: null },\r\n\t\t\"offsetRepeat\": { type: \"v4\", value: new THREE.Vector4( 0, 0, 1, 1 ) }\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/renderers/shaders/ShaderLib/cube_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'cube_frag' ] = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/cube_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'cube_vert' ] = \"varying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main() {\\n\tvWorldPosition = transformDirection( position, modelMatrix );\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/depth_frag.glsl\r\n\r\nTHREE.ShaderChunk[ '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( gl_FragCoord.z ), opacity );\\n\t#elif DEPTH_PACKING == 3201\\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\t#endif\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/depth_vert.glsl\r\n\r\nTHREE.ShaderChunk[ '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#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'distanceRGBA_frag' ] = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\t#include \\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'distanceRGBA_vert' ] = \"varying vec4 vWorldPosition;\\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\tvWorldPosition = worldPosition;\\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/equirect_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'equirect_frag' ] = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\tvec3 direction = normalize( vWorldPosition );\\n\tvec2 sampleUV;\\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/equirect_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'equirect_vert' ] = \"varying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main() {\\n\tvWorldPosition = transformDirection( position, modelMatrix );\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/linedashed_frag.glsl\r\n\r\nTHREE.ShaderChunk[ '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\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/linedashed_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'linedashed_vert' ] = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\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}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshbasic_frag.glsl\r\n\r\nTHREE.ShaderChunk[ '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 \\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;\\n\treflectedLight.directDiffuse = vec3( 0.0 );\\n\treflectedLight.directSpecular = vec3( 0.0 );\\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\t#include \\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\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshbasic_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'meshbasic_vert' ] = \"#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}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshlambert_frag.glsl\r\n\r\nTHREE.ShaderChunk[ '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 \\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}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshlambert_vert.glsl\r\n\r\nTHREE.ShaderChunk[ '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 \\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 \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshphong_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'meshphong_frag' ] = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\tvec3 totalEmissiveRadiance = emissive;\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\t#include \\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshphong_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'meshphong_vert' ] = \"#define PHONG\\nvarying vec3 vViewPosition;\\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 \\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#ifndef FLAT_SHADED\\n\tvNormal = normalize( transformedNormal );\\n#endif\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\tvViewPosition = - mvPosition.xyz;\\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshphysical_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'meshphysical_frag' ] = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\tvec3 totalEmissiveRadiance = emissive;\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/meshphysical_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'meshphysical_vert' ] = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\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 \\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#ifndef FLAT_SHADED\\n\tvNormal = normalize( transformedNormal );\\n#endif\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\tvViewPosition = - mvPosition.xyz;\\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/normal_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'normal_frag' ] = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/normal_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'normal_vert' ] = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\tvNormal = normalize( normalMatrix * normal );\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/points_frag.glsl\r\n\r\nTHREE.ShaderChunk[ 'points_frag' ] = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\tvec3 outgoingLight = vec3( 0.0 );\\n\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\t#include \\n\t#include \\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\";\r\n\r\n// File:src/renderers/shaders/ShaderLib/points_vert.glsl\r\n\r\nTHREE.ShaderChunk[ 'points_vert' ] = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\t#include \\n\t#include \\n\t#include \\n\t#ifdef USE_SIZEATTENUATION\\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\t#else\\n\t\tgl_PointSize = size;\\n\t#endif\\n\t#include \\n\t#include \\n\t#include \\n\t#include \\n}\\n\";\r\n\r\n// File:src/renderers/shaders/ShaderLib.js\r\n\r\n/**\r\n * Webgl Shader Library for three.js\r\n *\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n */\r\n\r\n\r\nTHREE.ShaderLib = {\r\n\r\n\t'basic': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'common' ],\r\n\t\t\tTHREE.UniformsLib[ 'aomap' ],\r\n\t\t\tTHREE.UniformsLib[ 'fog' ]\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'meshbasic_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'meshbasic_frag' ]\r\n\r\n\t},\r\n\r\n\t'lambert': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'common' ],\r\n\t\t\tTHREE.UniformsLib[ 'aomap' ],\r\n\t\t\tTHREE.UniformsLib[ 'lightmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'emissivemap' ],\r\n\t\t\tTHREE.UniformsLib[ 'fog' ],\r\n\t\t\tTHREE.UniformsLib[ 'lights' ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"emissive\" : { type: \"c\", value: new THREE.Color( 0x000000 ) }\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'meshlambert_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'meshlambert_frag' ]\r\n\r\n\t},\r\n\r\n\t'phong': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'common' ],\r\n\t\t\tTHREE.UniformsLib[ 'aomap' ],\r\n\t\t\tTHREE.UniformsLib[ 'lightmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'emissivemap' ],\r\n\t\t\tTHREE.UniformsLib[ 'bumpmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'normalmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'displacementmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'fog' ],\r\n\t\t\tTHREE.UniformsLib[ 'lights' ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"emissive\" : { type: \"c\", value: new THREE.Color( 0x000000 ) },\r\n\t\t\t\t\"specular\" : { type: \"c\", value: new THREE.Color( 0x111111 ) },\r\n\t\t\t\t\"shininess\": { type: \"1f\", value: 30 }\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'meshphong_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'meshphong_frag' ]\r\n\r\n\t},\r\n\r\n\t'standard': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'common' ],\r\n\t\t\tTHREE.UniformsLib[ 'aomap' ],\r\n\t\t\tTHREE.UniformsLib[ 'lightmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'emissivemap' ],\r\n\t\t\tTHREE.UniformsLib[ 'bumpmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'normalmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'displacementmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'roughnessmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'metalnessmap' ],\r\n\t\t\tTHREE.UniformsLib[ 'fog' ],\r\n\t\t\tTHREE.UniformsLib[ 'lights' ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"emissive\" : { type: \"c\", value: new THREE.Color( 0x000000 ) },\r\n\t\t\t\t\"roughness\": { type: \"1f\", value: 0.5 },\r\n\t\t\t\t\"metalness\": { type: \"1f\", value: 0 },\r\n\t\t\t\t\"envMapIntensity\" : { type: \"1f\", value: 1 } // temporary\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'meshphysical_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'meshphysical_frag' ]\r\n\r\n\t},\r\n\r\n\t'points': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'points' ],\r\n\t\t\tTHREE.UniformsLib[ 'fog' ]\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'points_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'points_frag' ]\r\n\r\n\t},\r\n\r\n\t'dashed': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'common' ],\r\n\t\t\tTHREE.UniformsLib[ 'fog' ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"scale\" : { type: \"1f\", value: 1 },\r\n\t\t\t\t\"dashSize\" : { type: \"1f\", value: 1 },\r\n\t\t\t\t\"totalSize\": { type: \"1f\", value: 2 }\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'linedashed_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'linedashed_frag' ]\r\n\r\n\t},\r\n\r\n\t'depth': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ 'common' ],\r\n\t\t\tTHREE.UniformsLib[ 'displacementmap' ]\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'depth_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'depth_frag' ]\r\n\r\n\t},\r\n\r\n\t'normal': {\r\n\r\n\t\tuniforms: {\r\n\r\n\t\t\t\"opacity\" : { type: \"1f\", value: 1.0 }\r\n\r\n\t\t},\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'normal_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'normal_frag' ]\r\n\r\n\t},\r\n\r\n\t/* -------------------------------------------------------------------------\r\n\t//\tCube map shader\r\n\t ------------------------------------------------------------------------- */\r\n\r\n\t'cube': {\r\n\r\n\t\tuniforms: {\r\n\t\t\t\"tCube\": { type: \"t\", value: null },\r\n\t\t\t\"tFlip\": { type: \"1f\", value: - 1 }\r\n\t\t},\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'cube_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'cube_frag' ]\r\n\r\n\t},\r\n\r\n\t/* -------------------------------------------------------------------------\r\n\t//\tCube map shader\r\n\t ------------------------------------------------------------------------- */\r\n\r\n\t'equirect': {\r\n\r\n\t\tuniforms: {\r\n\t\t\t\"tEquirect\": { type: \"t\", value: null },\r\n\t\t\t\"tFlip\": { type: \"1f\", value: - 1 }\r\n\t\t},\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'equirect_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'equirect_frag' ]\r\n\r\n\t},\r\n\r\n\t'distanceRGBA': {\r\n\r\n\t\tuniforms: {\r\n\r\n\t\t\t\"lightPos\": { type: \"v3\", value: new THREE.Vector3() }\r\n\r\n\t\t},\r\n\r\n\t\tvertexShader: THREE.ShaderChunk[ 'distanceRGBA_vert' ],\r\n\t\tfragmentShader: THREE.ShaderChunk[ 'distanceRGBA_frag' ]\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ShaderLib[ 'physical' ] = {\r\n\r\n\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\tTHREE.ShaderLib[ 'standard' ].uniforms,\r\n\r\n\t\t{\r\n\t\t\t// future\r\n\t\t}\r\n\r\n\t] ),\r\n\r\n\tvertexShader: THREE.ShaderChunk[ 'meshphysical_vert' ],\r\n\tfragmentShader: THREE.ShaderChunk[ 'meshphysical_frag' ]\r\n\r\n};\r\n\r\n\r\n// File:src/renderers/WebGLRenderer.js\r\n\r\n/**\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author szimek / https://github.com/szimek/\r\n * @author tschw\r\n */\r\n\r\nTHREE.WebGLRenderer = function ( parameters ) {\r\n\r\n\tconsole.log( 'THREE.WebGLRenderer', THREE.REVISION );\r\n\r\n\tparameters = parameters || {};\r\n\r\n\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ),\r\n\t_context = parameters.context !== undefined ? parameters.context : null,\r\n\r\n\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\r\n\t_depth = parameters.depth !== undefined ? parameters.depth : true,\r\n\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\r\n\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\r\n\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\r\n\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\r\n\r\n\tvar lights = [];\r\n\r\n\tvar opaqueObjects = [];\r\n\tvar opaqueObjectsLastIndex = - 1;\r\n\tvar transparentObjects = [];\r\n\tvar transparentObjectsLastIndex = - 1;\r\n\r\n\tvar morphInfluences = new Float32Array( 8 );\r\n\r\n\tvar sprites = [];\r\n\tvar lensFlares = [];\r\n\r\n\t// public properties\r\n\r\n\tthis.domElement = _canvas;\r\n\tthis.context = null;\r\n\r\n\t// clearing\r\n\r\n\tthis.autoClear = true;\r\n\tthis.autoClearColor = true;\r\n\tthis.autoClearDepth = true;\r\n\tthis.autoClearStencil = true;\r\n\r\n\t// scene graph\r\n\r\n\tthis.sortObjects = true;\r\n\r\n\t// user-defined clipping\r\n\r\n\tthis.clippingPlanes = [];\r\n\tthis.localClippingEnabled = false;\r\n\r\n\t// physically based shading\r\n\r\n\tthis.gammaFactor = 2.0;\t// for backwards compatibility\r\n\tthis.gammaInput = false;\r\n\tthis.gammaOutput = false;\r\n\r\n\t// physical lights\r\n\r\n\tthis.physicallyCorrectLights = false;\r\n\r\n\t// tone mapping\r\n\r\n\tthis.toneMapping = THREE.LinearToneMapping;\r\n\tthis.toneMappingExposure = 1.0;\r\n\tthis.toneMappingWhitePoint = 1.0;\r\n\r\n\t// morphs\r\n\r\n\tthis.maxMorphTargets = 8;\r\n\tthis.maxMorphNormals = 4;\r\n\r\n\t// flags\r\n\r\n\tthis.autoScaleCubemaps = true;\r\n\r\n\t// internal properties\r\n\r\n\tvar _this = this,\r\n\r\n\t// internal state cache\r\n\r\n\t_currentProgram = null,\r\n\t_currentRenderTarget = null,\r\n\t_currentFramebuffer = null,\r\n\t_currentMaterialId = - 1,\r\n\t_currentGeometryProgram = '',\r\n\t_currentCamera = null,\r\n\r\n\t_currentScissor = new THREE.Vector4(),\r\n\t_currentScissorTest = null,\r\n\r\n\t_currentViewport = new THREE.Vector4(),\r\n\r\n\t//\r\n\r\n\t_usedTextureUnits = 0,\r\n\r\n\t//\r\n\r\n\t_clearColor = new THREE.Color( 0x000000 ),\r\n\t_clearAlpha = 0,\r\n\r\n\t_width = _canvas.width,\r\n\t_height = _canvas.height,\r\n\r\n\t_pixelRatio = 1,\r\n\r\n\t_scissor = new THREE.Vector4( 0, 0, _width, _height ),\r\n\t_scissorTest = false,\r\n\r\n\t_viewport = new THREE.Vector4( 0, 0, _width, _height ),\r\n\r\n\t// frustum\r\n\r\n\t_frustum = new THREE.Frustum(),\r\n\r\n\t// clipping\r\n\r\n\t_clippingEnabled = false,\r\n\t_localClippingEnabled = false,\r\n\t_clipRenderingShadows = false,\r\n\r\n\t_numClippingPlanes = 0,\r\n\t_clippingPlanesUniform = {\r\n\t\t\ttype: '4fv', value: null, needsUpdate: false },\r\n\r\n\t_globalClippingState = null,\r\n\t_numGlobalClippingPlanes = 0,\r\n\r\n\t_matrix3 = new THREE.Matrix3(),\r\n\t_sphere = new THREE.Sphere(),\r\n\t_plane = new THREE.Plane(),\r\n\r\n\r\n\t// camera matrices cache\r\n\r\n\t_projScreenMatrix = new THREE.Matrix4(),\r\n\r\n\t_vector3 = new THREE.Vector3(),\r\n\r\n\t// light arrays cache\r\n\r\n\t_lights = {\r\n\r\n\t\thash: '',\r\n\r\n\t\tambient: [ 0, 0, 0 ],\r\n\t\tdirectional: [],\r\n\t\tdirectionalShadowMap: [],\r\n\t\tdirectionalShadowMatrix: [],\r\n\t\tspot: [],\r\n\t\tspotShadowMap: [],\r\n\t\tspotShadowMatrix: [],\r\n\t\tpoint: [],\r\n\t\tpointShadowMap: [],\r\n\t\tpointShadowMatrix: [],\r\n\t\themi: [],\r\n\r\n\t\tshadows: []\r\n\r\n\t},\r\n\r\n\t// info\r\n\r\n\t_infoMemory = {\r\n\r\n\t\tgeometries: 0,\r\n\t\ttextures: 0\r\n\r\n\t},\r\n\r\n\t_infoRender = {\r\n\r\n\t\tcalls: 0,\r\n\t\tvertices: 0,\r\n\t\tfaces: 0,\r\n\t\tpoints: 0\r\n\r\n\t};\r\n\r\n\tthis.info = {\r\n\r\n\t\trender: _infoRender,\r\n\t\tmemory: _infoMemory,\r\n\t\tprograms: null\r\n\r\n\t};\r\n\r\n\r\n\t// initialize\r\n\r\n\tvar _gl;\r\n\r\n\ttry {\r\n\r\n\t\tvar attributes = {\r\n\t\t\talpha: _alpha,\r\n\t\t\tdepth: _depth,\r\n\t\t\tstencil: _stencil,\r\n\t\t\tantialias: _antialias,\r\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\r\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\r\n\t\t};\r\n\r\n\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\r\n\r\n\t\tif ( _gl === null ) {\r\n\r\n\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\r\n\r\n\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthrow 'Error creating WebGL context.';\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\r\n\r\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\r\n\r\n\t\t\t_gl.getShaderPrecisionFormat = function () {\r\n\r\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\r\n\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\r\n\r\n\t} catch ( error ) {\r\n\r\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\r\n\r\n\t}\r\n\r\n\tvar _isWebGL2 = (typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext);\r\n\tvar extensions = new THREE.WebGLExtensions( _gl );\r\n\r\n\textensions.get( 'WEBGL_depth_texture' );\r\n\textensions.get( 'OES_texture_float' );\r\n\textensions.get( 'OES_texture_float_linear' );\r\n\textensions.get( 'OES_texture_half_float' );\r\n\textensions.get( 'OES_texture_half_float_linear' );\r\n\textensions.get( 'OES_standard_derivatives' );\r\n\textensions.get( 'ANGLE_instanced_arrays' );\r\n\r\n\tif ( extensions.get( 'OES_element_index_uint' ) ) {\r\n\r\n\t\tTHREE.BufferGeometry.MaxIndex = 4294967296;\r\n\r\n\t}\r\n\r\n\tvar capabilities = new THREE.WebGLCapabilities( _gl, extensions, parameters );\r\n\r\n\tvar state = new THREE.WebGLState( _gl, extensions, paramThreeToGL );\r\n\tvar properties = new THREE.WebGLProperties();\r\n\tvar objects = new THREE.WebGLObjects( _gl, properties, this.info );\r\n\tvar programCache = new THREE.WebGLPrograms( this, capabilities );\r\n\tvar lightCache = new THREE.WebGLLights();\r\n\r\n\tthis.info.programs = programCache.programs;\r\n\r\n\tvar bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender );\r\n\tvar indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\r\n\r\n\t//\r\n\r\n\tfunction getTargetPixelRatio() {\r\n\r\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\r\n\r\n\t}\r\n\r\n\tfunction glClearColor( r, g, b, a ) {\r\n\r\n\t\tif ( _premultipliedAlpha === true ) {\r\n\r\n\t\t\tr *= a; g *= a; b *= a;\r\n\r\n\t\t}\r\n\r\n\t\tstate.clearColor( r, g, b, a );\r\n\r\n\t}\r\n\r\n\tfunction setDefaultGLState() {\r\n\r\n\t\tstate.init();\r\n\r\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\r\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\r\n\r\n\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\r\n\r\n\t}\r\n\r\n\tfunction resetGLState() {\r\n\r\n\t\t_currentProgram = null;\r\n\t\t_currentCamera = null;\r\n\r\n\t\t_currentGeometryProgram = '';\r\n\t\t_currentMaterialId = - 1;\r\n\r\n\t\tstate.reset();\r\n\r\n\t}\r\n\r\n\tsetDefaultGLState();\r\n\r\n\tthis.context = _gl;\r\n\tthis.capabilities = capabilities;\r\n\tthis.extensions = extensions;\r\n\tthis.properties = properties;\r\n\tthis.state = state;\r\n\r\n\t// shadow map\r\n\r\n\tvar shadowMap = new THREE.WebGLShadowMap( this, _lights, objects );\r\n\r\n\tthis.shadowMap = shadowMap;\r\n\r\n\r\n\t// Plugins\r\n\r\n\tvar spritePlugin = new THREE.SpritePlugin( this, sprites );\r\n\tvar lensFlarePlugin = new THREE.LensFlarePlugin( this, lensFlares );\r\n\r\n\t// API\r\n\r\n\tthis.getContext = function () {\r\n\r\n\t\treturn _gl;\r\n\r\n\t};\r\n\r\n\tthis.getContextAttributes = function () {\r\n\r\n\t\treturn _gl.getContextAttributes();\r\n\r\n\t};\r\n\r\n\tthis.forceContextLoss = function () {\r\n\r\n\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\r\n\r\n\t};\r\n\r\n\tthis.getMaxAnisotropy = ( function () {\r\n\r\n\t\tvar value;\r\n\r\n\t\treturn function getMaxAnisotropy() {\r\n\r\n\t\t\tif ( value !== undefined ) return value;\r\n\r\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\r\n\r\n\t\t\tif ( extension !== null ) {\r\n\r\n\t\t\t\tvalue = _gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvalue = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn value;\r\n\r\n\t\t};\r\n\r\n\t} )();\r\n\r\n\tthis.getPrecision = function () {\r\n\r\n\t\treturn capabilities.precision;\r\n\r\n\t};\r\n\r\n\tthis.getPixelRatio = function () {\r\n\r\n\t\treturn _pixelRatio;\r\n\r\n\t};\r\n\r\n\tthis.setPixelRatio = function ( value ) {\r\n\r\n\t\tif ( value === undefined ) return;\r\n\r\n\t\t_pixelRatio = value;\r\n\r\n\t\tthis.setSize( _viewport.z, _viewport.w, false );\r\n\r\n\t};\r\n\r\n\tthis.getSize = function () {\r\n\r\n\t\treturn {\r\n\t\t\twidth: _width,\r\n\t\t\theight: _height\r\n\t\t};\r\n\r\n\t};\r\n\r\n\tthis.setSize = function ( width, height, updateStyle ) {\r\n\r\n\t\t_width = width;\r\n\t\t_height = height;\r\n\r\n\t\t_canvas.width = width * _pixelRatio;\r\n\t\t_canvas.height = height * _pixelRatio;\r\n\r\n\t\tif ( updateStyle !== false ) {\r\n\r\n\t\t\t_canvas.style.width = width + 'px';\r\n\t\t\t_canvas.style.height = height + 'px';\r\n\r\n\t\t}\r\n\r\n\t\tthis.setViewport( 0, 0, width, height );\r\n\r\n\t};\r\n\r\n\tthis.setViewport = function ( x, y, width, height ) {\r\n\r\n\t\tstate.viewport( _viewport.set( x, y, width, height ) );\r\n\r\n\t};\r\n\r\n\tthis.setScissor = function ( x, y, width, height ) {\r\n\r\n\t\tstate.scissor( _scissor.set( x, y, width, height ) );\r\n\r\n\t};\r\n\r\n\tthis.setScissorTest = function ( boolean ) {\r\n\r\n\t\tstate.setScissorTest( _scissorTest = boolean );\r\n\r\n\t};\r\n\r\n\t// Clearing\r\n\r\n\tthis.getClearColor = function () {\r\n\r\n\t\treturn _clearColor;\r\n\r\n\t};\r\n\r\n\tthis.setClearColor = function ( color, alpha ) {\r\n\r\n\t\t_clearColor.set( color );\r\n\r\n\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\r\n\r\n\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\r\n\r\n\t};\r\n\r\n\tthis.getClearAlpha = function () {\r\n\r\n\t\treturn _clearAlpha;\r\n\r\n\t};\r\n\r\n\tthis.setClearAlpha = function ( alpha ) {\r\n\r\n\t\t_clearAlpha = alpha;\r\n\r\n\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\r\n\r\n\t};\r\n\r\n\tthis.clear = function ( color, depth, stencil ) {\r\n\r\n\t\tvar bits = 0;\r\n\r\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\r\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\r\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\r\n\r\n\t\t_gl.clear( bits );\r\n\r\n\t};\r\n\r\n\tthis.clearColor = function () {\r\n\r\n\t\tthis.clear( true, false, false );\r\n\r\n\t};\r\n\r\n\tthis.clearDepth = function () {\r\n\r\n\t\tthis.clear( false, true, false );\r\n\r\n\t};\r\n\r\n\tthis.clearStencil = function () {\r\n\r\n\t\tthis.clear( false, false, true );\r\n\r\n\t};\r\n\r\n\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\r\n\r\n\t\tthis.setRenderTarget( renderTarget );\r\n\t\tthis.clear( color, depth, stencil );\r\n\r\n\t};\r\n\r\n\t// Reset\r\n\r\n\tthis.resetGLState = resetGLState;\r\n\r\n\tthis.dispose = function() {\r\n\r\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\r\n\r\n\t};\r\n\r\n\t// Events\r\n\r\n\tfunction onContextLost( event ) {\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tresetGLState();\r\n\t\tsetDefaultGLState();\r\n\r\n\t\tproperties.clear();\r\n\r\n\t}\r\n\r\n\tfunction onTextureDispose( event ) {\r\n\r\n\t\tvar texture = event.target;\r\n\r\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\r\n\r\n\t\tdeallocateTexture( texture );\r\n\r\n\t\t_infoMemory.textures --;\r\n\r\n\r\n\t}\r\n\r\n\tfunction onRenderTargetDispose( event ) {\r\n\r\n\t\tvar renderTarget = event.target;\r\n\r\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\r\n\r\n\t\tdeallocateRenderTarget( renderTarget );\r\n\r\n\t\t_infoMemory.textures --;\r\n\r\n\t}\r\n\r\n\tfunction onMaterialDispose( event ) {\r\n\r\n\t\tvar material = event.target;\r\n\r\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\r\n\r\n\t\tdeallocateMaterial( material );\r\n\r\n\t}\r\n\r\n\t// Buffer deallocation\r\n\r\n\tfunction deallocateTexture( texture ) {\r\n\r\n\t\tvar textureProperties = properties.get( texture );\r\n\r\n\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\r\n\r\n\t\t\t// cube texture\r\n\r\n\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// 2D texture\r\n\r\n\t\t\tif ( textureProperties.__webglInit === undefined ) return;\r\n\r\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\r\n\r\n\t\t}\r\n\r\n\t\t// remove all webgl properties\r\n\t\tproperties.delete( texture );\r\n\r\n\t}\r\n\r\n\tfunction deallocateRenderTarget( renderTarget ) {\r\n\r\n\t\tvar renderTargetProperties = properties.get( renderTarget );\r\n\t\tvar textureProperties = properties.get( renderTarget.texture );\r\n\r\n\t\tif ( ! renderTarget ) return;\r\n\r\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\r\n\r\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\r\n\r\n\t\t}\r\n\r\n\t\tif ( renderTarget.depthTexture ) {\r\n\r\n\t\t\trenderTarget.depthTexture.dispose();\r\n\r\n\t\t}\r\n\r\n\t\tif ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {\r\n\r\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\r\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\r\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\r\n\r\n\t\t}\r\n\r\n\t\tproperties.delete( renderTarget.texture );\r\n\t\tproperties.delete( renderTarget );\r\n\r\n\t}\r\n\r\n\tfunction deallocateMaterial( material ) {\r\n\r\n\t\treleaseMaterialProgramReference( material );\r\n\r\n\t\tproperties.delete( material );\r\n\r\n\t}\r\n\r\n\r\n\tfunction releaseMaterialProgramReference( material ) {\r\n\r\n\t\tvar programInfo = properties.get( material ).program;\r\n\r\n\t\tmaterial.program = undefined;\r\n\r\n\t\tif ( programInfo !== undefined ) {\r\n\r\n\t\t\tprogramCache.releaseProgram( programInfo );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Buffer rendering\r\n\r\n\tthis.renderBufferImmediate = function ( object, program, material ) {\r\n\r\n\t\tstate.initAttributes();\r\n\r\n\t\tvar buffers = properties.get( object );\r\n\r\n\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\r\n\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\r\n\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\r\n\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\r\n\r\n\t\tvar attributes = program.getAttributes();\r\n\r\n\t\tif ( object.hasPositions ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\r\n\r\n\t\t\tstate.enableAttribute( attributes.position );\r\n\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.hasNormals ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\r\n\r\n\t\t\tif ( material.type !== 'MeshPhongMaterial' && material.type !== 'MeshStandardMaterial' && material.type !== 'MeshPhysicalMaterial' && material.shading === THREE.FlatShading ) {\r\n\r\n\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\r\n\r\n\t\t\t\t\tvar array = object.normalArray;\r\n\r\n\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\r\n\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\r\n\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\r\n\r\n\t\t\t\t\tarray[ i + 0 ] = nx;\r\n\t\t\t\t\tarray[ i + 1 ] = ny;\r\n\t\t\t\t\tarray[ i + 2 ] = nz;\r\n\r\n\t\t\t\t\tarray[ i + 3 ] = nx;\r\n\t\t\t\t\tarray[ i + 4 ] = ny;\r\n\t\t\t\t\tarray[ i + 5 ] = nz;\r\n\r\n\t\t\t\t\tarray[ i + 6 ] = nx;\r\n\t\t\t\t\tarray[ i + 7 ] = ny;\r\n\t\t\t\t\tarray[ i + 8 ] = nz;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\r\n\r\n\t\t\tstate.enableAttribute( attributes.normal );\r\n\r\n\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.hasUvs && material.map ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\r\n\r\n\t\t\tstate.enableAttribute( attributes.uv );\r\n\r\n\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.hasColors && material.vertexColors !== THREE.NoColors ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\r\n\r\n\t\t\tstate.enableAttribute( attributes.color );\r\n\r\n\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tstate.disableUnusedAttributes();\r\n\r\n\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\r\n\r\n\t\tobject.count = 0;\r\n\r\n\t};\r\n\r\n\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\r\n\r\n\t\tsetMaterial( material );\r\n\r\n\t\tvar program = setProgram( camera, fog, material, object );\r\n\r\n\t\tvar updateBuffers = false;\r\n\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\r\n\r\n\t\tif ( geometryProgram !== _currentGeometryProgram ) {\r\n\r\n\t\t\t_currentGeometryProgram = geometryProgram;\r\n\t\t\tupdateBuffers = true;\r\n\r\n\t\t}\r\n\r\n\t\t// morph targets\r\n\r\n\t\tvar morphTargetInfluences = object.morphTargetInfluences;\r\n\r\n\t\tif ( morphTargetInfluences !== undefined ) {\r\n\r\n\t\t\tvar activeInfluences = [];\r\n\r\n\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar influence = morphTargetInfluences[ i ];\r\n\t\t\t\tactiveInfluences.push( [ influence, i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tactiveInfluences.sort( absNumericalSort );\r\n\r\n\t\t\tif ( activeInfluences.length > 8 ) {\r\n\r\n\t\t\t\tactiveInfluences.length = 8;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar morphAttributes = geometry.morphAttributes;\r\n\r\n\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar influence = activeInfluences[ i ];\r\n\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\r\n\r\n\t\t\t\tif ( influence[ 0 ] !== 0 ) {\r\n\r\n\t\t\t\t\tvar index = influence[ 1 ];\r\n\r\n\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\r\n\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\r\n\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tprogram.getUniforms().setValue(\r\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\r\n\r\n\t\t\tupdateBuffers = true;\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tvar index = geometry.index;\r\n\t\tvar position = geometry.attributes.position;\r\n\r\n\t\tif ( material.wireframe === true ) {\r\n\r\n\t\t\tindex = objects.getWireframeAttribute( geometry );\r\n\r\n\t\t}\r\n\r\n\t\tvar renderer;\r\n\r\n\t\tif ( index !== null ) {\r\n\r\n\t\t\trenderer = indexedBufferRenderer;\r\n\t\t\trenderer.setIndex( index );\r\n\r\n\t\t} else {\r\n\r\n\t\t\trenderer = bufferRenderer;\r\n\r\n\t\t}\r\n\r\n\t\tif ( updateBuffers ) {\r\n\r\n\t\t\tsetupVertexAttributes( material, program, geometry );\r\n\r\n\t\t\tif ( index !== null ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tvar dataStart = 0;\r\n\t\tvar dataCount = Infinity;\r\n\r\n\t\tif ( index !== null ) {\r\n\r\n\t\t\tdataCount = index.count;\r\n\r\n\t\t} else if ( position !== undefined ) {\r\n\r\n\t\t\tdataCount = position.count;\r\n\r\n\t\t}\r\n\r\n\t\tvar rangeStart = geometry.drawRange.start;\r\n\t\tvar rangeCount = geometry.drawRange.count;\r\n\r\n\t\tvar groupStart = group !== null ? group.start : 0;\r\n\t\tvar groupCount = group !== null ? group.count : Infinity;\r\n\r\n\t\tvar drawStart = Math.max( dataStart, rangeStart, groupStart );\r\n\t\tvar drawEnd = Math.min( dataStart + dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\r\n\r\n\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\r\n\r\n\t\t//\r\n\r\n\t\tif ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\tif ( material.wireframe === true ) {\r\n\r\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\r\n\t\t\t\trenderer.setMode( _gl.LINES );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tswitch ( object.drawMode ) {\r\n\r\n\t\t\t\t\tcase THREE.TrianglesDrawMode:\r\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.TriangleStripDrawMode:\r\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.TriangleFanDrawMode:\r\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t} else if ( object instanceof THREE.Line ) {\r\n\r\n\t\t\tvar lineWidth = material.linewidth;\r\n\r\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\r\n\r\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\r\n\r\n\t\t\tif ( object instanceof THREE.LineSegments ) {\r\n\r\n\t\t\t\trenderer.setMode( _gl.LINES );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( object instanceof THREE.Points ) {\r\n\r\n\t\t\trenderer.setMode( _gl.POINTS );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry instanceof THREE.InstancedBufferGeometry ) {\r\n\r\n\t\t\tif ( geometry.maxInstancedCount > 0 ) {\r\n\r\n\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\trenderer.render( drawStart, drawCount );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\r\n\r\n\t\tvar extension;\r\n\r\n\t\tif ( geometry instanceof THREE.InstancedBufferGeometry ) {\r\n\r\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\r\n\r\n\t\t\tif ( extension === null ) {\r\n\r\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( startIndex === undefined ) startIndex = 0;\r\n\r\n\t\tstate.initAttributes();\r\n\r\n\t\tvar geometryAttributes = geometry.attributes;\r\n\r\n\t\tvar programAttributes = program.getAttributes();\r\n\r\n\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\r\n\r\n\t\tfor ( var name in programAttributes ) {\r\n\r\n\t\t\tvar programAttribute = programAttributes[ name ];\r\n\r\n\t\t\tif ( programAttribute >= 0 ) {\r\n\r\n\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\r\n\r\n\t\t\t\tif ( geometryAttribute !== undefined ) {\r\n\r\n\t\t\t\t\tvar type = _gl.FLOAT;\r\n\t\t\t\t\tvar array = geometryAttribute.array;\r\n\t\t\t\t\tvar normalized = geometryAttribute.normalized;\r\n\r\n\t\t\t\t\tif ( array instanceof Float32Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.FLOAT;\r\n\r\n\t\t\t\t\t} else if ( array instanceof Float64Array ) {\r\n\r\n\t\t\t\t\t\tconsole.warn(\"Unsupported data buffer format: Float64Array\");\r\n\r\n\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\r\n\r\n\t\t\t\t\t} else if ( array instanceof Int16Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.SHORT;\r\n\r\n\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\r\n\r\n\t\t\t\t\t} else if ( array instanceof Int32Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.INT;\r\n\r\n\t\t\t\t\t} else if ( array instanceof Int8Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.BYTE;\r\n\r\n\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\r\n\r\n\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar size = geometryAttribute.itemSize;\r\n\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\r\n\r\n\t\t\t\t\tif ( geometryAttribute instanceof THREE.InterleavedBufferAttribute ) {\r\n\r\n\t\t\t\t\t\tvar data = geometryAttribute.data;\r\n\t\t\t\t\t\tvar stride = data.stride;\r\n\t\t\t\t\t\tvar offset = geometryAttribute.offset;\r\n\r\n\t\t\t\t\t\tif ( data instanceof THREE.InstancedInterleavedBuffer ) {\r\n\r\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\r\n\r\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tif ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) {\r\n\r\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\r\n\r\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\r\n\r\n\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\r\n\r\n\t\t\t\t\tif ( value !== undefined ) {\r\n\r\n\t\t\t\t\t\tswitch ( value.length ) {\r\n\r\n\t\t\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\r\n\t\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\r\n\t\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\r\n\t\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tstate.disableUnusedAttributes();\r\n\r\n\t}\r\n\r\n\t// Sorting\r\n\r\n\tfunction absNumericalSort( a, b ) {\r\n\r\n\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\r\n\r\n\t}\r\n\r\n\tfunction painterSortStable ( a, b ) {\r\n\r\n\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\r\n\r\n\t\t\treturn a.object.renderOrder - b.object.renderOrder;\r\n\r\n\t\t} else if ( a.material.id !== b.material.id ) {\r\n\r\n\t\t\treturn a.material.id - b.material.id;\r\n\r\n\t\t} else if ( a.z !== b.z ) {\r\n\r\n\t\t\treturn a.z - b.z;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn a.id - b.id;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction reversePainterSortStable ( a, b ) {\r\n\r\n\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\r\n\r\n\t\t\treturn a.object.renderOrder - b.object.renderOrder;\r\n\r\n\t\t} if ( a.z !== b.z ) {\r\n\r\n\t\t\treturn b.z - a.z;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn a.id - b.id;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Rendering\r\n\r\n\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\r\n\r\n\t\tif ( camera instanceof THREE.Camera === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar fog = scene.fog;\r\n\r\n\t\t// reset caching for this frame\r\n\r\n\t\t_currentGeometryProgram = '';\r\n\t\t_currentMaterialId = - 1;\r\n\t\t_currentCamera = null;\r\n\r\n\t\t// update scene graph\r\n\r\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\r\n\r\n\t\t// update camera matrices and frustum\r\n\r\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\r\n\r\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\r\n\r\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\r\n\t\t_frustum.setFromMatrix( _projScreenMatrix );\r\n\r\n\t\tlights.length = 0;\r\n\r\n\t\topaqueObjectsLastIndex = - 1;\r\n\t\ttransparentObjectsLastIndex = - 1;\r\n\r\n\t\tsprites.length = 0;\r\n\t\tlensFlares.length = 0;\r\n\r\n\t\tsetupGlobalClippingPlanes( this.clippingPlanes, camera );\r\n\r\n\t\tprojectObject( scene, camera );\r\n\r\n\r\n\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\r\n\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\r\n\r\n\t\tif ( _this.sortObjects === true ) {\r\n\r\n\t\t\topaqueObjects.sort( painterSortStable );\r\n\t\t\ttransparentObjects.sort( reversePainterSortStable );\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tif ( _clippingEnabled ) {\r\n\r\n\t\t\t_clipRenderingShadows = true;\r\n\t\t\tsetupClippingPlanes( null );\r\n\r\n\t\t}\r\n\r\n\t\tsetupShadows( lights );\r\n\r\n\t\tshadowMap.render( scene, camera );\r\n\r\n\t\tsetupLights( lights, camera );\r\n\r\n\t\tif ( _clippingEnabled ) {\r\n\r\n\t\t\t_clipRenderingShadows = false;\r\n\t\t\tresetGlobalClippingState();\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\t_infoRender.calls = 0;\r\n\t\t_infoRender.vertices = 0;\r\n\t\t_infoRender.faces = 0;\r\n\t\t_infoRender.points = 0;\r\n\r\n\t\tif ( renderTarget === undefined ) {\r\n\r\n\t\t\trenderTarget = null;\r\n\r\n\t\t}\r\n\r\n\t\tthis.setRenderTarget( renderTarget );\r\n\r\n\t\tif ( this.autoClear || forceClear ) {\r\n\r\n\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tif ( scene.overrideMaterial ) {\r\n\r\n\t\t\tvar overrideMaterial = scene.overrideMaterial;\r\n\r\n\t\t\trenderObjects( opaqueObjects, camera, fog, overrideMaterial );\r\n\t\t\trenderObjects( transparentObjects, camera, fog, overrideMaterial );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// opaque pass (front-to-back order)\r\n\r\n\t\t\tstate.setBlending( THREE.NoBlending );\r\n\t\t\trenderObjects( opaqueObjects, camera, fog );\r\n\r\n\t\t\t// transparent pass (back-to-front order)\r\n\r\n\t\t\trenderObjects( transparentObjects, camera, fog );\r\n\r\n\t\t}\r\n\r\n\t\t// custom render plugins (post pass)\r\n\r\n\t\tspritePlugin.render( scene, camera );\r\n\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\r\n\r\n\t\t// Generate mipmap if we're using any kind of mipmap filtering\r\n\r\n\t\tif ( renderTarget ) {\r\n\r\n\t\t\tvar texture = renderTarget.texture;\r\n\r\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\r\n\t\t\t\t\ttexture.minFilter !== THREE.NearestFilter &&\r\n\t\t\t\t\ttexture.minFilter !== THREE.LinearFilter ) {\r\n\r\n\t\t\t\tupdateRenderTargetMipmap( renderTarget );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\r\n\r\n\t\tstate.setDepthTest( true );\r\n\t\tstate.setDepthWrite( true );\r\n\t\tstate.setColorWrite( true );\r\n\r\n\t\t// _gl.finish();\r\n\r\n\t};\r\n\r\n\tfunction pushRenderItem( object, geometry, material, z, group ) {\r\n\r\n\t\tvar array, index;\r\n\r\n\t\t// allocate the next position in the appropriate array\r\n\r\n\t\tif ( material.transparent ) {\r\n\r\n\t\t\tarray = transparentObjects;\r\n\t\t\tindex = ++ transparentObjectsLastIndex;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tarray = opaqueObjects;\r\n\t\t\tindex = ++ opaqueObjectsLastIndex;\r\n\r\n\t\t}\r\n\r\n\t\t// recycle existing render item or grow the array\r\n\r\n\t\tvar renderItem = array[ index ];\r\n\r\n\t\tif ( renderItem !== undefined ) {\r\n\r\n\t\t\trenderItem.id = object.id;\r\n\t\t\trenderItem.object = object;\r\n\t\t\trenderItem.geometry = geometry;\r\n\t\t\trenderItem.material = material;\r\n\t\t\trenderItem.z = _vector3.z;\r\n\t\t\trenderItem.group = group;\r\n\r\n\t\t} else {\r\n\r\n\t\t\trenderItem = {\r\n\t\t\t\tid: object.id,\r\n\t\t\t\tobject: object,\r\n\t\t\t\tgeometry: geometry,\r\n\t\t\t\tmaterial: material,\r\n\t\t\t\tz: _vector3.z,\r\n\t\t\t\tgroup: group\r\n\t\t\t};\r\n\r\n\t\t\t// assert( index === array.length );\r\n\t\t\tarray.push( renderItem );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction isObjectViewable( object ) {\r\n\r\n\t\tvar geometry = object.geometry;\r\n\r\n\t\tif ( geometry.boundingSphere === null )\r\n\t\t\tgeometry.computeBoundingSphere();\r\n\r\n\t\tvar sphere = _sphere.\r\n\t\t\t\tcopy( geometry.boundingSphere ).\r\n\t\t\t\tapplyMatrix4( object.matrixWorld );\r\n\r\n\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\r\n\t\tif ( _numClippingPlanes === 0 ) return true;\r\n\r\n\t\tvar planes = _this.clippingPlanes,\r\n\r\n\t\t\tcenter = sphere.center,\r\n\t\t\tnegRad = - sphere.radius,\r\n\t\t\ti = 0;\r\n\r\n\t\tdo {\r\n\r\n\t\t\t// out when deeper than radius in the negative halfspace\r\n\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\r\n\r\n\t\t} while ( ++ i !== _numClippingPlanes );\r\n\r\n\t\treturn true;\r\n\r\n\t}\r\n\r\n\tfunction projectObject( object, camera ) {\r\n\r\n\t\tif ( object.visible === false ) return;\r\n\r\n\t\tif ( object.layers.test( camera.layers ) ) {\r\n\r\n\t\t\tif ( object instanceof THREE.Light ) {\r\n\r\n\t\t\t\tlights.push( object );\r\n\r\n\t\t\t} else if ( object instanceof THREE.Sprite ) {\r\n\r\n\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\r\n\r\n\t\t\t\t\tsprites.push( object );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( object instanceof THREE.LensFlare ) {\r\n\r\n\t\t\t\tlensFlares.push( object );\r\n\r\n\t\t\t} else if ( object instanceof THREE.ImmediateRenderObject ) {\r\n\r\n\t\t\t\tif ( _this.sortObjects === true ) {\r\n\r\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\r\n\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\r\n\r\n\t\t\t} else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) {\r\n\r\n\t\t\t\tif ( object instanceof THREE.SkinnedMesh ) {\r\n\r\n\t\t\t\t\tobject.skeleton.update();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\r\n\r\n\t\t\t\t\tvar material = object.material;\r\n\r\n\t\t\t\t\tif ( material.visible === true ) {\r\n\r\n\t\t\t\t\t\tif ( _this.sortObjects === true ) {\r\n\r\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\r\n\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar geometry = objects.update( object );\r\n\r\n\t\t\t\t\t\tif ( material instanceof THREE.MultiMaterial ) {\r\n\r\n\t\t\t\t\t\t\tvar groups = geometry.groups;\r\n\t\t\t\t\t\t\tvar materials = material.materials;\r\n\r\n\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvar group = groups[ i ];\r\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\r\n\r\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\r\n\r\n\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar children = object.children;\r\n\r\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\tprojectObject( children[ i ], camera );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction renderObjects( renderList, camera, fog, overrideMaterial ) {\r\n\r\n\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar renderItem = renderList[ i ];\r\n\r\n\t\t\tvar object = renderItem.object;\r\n\t\t\tvar geometry = renderItem.geometry;\r\n\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\r\n\t\t\tvar group = renderItem.group;\r\n\r\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\r\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\r\n\r\n\t\t\tif ( object instanceof THREE.ImmediateRenderObject ) {\r\n\r\n\t\t\t\tsetMaterial( material );\r\n\r\n\t\t\t\tvar program = setProgram( camera, fog, material, object );\r\n\r\n\t\t\t\t_currentGeometryProgram = '';\r\n\r\n\t\t\t\tobject.render( function ( object ) {\r\n\r\n\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_this.renderBufferDirect( camera, fog, geometry, material, object, group );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction initMaterial( material, fog, object ) {\r\n\r\n\t\tvar materialProperties = properties.get( material );\r\n\r\n\t\tvar parameters = programCache.getParameters(\r\n\t\t\t\tmaterial, _lights, fog, _numClippingPlanes, object );\r\n\r\n\t\tvar code = programCache.getProgramCode( material, parameters );\r\n\r\n\t\tvar program = materialProperties.program;\r\n\t\tvar programChange = true;\r\n\r\n\t\tif ( program === undefined ) {\r\n\r\n\t\t\t// new material\r\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\r\n\r\n\t\t} else if ( program.code !== code ) {\r\n\r\n\t\t\t// changed glsl or parameters\r\n\t\t\treleaseMaterialProgramReference( material );\r\n\r\n\t\t} else if ( parameters.shaderID !== undefined ) {\r\n\r\n\t\t\t// same glsl and uniform list\r\n\t\t\treturn;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// only rebuild uniform list\r\n\t\t\tprogramChange = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( programChange ) {\r\n\r\n\t\t\tif ( parameters.shaderID ) {\r\n\r\n\t\t\t\tvar shader = THREE.ShaderLib[ parameters.shaderID ];\r\n\r\n\t\t\t\tmaterialProperties.__webglShader = {\r\n\t\t\t\t\tname: material.type,\r\n\t\t\t\t\tuniforms: THREE.UniformsUtils.clone( shader.uniforms ),\r\n\t\t\t\t\tvertexShader: shader.vertexShader,\r\n\t\t\t\t\tfragmentShader: shader.fragmentShader\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tmaterialProperties.__webglShader = {\r\n\t\t\t\t\tname: material.type,\r\n\t\t\t\t\tuniforms: material.uniforms,\r\n\t\t\t\t\tvertexShader: material.vertexShader,\r\n\t\t\t\t\tfragmentShader: material.fragmentShader\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\r\n\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\r\n\r\n\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\r\n\r\n\t\t\tmaterialProperties.program = program;\r\n\t\t\tmaterial.program = program;\r\n\r\n\t\t}\r\n\r\n\t\tvar attributes = program.getAttributes();\r\n\r\n\t\tif ( material.morphTargets ) {\r\n\r\n\t\t\tmaterial.numSupportedMorphTargets = 0;\r\n\r\n\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\r\n\r\n\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\r\n\r\n\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\tmaterial.numSupportedMorphNormals = 0;\r\n\r\n\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\r\n\r\n\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\r\n\r\n\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar uniforms = materialProperties.__webglShader.uniforms;\r\n\r\n\t\tif ( ! ( material instanceof THREE.ShaderMaterial ) &&\r\n\t\t\t\t! ( material instanceof THREE.RawShaderMaterial ) ||\r\n\t\t\t\tmaterial.clipping === true ) {\r\n\r\n\t\t\tmaterialProperties.numClippingPlanes = _numClippingPlanes;\r\n\t\t\tuniforms.clippingPlanes = _clippingPlanesUniform;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\tmaterial instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\tmaterial instanceof THREE.MeshStandardMaterial ||\r\n\t\t\t\tmaterial.lights ) {\r\n\r\n\t\t\t// store the light setup it was created for\r\n\r\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\r\n\r\n\t\t\t// wire up the material to this renderer's lighting state\r\n\r\n\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\r\n\t\t\tuniforms.directionalLights.value = _lights.directional;\r\n\t\t\tuniforms.spotLights.value = _lights.spot;\r\n\t\t\tuniforms.pointLights.value = _lights.point;\r\n\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\r\n\r\n\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\r\n\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\r\n\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\r\n\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\r\n\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\r\n\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\r\n\r\n\t\t}\r\n\r\n\t\tvar progUniforms = materialProperties.program.getUniforms(),\r\n\t\t\tuniformsList =\r\n\t\t\t\t\tTHREE.WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\r\n\r\n\t\tmaterialProperties.uniformsList = uniformsList;\r\n\t\tmaterialProperties.dynamicUniforms =\r\n\t\t\t\tTHREE.WebGLUniforms.splitDynamic( uniformsList, uniforms );\r\n\r\n\t}\r\n\r\n\tfunction setMaterial( material ) {\r\n\r\n\t\tsetMaterialFaces( material );\r\n\r\n\t\tif ( material.transparent === true ) {\r\n\r\n\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tstate.setBlending( THREE.NoBlending );\r\n\r\n\t\t}\r\n\r\n\t\tstate.setDepthFunc( material.depthFunc );\r\n\t\tstate.setDepthTest( material.depthTest );\r\n\t\tstate.setDepthWrite( material.depthWrite );\r\n\t\tstate.setColorWrite( material.colorWrite );\r\n\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\r\n\r\n\t}\r\n\r\n\tfunction setMaterialFaces( material ) {\r\n\r\n\t\tmaterial.side !== THREE.DoubleSide ? state.enable( _gl.CULL_FACE ) : state.disable( _gl.CULL_FACE );\r\n\t\tstate.setFlipSided( material.side === THREE.BackSide );\r\n\r\n\t}\r\n\r\n\tfunction setProgram( camera, fog, material, object ) {\r\n\r\n\t\t_usedTextureUnits = 0;\r\n\r\n\t\tvar materialProperties = properties.get( material );\r\n\r\n\t\tif ( _clippingEnabled ) {\r\n\r\n\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\r\n\r\n\t\t\t\tvar useCache =\r\n\t\t\t\t\t\tcamera === _currentCamera &&\r\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\r\n\r\n\t\t\t\t// we might want to call this function with some ClippingGroup\r\n\t\t\t\t// object instead of the material, once it becomes feasible\r\n\t\t\t\t// (#8465, #8379)\r\n\t\t\t\tsetClippingState(\r\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipShadows,\r\n\t\t\t\t\t\tcamera, materialProperties, useCache );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( materialProperties.numClippingPlanes !== undefined &&\r\n\t\t\t\tmaterialProperties.numClippingPlanes !== _numClippingPlanes ) {\r\n\r\n\t\t\t\tmaterial.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( materialProperties.program === undefined ) {\r\n\r\n\t\t\tmaterial.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( materialProperties.lightsHash !== undefined &&\r\n\t\t\tmaterialProperties.lightsHash !== _lights.hash ) {\r\n\r\n\t\t\tmaterial.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.needsUpdate ) {\r\n\r\n\t\t\tinitMaterial( material, fog, object );\r\n\t\t\tmaterial.needsUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tvar refreshProgram = false;\r\n\t\tvar refreshMaterial = false;\r\n\t\tvar refreshLights = false;\r\n\r\n\t\tvar program = materialProperties.program,\r\n\t\t\tp_uniforms = program.getUniforms(),\r\n\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\r\n\r\n\t\tif ( program.id !== _currentProgram ) {\r\n\r\n\t\t\t_gl.useProgram( program.program );\r\n\t\t\t_currentProgram = program.id;\r\n\r\n\t\t\trefreshProgram = true;\r\n\t\t\trefreshMaterial = true;\r\n\t\t\trefreshLights = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.id !== _currentMaterialId ) {\r\n\r\n\t\t\t_currentMaterialId = material.id;\r\n\r\n\t\t\trefreshMaterial = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( refreshProgram || camera !== _currentCamera ) {\r\n\r\n\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\r\n\r\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\r\n\r\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\r\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif ( camera !== _currentCamera ) {\r\n\r\n\t\t\t\t_currentCamera = camera;\r\n\r\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\r\n\t\t\t\t// now, in case this material supports lights - or later, when\r\n\t\t\t\t// the next material that does gets activated:\r\n\r\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\r\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// load material specific uniforms\r\n\t\t\t// (shader material also gets them for the sake of genericity)\r\n\r\n\t\t\tif ( material instanceof THREE.ShaderMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshStandardMaterial ||\r\n\t\t\t\t material.envMap ) {\r\n\r\n\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\r\n\r\n\t\t\t\tif ( uCamPos !== undefined ) {\r\n\r\n\t\t\t\t\tuCamPos.setValue( _gl,\r\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshBasicMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshStandardMaterial ||\r\n\t\t\t\t material instanceof THREE.ShaderMaterial ||\r\n\t\t\t\t material.skinning ) {\r\n\r\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\r\n\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\r\n\r\n\t\t}\r\n\r\n\t\t// skinning uniforms must be set even if material didn't change\r\n\t\t// auto-setting of texture unit for bone texture must go before other textures\r\n\t\t// not sure why, but otherwise weird things happen\r\n\r\n\t\tif ( material.skinning ) {\r\n\r\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\r\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\r\n\r\n\t\t\tvar skeleton = object.skeleton;\r\n\r\n\t\t\tif ( skeleton ) {\r\n\r\n\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\r\n\r\n\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\r\n\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\r\n\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( refreshMaterial ) {\r\n\r\n\t\t\tif ( material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshStandardMaterial ||\r\n\t\t\t\t material.lights ) {\r\n\r\n\t\t\t\t// the current material requires lighting info\r\n\r\n\t\t\t\t// note: all lighting uniforms are always set correctly\r\n\t\t\t\t// they simply reference the renderer's state for their\r\n\t\t\t\t// values\r\n\t\t\t\t//\r\n\t\t\t\t// use the current material's .needsUpdate flags to set\r\n\t\t\t\t// the GL state when required\r\n\r\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// refresh uniforms common to several materials\r\n\r\n\t\t\tif ( fog && material.fog ) {\r\n\r\n\t\t\t\trefreshUniformsFog( m_uniforms, fog );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material instanceof THREE.MeshBasicMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshStandardMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// refresh single material specific uniforms\r\n\r\n\t\t\tif ( material instanceof THREE.LineBasicMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.LineDashedMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\r\n\t\t\t\trefreshUniformsDash( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.PointsMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsPoints( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshLambertMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsLambert( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshPhongMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsPhong( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshPhysicalMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshStandardMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsStandard( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\t\tif ( material.displacementMap ) {\r\n\r\n\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\r\n\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\r\n\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\r\n\r\n\t\t\t\tm_uniforms.opacity.value = material.opacity;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tTHREE.WebGLUniforms.upload(\r\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\r\n\r\n\t\t}\r\n\r\n\r\n\t\t// common matrices\r\n\r\n\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\r\n\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\r\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\r\n\r\n\r\n\t\t// dynamic uniforms\r\n\r\n\t\tvar dynUniforms = materialProperties.dynamicUniforms;\r\n\r\n\t\tif ( dynUniforms !== null ) {\r\n\r\n\t\t\tTHREE.WebGLUniforms.evalDynamic(\r\n\t\t\t\t\tdynUniforms, m_uniforms, object, camera );\r\n\r\n\t\t\tTHREE.WebGLUniforms.upload( _gl, dynUniforms, m_uniforms, _this );\r\n\r\n\t\t}\r\n\r\n\t\treturn program;\r\n\r\n\t}\r\n\r\n\t// Uniforms (refresh uniforms objects)\r\n\r\n\tfunction refreshUniformsCommon ( uniforms, material ) {\r\n\r\n\t\tuniforms.opacity.value = material.opacity;\r\n\r\n\t\tuniforms.diffuse.value = material.color;\r\n\r\n\t\tif ( material.emissive ) {\r\n\r\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.map.value = material.map;\r\n\t\tuniforms.specularMap.value = material.specularMap;\r\n\t\tuniforms.alphaMap.value = material.alphaMap;\r\n\r\n\t\tif ( material.aoMap ) {\r\n\r\n\t\t\tuniforms.aoMap.value = material.aoMap;\r\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\r\n\r\n\t\t}\r\n\r\n\t\t// uv repeat and offset setting priorities\r\n\t\t// 1. color map\r\n\t\t// 2. specular map\r\n\t\t// 3. normal map\r\n\t\t// 4. bump map\r\n\t\t// 5. alpha map\r\n\t\t// 6. emissive map\r\n\r\n\t\tvar uvScaleMap;\r\n\r\n\t\tif ( material.map ) {\r\n\r\n\t\t\tuvScaleMap = material.map;\r\n\r\n\t\t} else if ( material.specularMap ) {\r\n\r\n\t\t\tuvScaleMap = material.specularMap;\r\n\r\n\t\t} else if ( material.displacementMap ) {\r\n\r\n\t\t\tuvScaleMap = material.displacementMap;\r\n\r\n\t\t} else if ( material.normalMap ) {\r\n\r\n\t\t\tuvScaleMap = material.normalMap;\r\n\r\n\t\t} else if ( material.bumpMap ) {\r\n\r\n\t\t\tuvScaleMap = material.bumpMap;\r\n\r\n\t\t} else if ( material.roughnessMap ) {\r\n\r\n\t\t\tuvScaleMap = material.roughnessMap;\r\n\r\n\t\t} else if ( material.metalnessMap ) {\r\n\r\n\t\t\tuvScaleMap = material.metalnessMap;\r\n\r\n\t\t} else if ( material.alphaMap ) {\r\n\r\n\t\t\tuvScaleMap = material.alphaMap;\r\n\r\n\t\t} else if ( material.emissiveMap ) {\r\n\r\n\t\t\tuvScaleMap = material.emissiveMap;\r\n\r\n\t\t}\r\n\r\n\t\tif ( uvScaleMap !== undefined ) {\r\n\r\n\t\t\tif ( uvScaleMap instanceof THREE.WebGLRenderTarget ) {\r\n\r\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar offset = uvScaleMap.offset;\r\n\t\t\tvar repeat = uvScaleMap.repeat;\r\n\r\n\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.envMap.value = material.envMap;\r\n\t\tuniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : - 1;\r\n\r\n\t\tuniforms.reflectivity.value = material.reflectivity;\r\n\t\tuniforms.refractionRatio.value = material.refractionRatio;\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsLine ( uniforms, material ) {\r\n\r\n\t\tuniforms.diffuse.value = material.color;\r\n\t\tuniforms.opacity.value = material.opacity;\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsDash ( uniforms, material ) {\r\n\r\n\t\tuniforms.dashSize.value = material.dashSize;\r\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\r\n\t\tuniforms.scale.value = material.scale;\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsPoints ( uniforms, material ) {\r\n\r\n\t\tuniforms.diffuse.value = material.color;\r\n\t\tuniforms.opacity.value = material.opacity;\r\n\t\tuniforms.size.value = material.size * _pixelRatio;\r\n\t\tuniforms.scale.value = _canvas.clientHeight * 0.5;\r\n\r\n\t\tuniforms.map.value = material.map;\r\n\r\n\t\tif ( material.map !== null ) {\r\n\r\n\t\t\tvar offset = material.map.offset;\r\n\t\t\tvar repeat = material.map.repeat;\r\n\r\n\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsFog ( uniforms, fog ) {\r\n\r\n\t\tuniforms.fogColor.value = fog.color;\r\n\r\n\t\tif ( fog instanceof THREE.Fog ) {\r\n\r\n\t\t\tuniforms.fogNear.value = fog.near;\r\n\t\t\tuniforms.fogFar.value = fog.far;\r\n\r\n\t\t} else if ( fog instanceof THREE.FogExp2 ) {\r\n\r\n\t\t\tuniforms.fogDensity.value = fog.density;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsLambert ( uniforms, material ) {\r\n\r\n\t\tif ( material.lightMap ) {\r\n\r\n\t\t\tuniforms.lightMap.value = material.lightMap;\r\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.emissiveMap ) {\r\n\r\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsPhong ( uniforms, material ) {\r\n\r\n\t\tuniforms.specular.value = material.specular;\r\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\r\n\r\n\t\tif ( material.lightMap ) {\r\n\r\n\t\t\tuniforms.lightMap.value = material.lightMap;\r\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.emissiveMap ) {\r\n\r\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.bumpMap ) {\r\n\r\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\r\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.normalMap ) {\r\n\r\n\t\t\tuniforms.normalMap.value = material.normalMap;\r\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.displacementMap ) {\r\n\r\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\r\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\r\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsStandard ( uniforms, material ) {\r\n\r\n\t\tuniforms.roughness.value = material.roughness;\r\n\t\tuniforms.metalness.value = material.metalness;\r\n\r\n\t\tif ( material.roughnessMap ) {\r\n\r\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.metalnessMap ) {\r\n\r\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.lightMap ) {\r\n\r\n\t\t\tuniforms.lightMap.value = material.lightMap;\r\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.emissiveMap ) {\r\n\r\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.bumpMap ) {\r\n\r\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\r\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.normalMap ) {\r\n\r\n\t\t\tuniforms.normalMap.value = material.normalMap;\r\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.displacementMap ) {\r\n\r\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\r\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\r\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.envMap ) {\r\n\r\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\r\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction refreshUniformsPhysical ( uniforms, material ) {\r\n\r\n\t\trefreshUniformsStandard( uniforms, material );\r\n\r\n\t}\r\n\r\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\r\n\r\n\tfunction markUniformsLightsNeedsUpdate ( uniforms, value ) {\r\n\r\n\t\tuniforms.ambientLightColor.needsUpdate = value;\r\n\r\n\t\tuniforms.directionalLights.needsUpdate = value;\r\n\t\tuniforms.pointLights.needsUpdate = value;\r\n\t\tuniforms.spotLights.needsUpdate = value;\r\n\t\tuniforms.hemisphereLights.needsUpdate = value;\r\n\r\n\t}\r\n\r\n\t// Lighting\r\n\r\n\tfunction setupShadows ( lights ) {\r\n\r\n\t\tvar lightShadowsLength = 0;\r\n\r\n\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar light = lights[ i ];\r\n\r\n\t\t\tif ( light.castShadow ) {\r\n\r\n\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t_lights.shadows.length = lightShadowsLength;\r\n\r\n\t}\r\n\r\n\tfunction setupLights ( lights, camera ) {\r\n\r\n\t\tvar l, ll, light,\r\n\t\tr = 0, g = 0, b = 0,\r\n\t\tcolor,\r\n\t\tintensity,\r\n\t\tdistance,\r\n\r\n\t\tviewMatrix = camera.matrixWorldInverse,\r\n\r\n\t\tdirectionalLength = 0,\r\n\t\tpointLength = 0,\r\n\t\tspotLength = 0,\r\n\t\themiLength = 0;\r\n\r\n\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\r\n\r\n\t\t\tlight = lights[ l ];\r\n\r\n\t\t\tcolor = light.color;\r\n\t\t\tintensity = light.intensity;\r\n\t\t\tdistance = light.distance;\r\n\r\n\t\t\tif ( light instanceof THREE.AmbientLight ) {\r\n\r\n\t\t\t\tr += color.r * intensity;\r\n\t\t\t\tg += color.g * intensity;\r\n\t\t\t\tb += color.b * intensity;\r\n\r\n\t\t\t} else if ( light instanceof THREE.DirectionalLight ) {\r\n\r\n\t\t\t\tvar uniforms = lightCache.get( light );\r\n\r\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\r\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\r\n\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\r\n\t\t\t\tuniforms.direction.sub( _vector3 );\r\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\r\n\r\n\t\t\t\tuniforms.shadow = light.castShadow;\r\n\r\n\t\t\t\tif ( light.castShadow ) {\r\n\r\n\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\r\n\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\r\n\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = light.shadow.map;\r\n\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\r\n\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\r\n\r\n\t\t\t} else if ( light instanceof THREE.SpotLight ) {\r\n\r\n\t\t\t\tvar uniforms = lightCache.get( light );\r\n\r\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\r\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\r\n\r\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\r\n\t\t\t\tuniforms.distance = distance;\r\n\r\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\r\n\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\r\n\t\t\t\tuniforms.direction.sub( _vector3 );\r\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\r\n\r\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\r\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\r\n\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\r\n\r\n\t\t\t\tuniforms.shadow = light.castShadow;\r\n\r\n\t\t\t\tif ( light.castShadow ) {\r\n\r\n\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\r\n\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\r\n\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_lights.spotShadowMap[ spotLength ] = light.shadow.map;\r\n\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\r\n\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\r\n\r\n\t\t\t} else if ( light instanceof THREE.PointLight ) {\r\n\r\n\t\t\t\tvar uniforms = lightCache.get( light );\r\n\r\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\r\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\r\n\r\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\r\n\t\t\t\tuniforms.distance = light.distance;\r\n\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\r\n\r\n\t\t\t\tuniforms.shadow = light.castShadow;\r\n\r\n\t\t\t\tif ( light.castShadow ) {\r\n\r\n\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\r\n\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\r\n\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_lights.pointShadowMap[ pointLength ] = light.shadow.map;\r\n\r\n\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\r\n\r\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new THREE.Matrix4();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\r\n\t\t\t\t// equal to inverse of the light's position\r\n\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\r\n\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\r\n\r\n\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\r\n\r\n\t\t\t} else if ( light instanceof THREE.HemisphereLight ) {\r\n\r\n\t\t\t\tvar uniforms = lightCache.get( light );\r\n\r\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\r\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\r\n\t\t\t\tuniforms.direction.normalize();\r\n\r\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\r\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\r\n\r\n\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t_lights.ambient[ 0 ] = r;\r\n\t\t_lights.ambient[ 1 ] = g;\r\n\t\t_lights.ambient[ 2 ] = b;\r\n\r\n\t\t_lights.directional.length = directionalLength;\r\n\t\t_lights.spot.length = spotLength;\r\n\t\t_lights.point.length = pointLength;\r\n\t\t_lights.hemi.length = hemiLength;\r\n\r\n\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\r\n\r\n\t}\r\n\r\n\t// Clipping\r\n\r\n\tfunction setupGlobalClippingPlanes( planes, camera ) {\r\n\r\n\t\t_clippingEnabled =\r\n\t\t\t\t_this.clippingPlanes.length !== 0 ||\r\n\t\t\t\t_this.localClippingEnabled ||\r\n\t\t\t\t// enable state of previous frame - the clipping code has to\r\n\t\t\t\t// run another frame in order to reset the state:\r\n\t\t\t\t_numGlobalClippingPlanes !== 0 ||\r\n\t\t\t\t_localClippingEnabled;\r\n\r\n\t\t_localClippingEnabled = _this.localClippingEnabled;\r\n\r\n\t\t_globalClippingState = setupClippingPlanes( planes, camera, 0 );\r\n\t\t_numGlobalClippingPlanes = planes !== null ? planes.length : 0;\r\n\r\n\t}\r\n\r\n\tfunction setupClippingPlanes( planes, camera, dstOffset, skipTransform ) {\r\n\r\n\t\tvar nPlanes = planes !== null ? planes.length : 0,\r\n\t\t\tdstArray = null;\r\n\r\n\t\tif ( nPlanes !== 0 ) {\r\n\r\n\t\t\tdstArray = _clippingPlanesUniform.value;\r\n\r\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\r\n\r\n\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\r\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse,\r\n\t\t\t\t\tviewNormalMatrix = _matrix3.getNormalMatrix( viewMatrix );\r\n\r\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\r\n\r\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\r\n\r\n\t\t\t\t\tvar plane = _plane.copy( planes[ i ] ).\r\n\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\r\n\r\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\r\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_clippingPlanesUniform.value = dstArray;\r\n\t\t\t_clippingPlanesUniform.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\t_numClippingPlanes = nPlanes;\r\n\t\treturn dstArray;\r\n\r\n\t}\r\n\r\n\tfunction resetGlobalClippingState() {\r\n\r\n\t\tif ( _clippingPlanesUniform.value !== _globalClippingState ) {\r\n\r\n\t\t\t_clippingPlanesUniform.value = _globalClippingState;\r\n\t\t\t_clippingPlanesUniform.needsUpdate = _numGlobalClippingPlanes > 0;\r\n\r\n\t\t}\r\n\r\n\t\t_numClippingPlanes = _numGlobalClippingPlanes;\r\n\r\n\t}\r\n\r\n\tfunction setClippingState( planes, clipShadows, camera, cache, fromCache ) {\r\n\r\n\t\tif ( ! _localClippingEnabled ||\r\n\t\t\t\tplanes === null || planes.length === 0 ||\r\n\t\t\t\t_clipRenderingShadows && ! clipShadows ) {\r\n\t\t\t// there's no local clipping\r\n\r\n\t\t\tif ( _clipRenderingShadows ) {\r\n\t\t\t\t// there's no global clipping\r\n\r\n\t\t\t\tsetupClippingPlanes( null );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tresetGlobalClippingState();\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar nGlobal = _clipRenderingShadows ? 0 : _numGlobalClippingPlanes,\r\n\t\t\t\tlGlobal = nGlobal * 4,\r\n\r\n\t\t\t\tdstArray = cache.clippingState || null;\r\n\r\n\t\t\t_clippingPlanesUniform.value = dstArray; // ensure unique state\r\n\r\n\t\t\tdstArray = setupClippingPlanes(\r\n\t\t\t\t\tplanes, camera, lGlobal, fromCache );\r\n\r\n\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\r\n\r\n\t\t\t\tdstArray[ i ] = _globalClippingState[ i ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcache.clippingState = dstArray;\r\n\t\t\t_numClippingPlanes += nGlobal;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// GL state setting\r\n\r\n\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\r\n\r\n\t\tif ( cullFace === THREE.CullFaceNone ) {\r\n\r\n\t\t\tstate.disable( _gl.CULL_FACE );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif ( frontFaceDirection === THREE.FrontFaceDirectionCW ) {\r\n\r\n\t\t\t\t_gl.frontFace( _gl.CW );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.frontFace( _gl.CCW );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( cullFace === THREE.CullFaceBack ) {\r\n\r\n\t\t\t\t_gl.cullFace( _gl.BACK );\r\n\r\n\t\t\t} else if ( cullFace === THREE.CullFaceFront ) {\r\n\r\n\t\t\t\t_gl.cullFace( _gl.FRONT );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.cullFace( _gl.FRONT_AND_BACK );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tstate.enable( _gl.CULL_FACE );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Textures\r\n\r\n\tfunction allocTextureUnit() {\r\n\r\n\t\tvar textureUnit = _usedTextureUnits;\r\n\r\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\r\n\r\n\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\r\n\r\n\t\t}\r\n\r\n\t\t_usedTextureUnits += 1;\r\n\r\n\t\treturn textureUnit;\r\n\r\n\t}\r\n\r\n\tfunction setTextureParameters ( textureType, texture, isPowerOfTwoImage ) {\r\n\r\n\t\tvar extension;\r\n\r\n\t\tif ( isPowerOfTwoImage ) {\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\r\n\r\n\t\t\tif ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\r\n\r\n\t\t\tif ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\r\n\r\n\t\tif ( extension ) {\r\n\r\n\t\t\tif ( texture.type === THREE.FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\r\n\t\t\tif ( texture.type === THREE.HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\r\n\r\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\r\n\r\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _this.getMaxAnisotropy() ) );\r\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction uploadTexture( textureProperties, texture, slot ) {\r\n\r\n\t\tif ( textureProperties.__webglInit === undefined ) {\r\n\r\n\t\t\ttextureProperties.__webglInit = true;\r\n\r\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\r\n\r\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\r\n\r\n\t\t\t_infoMemory.textures ++;\r\n\r\n\t\t}\r\n\r\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\r\n\r\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\r\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\r\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\r\n\r\n\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\r\n\r\n\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\r\n\r\n\t\t\timage = makePowerOfTwo( image );\r\n\r\n\t\t}\r\n\r\n\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\r\n\t\tglFormat = paramThreeToGL( texture.format ),\r\n\t\tglType = paramThreeToGL( texture.type );\r\n\r\n\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\r\n\r\n\t\tvar mipmap, mipmaps = texture.mipmaps;\r\n\r\n\t\tif ( texture instanceof THREE.DepthTexture ) {\r\n\r\n\t\t\t// populate depth texture with dummy data\r\n\r\n\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\r\n\r\n\t\t\tif ( texture.type === THREE.FloatType ) {\r\n\r\n\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\r\n\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\r\n\r\n\t\t\t} else if ( _isWebGL2 ) {\r\n\r\n\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\r\n\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\r\n\r\n\t\t} else if ( texture instanceof THREE.DataTexture ) {\r\n\r\n\t\t\t// use manually created mipmaps if available\r\n\t\t\t// if there are no manual mipmaps\r\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\r\n\r\n\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\r\n\r\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tmipmap = mipmaps[ i ];\r\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttexture.generateMipmaps = false;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( texture instanceof THREE.CompressedTexture ) {\r\n\r\n\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tmipmap = mipmaps[ i ];\r\n\r\n\t\t\t\tif ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) {\r\n\r\n\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\r\n\r\n\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// regular Texture (image, video, canvas)\r\n\r\n\t\t\t// use manually created mipmaps if available\r\n\t\t\t// if there are no manual mipmaps\r\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\r\n\r\n\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\r\n\r\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tmipmap = mipmaps[ i ];\r\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttexture.generateMipmaps = false;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\r\n\r\n\t\ttextureProperties.__version = texture.version;\r\n\r\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\r\n\r\n\t}\r\n\r\n\tfunction setTexture2D( texture, slot ) {\r\n\r\n\t\tif ( texture instanceof THREE.WebGLRenderTarget ) texture = texture.texture;\r\n\r\n\t\tvar textureProperties = properties.get( texture );\r\n\r\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\r\n\r\n\t\t\tvar image = texture.image;\r\n\r\n\t\t\tif ( image === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( image.complete === false ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuploadTexture( textureProperties, texture, slot );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\r\n\r\n\t}\r\n\r\n\tfunction clampToMaxSize ( image, maxSize ) {\r\n\r\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\r\n\r\n\t\t\t// Warning: Scaling through the canvas will only work with images that use\r\n\t\t\t// premultiplied alpha.\r\n\r\n\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\r\n\r\n\t\t\tvar canvas = document.createElement( 'canvas' );\r\n\t\t\tcanvas.width = Math.floor( image.width * scale );\r\n\t\t\tcanvas.height = Math.floor( image.height * scale );\r\n\r\n\t\t\tvar context = canvas.getContext( '2d' );\r\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\r\n\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\r\n\r\n\t\t\treturn canvas;\r\n\r\n\t\t}\r\n\r\n\t\treturn image;\r\n\r\n\t}\r\n\r\n\tfunction isPowerOfTwo( image ) {\r\n\r\n\t\treturn THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height );\r\n\r\n\t}\r\n\r\n\tfunction textureNeedsPowerOfTwo( texture ) {\r\n\r\n\t\tif ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) return true;\r\n\t\tif ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) return true;\r\n\r\n\t\treturn false;\r\n\r\n\t}\r\n\r\n\tfunction makePowerOfTwo( image ) {\r\n\r\n\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\r\n\r\n\t\t\tvar canvas = document.createElement( 'canvas' );\r\n\t\t\tcanvas.width = THREE.Math.nearestPowerOfTwo( image.width );\r\n\t\t\tcanvas.height = THREE.Math.nearestPowerOfTwo( image.height );\r\n\r\n\t\t\tvar context = canvas.getContext( '2d' );\r\n\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\r\n\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\r\n\r\n\t\t\treturn canvas;\r\n\r\n\t\t}\r\n\r\n\t\treturn image;\r\n\r\n\t}\r\n\r\n\tfunction setCubeTexture ( texture, slot ) {\r\n\r\n\t\tvar textureProperties = properties.get( texture );\r\n\r\n\t\tif ( texture.image.length === 6 ) {\r\n\r\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\r\n\r\n\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\r\n\r\n\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\r\n\r\n\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\r\n\r\n\t\t\t\t\t_infoMemory.textures ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\r\n\r\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\r\n\r\n\t\t\t\tvar isCompressed = texture instanceof THREE.CompressedTexture;\r\n\t\t\t\tvar isDataTexture = texture.image[ 0 ] instanceof THREE.DataTexture;\r\n\r\n\t\t\t\tvar cubeImage = [];\r\n\r\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t\tif ( _this.autoScaleCubemaps && ! isCompressed && ! isDataTexture ) {\r\n\r\n\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar image = cubeImage[ 0 ],\r\n\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\r\n\t\t\t\tglFormat = paramThreeToGL( texture.format ),\r\n\t\t\t\tglType = paramThreeToGL( texture.type );\r\n\r\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\r\n\r\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t\tif ( ! isCompressed ) {\r\n\r\n\t\t\t\t\t\tif ( isDataTexture ) {\r\n\r\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\r\n\r\n\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\r\n\r\n\t\t\t\t\t\t\tif ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) {\r\n\r\n\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\r\n\r\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\r\n\r\n\t\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()\" );\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\r\n\r\n\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttextureProperties.__version = texture.version;\r\n\r\n\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setCubeTextureDynamic ( texture, slot ) {\r\n\r\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\r\n\r\n\t}\r\n\r\n\tvar setTextureWarned = false;\r\n\tthis.setTexture = function( texture, slot ) {\r\n\r\n\t\tif ( ! setTextureWarned ) {\r\n\r\n\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, \" +\r\n\t\t\t\t\"use setTexture2D instead.\" );\r\n\t\t\tsetTextureWarned = true;\r\n\r\n\t\t}\r\n\r\n\t\tsetTexture2D( texture, slot );\r\n\r\n\t};\r\n\r\n\tthis.allocTextureUnit = allocTextureUnit;\r\n\tthis.setTexture2D = setTexture2D;\r\n\tthis.setTextureCube = function( texture, slot ) {\r\n\r\n\t\tif ( texture instanceof THREE.CubeTexture ||\r\n\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\r\n\r\n\t\t\t// CompressedTexture can have Array in image :/\r\n\r\n\t\t\tsetCubeTexture( texture, slot );\r\n\r\n\t\t} else {\r\n\t\t\t// assumed: texture instanceof THREE.WebGLRenderTargetCube\r\n\r\n\t\t\tsetCubeTextureDynamic( texture.texture, slot );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Render targets\r\n\r\n\t// Setup storage for target texture and bind it to correct framebuffer\r\n\tfunction setupFrameBufferTexture ( framebuffer, renderTarget, attachment, textureTarget ) {\r\n\r\n\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\r\n\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\r\n\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\r\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\r\n\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\r\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\r\n\r\n\t}\r\n\r\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\r\n\tfunction setupRenderBufferStorage ( renderbuffer, renderTarget ) {\r\n\r\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\r\n\r\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\r\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\r\n\r\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\r\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// FIXME: We don't support !depth !stencil\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\r\n\r\n\t\t}\r\n\r\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\r\n\r\n\t}\r\n\r\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\r\n\tfunction setupDepthTexture ( framebuffer, renderTarget ) {\r\n\r\n\t\tvar isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );\r\n\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\r\n\r\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\r\n\r\n\t\tif ( !( renderTarget.depthTexture instanceof THREE.DepthTexture ) ) {\r\n\r\n\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\r\n\r\n\t\t}\r\n\r\n\t\t// upload an empty depth texture with framebuffer size\r\n\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\r\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\r\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\r\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\r\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\r\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\r\n\t\t}\r\n\r\n\t\t_this.setTexture( renderTarget.depthTexture, 0 );\r\n\r\n\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\r\n\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\r\n\r\n\t}\r\n\r\n\t// Setup GL resources for a non-texture depth buffer\r\n\tfunction setupDepthRenderbuffer( renderTarget ) {\r\n\r\n\t\tvar renderTargetProperties = properties.get( renderTarget );\r\n\r\n\t\tvar isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );\r\n\r\n\t\tif ( renderTarget.depthTexture ) {\r\n\r\n\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\r\n\r\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif ( isCube ) {\r\n\r\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\r\n\r\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\r\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\r\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\r\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\r\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\r\n\r\n\t}\r\n\r\n\t// Set up GL resources for the render target\r\n\tfunction setupRenderTarget( renderTarget ) {\r\n\r\n\t\tvar renderTargetProperties = properties.get( renderTarget );\r\n\t\tvar textureProperties = properties.get( renderTarget.texture );\r\n\r\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\r\n\r\n\t\ttextureProperties.__webglTexture = _gl.createTexture();\r\n\r\n\t\t_infoMemory.textures ++;\r\n\r\n\t\tvar isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );\r\n\t\tvar isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height );\r\n\r\n\t\t// Setup framebuffer\r\n\r\n\t\tif ( isCube ) {\r\n\r\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\r\n\r\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\r\n\r\n\t\t}\r\n\r\n\t\t// Setup color buffer\r\n\r\n\t\tif ( isCube ) {\r\n\r\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\r\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\r\n\r\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\r\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\r\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\r\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\r\n\r\n\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\r\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\r\n\r\n\t\t}\r\n\r\n\t\t// Setup depth and stencil buffers\r\n\r\n\t\tif ( renderTarget.depthBuffer ) {\r\n\r\n\t\t\tsetupDepthRenderbuffer( renderTarget );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.getCurrentRenderTarget = function() {\r\n\r\n\t\treturn _currentRenderTarget;\r\n\r\n\t};\r\n\r\n\tthis.setRenderTarget = function ( renderTarget ) {\r\n\r\n\t\t_currentRenderTarget = renderTarget;\r\n\r\n\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\r\n\r\n\t\t\tsetupRenderTarget( renderTarget );\r\n\r\n\t\t}\r\n\r\n\t\tvar isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );\r\n\t\tvar framebuffer;\r\n\r\n\t\tif ( renderTarget ) {\r\n\r\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\r\n\r\n\t\t\tif ( isCube ) {\r\n\r\n\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_currentScissor.copy( renderTarget.scissor );\r\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\r\n\r\n\t\t\t_currentViewport.copy( renderTarget.viewport );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tframebuffer = null;\r\n\r\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\r\n\t\t\t_currentScissorTest = _scissorTest;\r\n\r\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\r\n\r\n\t\t}\r\n\r\n\t\tif ( _currentFramebuffer !== framebuffer ) {\r\n\r\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\r\n\t\t\t_currentFramebuffer = framebuffer;\r\n\r\n\t\t}\r\n\r\n\t\tstate.scissor( _currentScissor );\r\n\t\tstate.setScissorTest( _currentScissorTest );\r\n\r\n\t\tstate.viewport( _currentViewport );\r\n\r\n\t\tif ( isCube ) {\r\n\r\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\r\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\r\n\r\n\t\tif ( renderTarget instanceof THREE.WebGLRenderTarget === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\r\n\r\n\t\tif ( framebuffer ) {\r\n\r\n\t\t\tvar restore = false;\r\n\r\n\t\t\tif ( framebuffer !== _currentFramebuffer ) {\r\n\r\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\r\n\r\n\t\t\t\trestore = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\r\n\t\t\t\tvar texture = renderTarget.texture;\r\n\r\n\t\t\t\tif ( texture.format !== THREE.RGBAFormat && paramThreeToGL( texture.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\r\n\r\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( texture.type !== THREE.UnsignedByteType &&\r\n\t\t\t\t paramThreeToGL( texture.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) &&\r\n\t\t\t\t ! ( texture.type === THREE.FloatType && extensions.get( 'WEBGL_color_buffer_float' ) ) &&\r\n\t\t\t\t ! ( texture.type === THREE.HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\r\n\r\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\r\n\r\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\r\n\r\n\t\t\t\t\tif ( ( x > 0 && x <= ( renderTarget.width - width ) ) && ( y > 0 && y <= ( renderTarget.height - height ) ) ) {\r\n\r\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( texture.format ), paramThreeToGL( texture.type ), buffer );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} finally {\r\n\r\n\t\t\t\tif ( restore ) {\r\n\r\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction updateRenderTargetMipmap( renderTarget ) {\r\n\r\n\t\tvar target = renderTarget instanceof THREE.WebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\r\n\t\tvar texture = properties.get( renderTarget.texture ).__webglTexture;\r\n\r\n\t\tstate.bindTexture( target, texture );\r\n\t\t_gl.generateMipmap( target );\r\n\t\tstate.bindTexture( target, null );\r\n\r\n\t}\r\n\r\n\t// Fallback filters for non-power-of-2 textures\r\n\r\n\tfunction filterFallback ( f ) {\r\n\r\n\t\tif ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) {\r\n\r\n\t\t\treturn _gl.NEAREST;\r\n\r\n\t\t}\r\n\r\n\t\treturn _gl.LINEAR;\r\n\r\n\t}\r\n\r\n\t// Map three.js constants to WebGL constants\r\n\r\n\tfunction paramThreeToGL ( p ) {\r\n\r\n\t\tvar extension;\r\n\r\n\t\tif ( p === THREE.RepeatWrapping ) return _gl.REPEAT;\r\n\t\tif ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\r\n\t\tif ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\r\n\r\n\t\tif ( p === THREE.NearestFilter ) return _gl.NEAREST;\r\n\t\tif ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\r\n\t\tif ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\r\n\r\n\t\tif ( p === THREE.LinearFilter ) return _gl.LINEAR;\r\n\t\tif ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\r\n\t\tif ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\r\n\r\n\t\tif ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE;\r\n\t\tif ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\r\n\t\tif ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\r\n\t\tif ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\r\n\r\n\t\tif ( p === THREE.ByteType ) return _gl.BYTE;\r\n\t\tif ( p === THREE.ShortType ) return _gl.SHORT;\r\n\t\tif ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT;\r\n\t\tif ( p === THREE.IntType ) return _gl.INT;\r\n\t\tif ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT;\r\n\t\tif ( p === THREE.FloatType ) return _gl.FLOAT;\r\n\r\n\t\textension = extensions.get( 'OES_texture_half_float' );\r\n\r\n\t\tif ( extension !== null ) {\r\n\r\n\t\t\tif ( p === THREE.HalfFloatType ) return extension.HALF_FLOAT_OES;\r\n\r\n\t\t}\r\n\r\n\t\tif ( p === THREE.AlphaFormat ) return _gl.ALPHA;\r\n\t\tif ( p === THREE.RGBFormat ) return _gl.RGB;\r\n\t\tif ( p === THREE.RGBAFormat ) return _gl.RGBA;\r\n\t\tif ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE;\r\n\t\tif ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\r\n\t\tif ( p === THREE.DepthFormat ) return _gl.DEPTH_COMPONENT;\r\n\r\n\t\tif ( p === THREE.AddEquation ) return _gl.FUNC_ADD;\r\n\t\tif ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT;\r\n\t\tif ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\r\n\r\n\t\tif ( p === THREE.ZeroFactor ) return _gl.ZERO;\r\n\t\tif ( p === THREE.OneFactor ) return _gl.ONE;\r\n\t\tif ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR;\r\n\t\tif ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\r\n\t\tif ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA;\r\n\t\tif ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\r\n\t\tif ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA;\r\n\t\tif ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\r\n\r\n\t\tif ( p === THREE.DstColorFactor ) return _gl.DST_COLOR;\r\n\t\tif ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\r\n\t\tif ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\r\n\r\n\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\r\n\r\n\t\tif ( extension !== null ) {\r\n\r\n\t\t\tif ( p === THREE.RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\r\n\t\t\tif ( p === THREE.RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\r\n\t\t\tif ( p === THREE.RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\r\n\t\t\tif ( p === THREE.RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\r\n\r\n\t\t}\r\n\r\n\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\r\n\r\n\t\tif ( extension !== null ) {\r\n\r\n\t\t\tif ( p === THREE.RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\r\n\t\t\tif ( p === THREE.RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\r\n\t\t\tif ( p === THREE.RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\r\n\t\t\tif ( p === THREE.RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\r\n\r\n\t\t}\r\n\r\n\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\r\n\r\n\t\tif ( extension !== null ) {\r\n\r\n\t\t\tif ( p === THREE.RGB_ETC1_Format ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\r\n\r\n\t\t}\r\n\r\n\t\textension = extensions.get( 'EXT_blend_minmax' );\r\n\r\n\t\tif ( extension !== null ) {\r\n\r\n\t\t\tif ( p === THREE.MinEquation ) return extension.MIN_EXT;\r\n\t\t\tif ( p === THREE.MaxEquation ) return extension.MAX_EXT;\r\n\r\n\t\t}\r\n\r\n\t\treturn 0;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/renderers/WebGLRenderTarget.js\r\n\r\n/**\r\n * @author szimek / https://github.com/szimek/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author Marius Kintel / https://github.com/kintel\r\n */\r\n\r\n/*\r\n In options, we can specify:\r\n * Texture parameters for an auto-generated target texture\r\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\r\n*/\r\nTHREE.WebGLRenderTarget = function ( width, height, options ) {\r\n\r\n\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\tthis.width = width;\r\n\tthis.height = height;\r\n\r\n\tthis.scissor = new THREE.Vector4( 0, 0, width, height );\r\n\tthis.scissorTest = false;\r\n\r\n\tthis.viewport = new THREE.Vector4( 0, 0, width, height );\r\n\r\n\toptions = options || {};\r\n\r\n\tif ( options.minFilter === undefined ) options.minFilter = THREE.LinearFilter;\r\n\r\n\tthis.texture = new THREE.Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\r\n\r\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\r\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\r\n\tthis.depthTexture = null;\r\n\r\n};\r\n\r\nTHREE.WebGLRenderTarget.prototype = {\r\n\r\n\tconstructor: THREE.WebGLRenderTarget,\r\n\r\n\tsetSize: function ( width, height ) {\r\n\r\n\t\tif ( this.width !== width || this.height !== height ) {\r\n\r\n\t\t\tthis.width = width;\r\n\t\t\tthis.height = height;\r\n\r\n\t\t\tthis.dispose();\r\n\r\n\t\t}\r\n\r\n\t\tthis.viewport.set( 0, 0, width, height );\r\n\t\tthis.scissor.set( 0, 0, width, height );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new this.constructor().copy( this );\r\n\r\n\t},\r\n\r\n\tcopy: function ( source ) {\r\n\r\n\t\tthis.width = source.width;\r\n\t\tthis.height = source.height;\r\n\r\n\t\tthis.viewport.copy( source.viewport );\r\n\r\n\t\tthis.texture = source.texture.clone();\r\n\r\n\t\tthis.depthBuffer = source.depthBuffer;\r\n\t\tthis.stencilBuffer = source.stencilBuffer;\r\n\t\tthis.depthTexture = source.depthTexture;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.EventDispatcher.prototype.apply( THREE.WebGLRenderTarget.prototype );\r\n\r\n// File:src/renderers/WebGLRenderTargetCube.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com\r\n */\r\n\r\nTHREE.WebGLRenderTargetCube = function ( width, height, options ) {\r\n\r\n\tTHREE.WebGLRenderTarget.call( this, width, height, options );\r\n\r\n\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\r\n\tthis.activeMipMapLevel = 0;\r\n\r\n};\r\n\r\nTHREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.prototype );\r\nTHREE.WebGLRenderTargetCube.prototype.constructor = THREE.WebGLRenderTargetCube;\r\n\r\n// File:src/renderers/webgl/WebGLBufferRenderer.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLBufferRenderer = function ( _gl, extensions, _infoRender ) {\r\n\r\n\tvar mode;\r\n\r\n\tfunction setMode( value ) {\r\n\r\n\t\tmode = value;\r\n\r\n\t}\r\n\r\n\tfunction render( start, count ) {\r\n\r\n\t\t_gl.drawArrays( mode, start, count );\r\n\r\n\t\t_infoRender.calls ++;\r\n\t\t_infoRender.vertices += count;\r\n\t\tif ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3;\r\n\r\n\t}\r\n\r\n\tfunction renderInstances( geometry ) {\r\n\r\n\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\r\n\r\n\t\tif ( extension === null ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar position = geometry.attributes.position;\r\n\r\n\t\tvar count = 0;\r\n\r\n\t\tif ( position instanceof THREE.InterleavedBufferAttribute ) {\r\n\r\n\t\t\tcount = position.data.count;\r\n\r\n\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tcount = position.count;\r\n\r\n\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\r\n\r\n\t\t}\r\n\r\n\t\t_infoRender.calls ++;\r\n\t\t_infoRender.vertices += count * geometry.maxInstancedCount;\r\n\t\tif ( mode === _gl.TRIANGLES ) _infoRender.faces += geometry.maxInstancedCount * count / 3;\r\n\r\n\t}\r\n\r\n\tthis.setMode = setMode;\r\n\tthis.render = render;\r\n\tthis.renderInstances = renderInstances;\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLIndexedBufferRenderer.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLIndexedBufferRenderer = function ( _gl, extensions, _infoRender ) {\r\n\r\n\tvar mode;\r\n\r\n\tfunction setMode( value ) {\r\n\r\n\t\tmode = value;\r\n\r\n\t}\r\n\r\n\tvar type, size;\r\n\r\n\tfunction setIndex( index ) {\r\n\r\n\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\r\n\r\n\t\t\ttype = _gl.UNSIGNED_INT;\r\n\t\t\tsize = 4;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ttype = _gl.UNSIGNED_SHORT;\r\n\t\t\tsize = 2;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction render( start, count ) {\r\n\r\n\t\t_gl.drawElements( mode, count, type, start * size );\r\n\r\n\t\t_infoRender.calls ++;\r\n\t\t_infoRender.vertices += count;\r\n\t\tif ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3;\r\n\r\n\t}\r\n\r\n\tfunction renderInstances( geometry, start, count ) {\r\n\r\n\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\r\n\r\n\t\tif ( extension === null ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\r\n\r\n\t\t_infoRender.calls ++;\r\n\t\t_infoRender.vertices += count * geometry.maxInstancedCount;\r\n\t\tif ( mode === _gl.TRIANGLES ) _infoRender.faces += geometry.maxInstancedCount * count / 3;\r\n\t}\r\n\r\n\tthis.setMode = setMode;\r\n\tthis.setIndex = setIndex;\r\n\tthis.render = render;\r\n\tthis.renderInstances = renderInstances;\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLExtensions.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLExtensions = function ( gl ) {\r\n\r\n\tvar extensions = {};\r\n\r\n\tthis.get = function ( name ) {\r\n\r\n\t\tif ( extensions[ name ] !== undefined ) {\r\n\r\n\t\t\treturn extensions[ name ];\r\n\r\n\t\t}\r\n\r\n\t\tvar extension;\r\n\r\n\t\tswitch ( name ) {\r\n\r\n\t\t\tcase 'WEBGL_depth_texture':\r\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\r\n\r\n\t\t\tcase 'EXT_texture_filter_anisotropic':\r\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\r\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\r\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'WEBGL_compressed_texture_etc1':\r\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\textension = gl.getExtension( name );\r\n\r\n\t\t}\r\n\r\n\t\tif ( extension === null ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\r\n\r\n\t\t}\r\n\r\n\t\textensions[ name ] = extension;\r\n\r\n\t\treturn extension;\r\n\r\n\t};\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLCapabilities.js\r\n\r\nTHREE.WebGLCapabilities = function ( gl, extensions, parameters ) {\r\n\r\n\tfunction getMaxPrecision( precision ) {\r\n\r\n\t\tif ( precision === 'highp' ) {\r\n\r\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\r\n\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\r\n\r\n\t\t\t\treturn 'highp';\r\n\r\n\t\t\t}\r\n\r\n\t\t\tprecision = 'mediump';\r\n\r\n\t\t}\r\n\r\n\t\tif ( precision === 'mediump' ) {\r\n\r\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\r\n\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\r\n\r\n\t\t\t\treturn 'mediump';\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn 'lowp';\r\n\r\n\t}\r\n\r\n\tthis.getMaxPrecision = getMaxPrecision;\r\n\r\n\tthis.precision = parameters.precision !== undefined ? parameters.precision : 'highp',\r\n\tthis.logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false;\r\n\r\n\tthis.maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\r\n\tthis.maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\r\n\tthis.maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\r\n\tthis.maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\r\n\r\n\tthis.maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\r\n\tthis.maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\r\n\tthis.maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\r\n\tthis.maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\r\n\r\n\tthis.vertexTextures = this.maxVertexTextures > 0;\r\n\tthis.floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\r\n\tthis.floatVertexTextures = this.vertexTextures && this.floatFragmentTextures;\r\n\r\n\tvar _maxPrecision = getMaxPrecision( this.precision );\r\n\r\n\tif ( _maxPrecision !== this.precision ) {\r\n\r\n\t\tconsole.warn( 'THREE.WebGLRenderer:', this.precision, 'not supported, using', _maxPrecision, 'instead.' );\r\n\t\tthis.precision = _maxPrecision;\r\n\r\n\t}\r\n\r\n\tif ( this.logarithmicDepthBuffer ) {\r\n\r\n\t\tthis.logarithmicDepthBuffer = !! extensions.get( 'EXT_frag_depth' );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLGeometries.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLGeometries = function ( gl, properties, info ) {\r\n\r\n\tvar geometries = {};\r\n\r\n\tfunction get( object ) {\r\n\r\n\t\tvar geometry = object.geometry;\r\n\r\n\t\tif ( geometries[ geometry.id ] !== undefined ) {\r\n\r\n\t\t\treturn geometries[ geometry.id ];\r\n\r\n\t\t}\r\n\r\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\r\n\r\n\t\tvar buffergeometry;\r\n\r\n\t\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\tbuffergeometry = geometry;\r\n\r\n\t\t} else if ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\tif ( geometry._bufferGeometry === undefined ) {\r\n\r\n\t\t\t\tgeometry._bufferGeometry = new THREE.BufferGeometry().setFromObject( object );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbuffergeometry = geometry._bufferGeometry;\r\n\r\n\t\t}\r\n\r\n\t\tgeometries[ geometry.id ] = buffergeometry;\r\n\r\n\t\tinfo.memory.geometries ++;\r\n\r\n\t\treturn buffergeometry;\r\n\r\n\t}\r\n\r\n\tfunction onGeometryDispose( event ) {\r\n\r\n\t\tvar geometry = event.target;\r\n\t\tvar buffergeometry = geometries[ geometry.id ];\r\n\r\n\t\tif ( buffergeometry.index !== null ) {\r\n\r\n\t\t\tdeleteAttribute( buffergeometry.index );\r\n\r\n\t\t}\r\n\r\n\t\tdeleteAttributes( buffergeometry.attributes );\r\n\r\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\r\n\r\n\t\tdelete geometries[ geometry.id ];\r\n\r\n\t\t// TODO\r\n\r\n\t\tvar property = properties.get( geometry );\r\n\r\n\t\tif ( property.wireframe ) {\r\n\r\n\t\t\tdeleteAttribute( property.wireframe );\r\n\r\n\t\t}\r\n\r\n\t\tproperties.delete( geometry );\r\n\r\n\t\tvar bufferproperty = properties.get( buffergeometry );\r\n\r\n\t\tif ( bufferproperty.wireframe ) {\r\n\r\n\t\t\tdeleteAttribute( bufferproperty.wireframe );\r\n\r\n\t\t}\r\n\r\n\t\tproperties.delete( buffergeometry );\r\n\r\n\t\t//\r\n\r\n\t\tinfo.memory.geometries --;\r\n\r\n\t}\r\n\r\n\tfunction getAttributeBuffer( attribute ) {\r\n\r\n\t\tif ( attribute instanceof THREE.InterleavedBufferAttribute ) {\r\n\r\n\t\t\treturn properties.get( attribute.data ).__webglBuffer;\r\n\r\n\t\t}\r\n\r\n\t\treturn properties.get( attribute ).__webglBuffer;\r\n\r\n\t}\r\n\r\n\tfunction deleteAttribute( attribute ) {\r\n\r\n\t\tvar buffer = getAttributeBuffer( attribute );\r\n\r\n\t\tif ( buffer !== undefined ) {\r\n\r\n\t\t\tgl.deleteBuffer( buffer );\r\n\t\t\tremoveAttributeBuffer( attribute );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction deleteAttributes( attributes ) {\r\n\r\n\t\tfor ( var name in attributes ) {\r\n\r\n\t\t\tdeleteAttribute( attributes[ name ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction removeAttributeBuffer( attribute ) {\r\n\r\n\t\tif ( attribute instanceof THREE.InterleavedBufferAttribute ) {\r\n\r\n\t\t\tproperties.delete( attribute.data );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tproperties.delete( attribute );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.get = get;\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLLights.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLLights = function () {\r\n\r\n\tvar lights = {};\r\n\r\n\tthis.get = function ( light ) {\r\n\r\n\t\tif ( lights[ light.id ] !== undefined ) {\r\n\r\n\t\t\treturn lights[ light.id ];\r\n\r\n\t\t}\r\n\r\n\t\tvar uniforms;\r\n\r\n\t\tswitch ( light.type ) {\r\n\r\n\t\t\tcase 'DirectionalLight':\r\n\t\t\t\tuniforms = {\r\n\t\t\t\t\tdirection: new THREE.Vector3(),\r\n\t\t\t\t\tcolor: new THREE.Color(),\r\n\r\n\t\t\t\t\tshadow: false,\r\n\t\t\t\t\tshadowBias: 0,\r\n\t\t\t\t\tshadowRadius: 1,\r\n\t\t\t\t\tshadowMapSize: new THREE.Vector2()\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'SpotLight':\r\n\t\t\t\tuniforms = {\r\n\t\t\t\t\tposition: new THREE.Vector3(),\r\n\t\t\t\t\tdirection: new THREE.Vector3(),\r\n\t\t\t\t\tcolor: new THREE.Color(),\r\n\t\t\t\t\tdistance: 0,\r\n\t\t\t\t\tconeCos: 0,\r\n\t\t\t\t\tpenumbraCos: 0,\r\n\t\t\t\t\tdecay: 0,\r\n\r\n\t\t\t\t\tshadow: false,\r\n\t\t\t\t\tshadowBias: 0,\r\n\t\t\t\t\tshadowRadius: 1,\r\n\t\t\t\t\tshadowMapSize: new THREE.Vector2()\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'PointLight':\r\n\t\t\t\tuniforms = {\r\n\t\t\t\t\tposition: new THREE.Vector3(),\r\n\t\t\t\t\tcolor: new THREE.Color(),\r\n\t\t\t\t\tdistance: 0,\r\n\t\t\t\t\tdecay: 0,\r\n\r\n\t\t\t\t\tshadow: false,\r\n\t\t\t\t\tshadowBias: 0,\r\n\t\t\t\t\tshadowRadius: 1,\r\n\t\t\t\t\tshadowMapSize: new THREE.Vector2()\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'HemisphereLight':\r\n\t\t\t\tuniforms = {\r\n\t\t\t\t\tdirection: new THREE.Vector3(),\r\n\t\t\t\t\tskyColor: new THREE.Color(),\r\n\t\t\t\t\tgroundColor: new THREE.Color()\r\n\t\t\t\t};\r\n\t\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t\tlights[ light.id ] = uniforms;\r\n\r\n\t\treturn uniforms;\r\n\r\n\t};\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLObjects.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLObjects = function ( gl, properties, info ) {\r\n\r\n\tvar geometries = new THREE.WebGLGeometries( gl, properties, info );\r\n\r\n\t//\r\n\r\n\tfunction update( object ) {\r\n\r\n\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\r\n\r\n\t\tvar geometry = geometries.get( object );\r\n\r\n\t\tif ( object.geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\tgeometry.updateFromObject( object );\r\n\r\n\t\t}\r\n\r\n\t\tvar index = geometry.index;\r\n\t\tvar attributes = geometry.attributes;\r\n\r\n\t\tif ( index !== null ) {\r\n\r\n\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in attributes ) {\r\n\r\n\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\r\n\r\n\t\t}\r\n\r\n\t\t// morph targets\r\n\r\n\t\tvar morphAttributes = geometry.morphAttributes;\r\n\r\n\t\tfor ( var name in morphAttributes ) {\r\n\r\n\t\t\tvar array = morphAttributes[ name ];\r\n\r\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn geometry;\r\n\r\n\t}\r\n\r\n\tfunction updateAttribute( attribute, bufferType ) {\r\n\r\n\t\tvar data = ( attribute instanceof THREE.InterleavedBufferAttribute ) ? attribute.data : attribute;\r\n\r\n\t\tvar attributeProperties = properties.get( data );\r\n\r\n\t\tif ( attributeProperties.__webglBuffer === undefined ) {\r\n\r\n\t\t\tcreateBuffer( attributeProperties, data, bufferType );\r\n\r\n\t\t} else if ( attributeProperties.version !== data.version ) {\r\n\r\n\t\t\tupdateBuffer( attributeProperties, data, bufferType );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction createBuffer( attributeProperties, data, bufferType ) {\r\n\r\n\t\tattributeProperties.__webglBuffer = gl.createBuffer();\r\n\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\r\n\r\n\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\r\n\r\n\t\tgl.bufferData( bufferType, data.array, usage );\r\n\r\n\t\tattributeProperties.version = data.version;\r\n\r\n\t}\r\n\r\n\tfunction updateBuffer( attributeProperties, data, bufferType ) {\r\n\r\n\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\r\n\r\n\t\tif ( data.dynamic === false || data.updateRange.count === - 1 ) {\r\n\r\n\t\t\t// Not using update ranges\r\n\r\n\t\t\tgl.bufferSubData( bufferType, 0, data.array );\r\n\r\n\t\t} else if ( data.updateRange.count === 0 ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\r\n\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\r\n\r\n\t\t\tdata.updateRange.count = 0; // reset range\r\n\r\n\t\t}\r\n\r\n\t\tattributeProperties.version = data.version;\r\n\r\n\t}\r\n\r\n\tfunction getAttributeBuffer( attribute ) {\r\n\r\n\t\tif ( attribute instanceof THREE.InterleavedBufferAttribute ) {\r\n\r\n\t\t\treturn properties.get( attribute.data ).__webglBuffer;\r\n\r\n\t\t}\r\n\r\n\t\treturn properties.get( attribute ).__webglBuffer;\r\n\r\n\t}\r\n\r\n\tfunction getWireframeAttribute( geometry ) {\r\n\r\n\t\tvar property = properties.get( geometry );\r\n\r\n\t\tif ( property.wireframe !== undefined ) {\r\n\r\n\t\t\treturn property.wireframe;\r\n\r\n\t\t}\r\n\r\n\t\tvar indices = [];\r\n\r\n\t\tvar index = geometry.index;\r\n\t\tvar attributes = geometry.attributes;\r\n\t\tvar position = attributes.position;\r\n\r\n\t\t// console.time( 'wireframe' );\r\n\r\n\t\tif ( index !== null ) {\r\n\r\n\t\t\tvar edges = {};\r\n\t\t\tvar array = index.array;\r\n\r\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\r\n\r\n\t\t\t\tvar a = array[ i + 0 ];\r\n\t\t\t\tvar b = array[ i + 1 ];\r\n\t\t\t\tvar c = array[ i + 2 ];\r\n\r\n\t\t\t\tif ( checkEdge( edges, a, b ) ) indices.push( a, b );\r\n\t\t\t\tif ( checkEdge( edges, b, c ) ) indices.push( b, c );\r\n\t\t\t\tif ( checkEdge( edges, c, a ) ) indices.push( c, a );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar array = attributes.position.array;\r\n\r\n\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\r\n\r\n\t\t\t\tvar a = i + 0;\r\n\t\t\t\tvar b = i + 1;\r\n\t\t\t\tvar c = i + 2;\r\n\r\n\t\t\t\tindices.push( a, b, b, c, c, a );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// console.timeEnd( 'wireframe' );\r\n\r\n\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\r\n\t\tvar attribute = new THREE.BufferAttribute( new TypeArray( indices ), 1 );\r\n\r\n\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\r\n\r\n\t\tproperty.wireframe = attribute;\r\n\r\n\t\treturn attribute;\r\n\r\n\t}\r\n\r\n\tfunction checkEdge( edges, a, b ) {\r\n\r\n\t\tif ( a > b ) {\r\n\r\n\t\t\tvar tmp = a;\r\n\t\t\ta = b;\r\n\t\t\tb = tmp;\r\n\r\n\t\t}\r\n\r\n\t\tvar list = edges[ a ];\r\n\r\n\t\tif ( list === undefined ) {\r\n\r\n\t\t\tedges[ a ] = [ b ];\r\n\t\t\treturn true;\r\n\r\n\t\t} else if ( list.indexOf( b ) === -1 ) {\r\n\r\n\t\t\tlist.push( b );\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t}\r\n\r\n\tthis.getAttributeBuffer = getAttributeBuffer;\r\n\tthis.getWireframeAttribute = getWireframeAttribute;\r\n\r\n\tthis.update = update;\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLProgram.js\r\n\r\nTHREE.WebGLProgram = ( function () {\r\n\r\n\tvar programIdCount = 0;\r\n\r\n\tfunction getEncodingComponents( encoding ) {\r\n\r\n\t\tswitch ( encoding ) {\r\n\r\n\t\t\tcase THREE.LinearEncoding:\r\n\t\t\t\treturn [ 'Linear','( value )' ];\r\n\t\t\tcase THREE.sRGBEncoding:\r\n\t\t\t\treturn [ 'sRGB','( value )' ];\r\n\t\t\tcase THREE.RGBEEncoding:\r\n\t\t\t\treturn [ 'RGBE','( value )' ];\r\n\t\t\tcase THREE.RGBM7Encoding:\r\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\r\n\t\t\tcase THREE.RGBM16Encoding:\r\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\r\n\t\t\tcase THREE.RGBDEncoding:\r\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\r\n\t\t\tcase THREE.GammaEncoding:\r\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\r\n\r\n\t\tvar components = getEncodingComponents( encoding );\r\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\r\n\r\n\t}\r\n\r\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\r\n\r\n\t\tvar components = getEncodingComponents( encoding );\r\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\r\n\r\n\t}\r\n\r\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\r\n\r\n\t\tvar toneMappingName;\r\n\r\n\t\tswitch ( toneMapping ) {\r\n\r\n\t\t\tcase THREE.LinearToneMapping:\r\n\t\t\t\ttoneMappingName = \"Linear\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase THREE.ReinhardToneMapping:\r\n\t\t\t\ttoneMappingName = \"Reinhard\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase THREE.Uncharted2ToneMapping:\r\n\t\t\t\ttoneMappingName = \"Uncharted2\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase THREE.CineonToneMapping:\r\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\r\n\r\n\t\t}\r\n\r\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\r\n\r\n\t}\r\n\r\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\r\n\r\n\t\textensions = extensions || {};\r\n\r\n\t\tvar chunks = [\r\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\r\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\r\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\r\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\r\n\t\t];\r\n\r\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\r\n\r\n\t}\r\n\r\n\tfunction generateDefines( defines ) {\r\n\r\n\t\tvar chunks = [];\r\n\r\n\t\tfor ( var name in defines ) {\r\n\r\n\t\t\tvar value = defines[ name ];\r\n\r\n\t\t\tif ( value === false ) continue;\r\n\r\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\r\n\r\n\t\t}\r\n\r\n\t\treturn chunks.join( '\\n' );\r\n\r\n\t}\r\n\r\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\r\n\r\n\t\tvar attributes = {};\r\n\r\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\r\n\r\n\t\tfor ( var i = 0; i < n; i ++ ) {\r\n\r\n\t\t\tvar info = gl.getActiveAttrib( program, i );\r\n\t\t\tvar name = info.name;\r\n\r\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\r\n\r\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\r\n\r\n\t\t}\r\n\r\n\t\treturn attributes;\r\n\r\n\t}\r\n\r\n\tfunction filterEmptyLine( string ) {\r\n\r\n\t\treturn string !== '';\r\n\r\n\t}\r\n\r\n\tfunction replaceLightNums( string, parameters ) {\r\n\r\n\t\treturn string\r\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\r\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\r\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\r\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\r\n\r\n\t}\r\n\r\n\tfunction parseIncludes( string ) {\r\n\r\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\r\n\r\n\t\tfunction replace( match, include ) {\r\n\r\n\t\t\tvar replace = THREE.ShaderChunk[ include ];\r\n\r\n\t\t\tif ( replace === undefined ) {\r\n\r\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn parseIncludes( replace );\r\n\r\n\t\t}\r\n\r\n\t\treturn string.replace( pattern, replace );\r\n\r\n\t}\r\n\r\n\tfunction unrollLoops( string ) {\r\n\r\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\r\n\r\n\t\tfunction replace( match, start, end, snippet ) {\r\n\r\n\t\t\tvar unroll = '';\r\n\r\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\r\n\r\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn unroll;\r\n\r\n\t\t}\r\n\r\n\t\treturn string.replace( pattern, replace );\r\n\r\n\t}\r\n\r\n\treturn function WebGLProgram( renderer, code, material, parameters ) {\r\n\r\n\t\tvar gl = renderer.context;\r\n\r\n\t\tvar extensions = material.extensions;\r\n\t\tvar defines = material.defines;\r\n\r\n\t\tvar vertexShader = material.__webglShader.vertexShader;\r\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\r\n\r\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\r\n\r\n\t\tif ( parameters.shadowMapType === THREE.PCFShadowMap ) {\r\n\r\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\r\n\r\n\t\t} else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {\r\n\r\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\r\n\r\n\t\t}\r\n\r\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\r\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\r\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\r\n\r\n\t\tif ( parameters.envMap ) {\r\n\r\n\t\t\tswitch ( material.envMap.mapping ) {\r\n\r\n\t\t\t\tcase THREE.CubeReflectionMapping:\r\n\t\t\t\tcase THREE.CubeRefractionMapping:\r\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.CubeUVReflectionMapping:\r\n\t\t\t\tcase THREE.CubeUVRefractionMapping:\r\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.EquirectangularReflectionMapping:\r\n\t\t\t\tcase THREE.EquirectangularRefractionMapping:\r\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.SphericalReflectionMapping:\r\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tswitch ( material.envMap.mapping ) {\r\n\r\n\t\t\t\tcase THREE.CubeRefractionMapping:\r\n\t\t\t\tcase THREE.EquirectangularRefractionMapping:\r\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tswitch ( material.combine ) {\r\n\r\n\t\t\t\tcase THREE.MultiplyOperation:\r\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.MixOperation:\r\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase THREE.AddOperation:\r\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\r\n\r\n\t\t// console.log( 'building new program ' );\r\n\r\n\t\t//\r\n\r\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\r\n\r\n\t\tvar customDefines = generateDefines( defines );\r\n\r\n\t\t//\r\n\r\n\t\tvar program = gl.createProgram();\r\n\r\n\t\tvar prefixVertex, prefixFragment;\r\n\r\n\t\tif ( material instanceof THREE.RawShaderMaterial ) {\r\n\r\n\t\t\tprefixVertex = '';\r\n\t\t\tprefixFragment = '';\r\n\r\n\t\t} else {\r\n\r\n\t\t\tprefixVertex = [\r\n\r\n\t\t\t\t'precision ' + parameters.precision + ' float;',\r\n\t\t\t\t'precision ' + parameters.precision + ' int;',\r\n\r\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\r\n\r\n\t\t\t\tcustomDefines,\r\n\r\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\r\n\r\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\r\n\r\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\r\n\r\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\r\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\r\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\r\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\r\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\r\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\r\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\r\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\r\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\r\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\r\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\r\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\r\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\r\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\r\n\r\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\r\n\r\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\r\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\r\n\r\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\r\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\r\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\r\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\r\n\r\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\r\n\r\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\r\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\r\n\r\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\r\n\r\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\r\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\r\n\r\n\t\t\t\t'uniform mat4 modelMatrix;',\r\n\t\t\t\t'uniform mat4 modelViewMatrix;',\r\n\t\t\t\t'uniform mat4 projectionMatrix;',\r\n\t\t\t\t'uniform mat4 viewMatrix;',\r\n\t\t\t\t'uniform mat3 normalMatrix;',\r\n\t\t\t\t'uniform vec3 cameraPosition;',\r\n\r\n\t\t\t\t'attribute vec3 position;',\r\n\t\t\t\t'attribute vec3 normal;',\r\n\t\t\t\t'attribute vec2 uv;',\r\n\r\n\t\t\t\t'#ifdef USE_COLOR',\r\n\r\n\t\t\t\t'\tattribute vec3 color;',\r\n\r\n\t\t\t\t'#endif',\r\n\r\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\r\n\r\n\t\t\t\t'\tattribute vec3 morphTarget0;',\r\n\t\t\t\t'\tattribute vec3 morphTarget1;',\r\n\t\t\t\t'\tattribute vec3 morphTarget2;',\r\n\t\t\t\t'\tattribute vec3 morphTarget3;',\r\n\r\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\r\n\r\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\r\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\r\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\r\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\r\n\r\n\t\t\t\t'\t#else',\r\n\r\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\r\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\r\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\r\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\r\n\r\n\t\t\t\t'\t#endif',\r\n\r\n\t\t\t\t'#endif',\r\n\r\n\t\t\t\t'#ifdef USE_SKINNING',\r\n\r\n\t\t\t\t'\tattribute vec4 skinIndex;',\r\n\t\t\t\t'\tattribute vec4 skinWeight;',\r\n\r\n\t\t\t\t'#endif',\r\n\r\n\t\t\t\t'\\n'\r\n\r\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\r\n\r\n\t\t\tprefixFragment = [\r\n\r\n\t\t\t\tcustomExtensions,\r\n\r\n\t\t\t\t'precision ' + parameters.precision + ' float;',\r\n\t\t\t\t'precision ' + parameters.precision + ' int;',\r\n\r\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\r\n\r\n\t\t\t\tcustomDefines,\r\n\r\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\r\n\r\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\r\n\r\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\r\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\r\n\r\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\r\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\r\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\r\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\r\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\r\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\r\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\r\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\r\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\r\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\r\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\r\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\r\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\r\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\r\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\r\n\r\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\r\n\r\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\r\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\r\n\r\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\r\n\r\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\r\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\r\n\r\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\r\n\r\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\r\n\r\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\r\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\r\n\r\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\r\n\r\n\t\t\t\t'uniform mat4 viewMatrix;',\r\n\t\t\t\t'uniform vec3 cameraPosition;',\r\n\r\n\t\t\t\t( parameters.toneMapping !== THREE.NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\r\n\t\t\t\t( parameters.toneMapping !== THREE.NoToneMapping ) ? THREE.ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\r\n\t\t\t\t( parameters.toneMapping !== THREE.NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\r\n\r\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? THREE.ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\r\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\r\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\r\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\r\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\r\n\r\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\r\n\r\n\t\t\t\t'\\n'\r\n\r\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\r\n\r\n\t\t}\r\n\r\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\r\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\r\n\r\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\r\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\r\n\r\n\t\tif ( material instanceof THREE.ShaderMaterial === false ) {\r\n\r\n\t\t\tvertexShader = unrollLoops( vertexShader );\r\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\r\n\r\n\t\t}\r\n\r\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\r\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\r\n\r\n\t\t// console.log( '*VERTEX*', vertexGlsl );\r\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\r\n\r\n\t\tvar glVertexShader = THREE.WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\r\n\t\tvar glFragmentShader = THREE.WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\r\n\r\n\t\tgl.attachShader( program, glVertexShader );\r\n\t\tgl.attachShader( program, glFragmentShader );\r\n\r\n\t\t// Force a particular attribute to index 0.\r\n\r\n\t\tif ( material.index0AttributeName !== undefined ) {\r\n\r\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\r\n\r\n\t\t} else if ( parameters.morphTargets === true ) {\r\n\r\n\t\t\t// programs with morphTargets displace position out of attribute 0\r\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\r\n\r\n\t\t}\r\n\r\n\t\tgl.linkProgram( program );\r\n\r\n\t\tvar programLog = gl.getProgramInfoLog( program );\r\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\r\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\r\n\r\n\t\tvar runnable = true;\r\n\t\tvar haveDiagnostics = true;\r\n\r\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\r\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\r\n\r\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\r\n\r\n\t\t\trunnable = false;\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\r\n\r\n\t\t} else if ( programLog !== '' ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\r\n\r\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\r\n\r\n\t\t\thaveDiagnostics = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( haveDiagnostics ) {\r\n\r\n\t\t\tthis.diagnostics = {\r\n\r\n\t\t\t\trunnable: runnable,\r\n\t\t\t\tmaterial: material,\r\n\r\n\t\t\t\tprogramLog: programLog,\r\n\r\n\t\t\t\tvertexShader: {\r\n\r\n\t\t\t\t\tlog: vertexLog,\r\n\t\t\t\t\tprefix: prefixVertex\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tfragmentShader: {\r\n\r\n\t\t\t\t\tlog: fragmentLog,\r\n\t\t\t\t\tprefix: prefixFragment\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\t// clean up\r\n\r\n\t\tgl.deleteShader( glVertexShader );\r\n\t\tgl.deleteShader( glFragmentShader );\r\n\r\n\t\t// set up caching for uniform locations\r\n\r\n\t\tvar cachedUniforms;\r\n\r\n\t\tthis.getUniforms = function() {\r\n\r\n\t\t\tif ( cachedUniforms === undefined ) {\r\n\r\n\t\t\t\tcachedUniforms =\r\n\t\t\t\t\t\tnew THREE.WebGLUniforms( gl, program, renderer );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn cachedUniforms;\r\n\r\n\t\t};\r\n\r\n\t\t// set up caching for attribute locations\r\n\r\n\t\tvar cachedAttributes;\r\n\r\n\t\tthis.getAttributes = function() {\r\n\r\n\t\t\tif ( cachedAttributes === undefined ) {\r\n\r\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn cachedAttributes;\r\n\r\n\t\t};\r\n\r\n\t\t// free resource\r\n\r\n\t\tthis.destroy = function() {\r\n\r\n\t\t\tgl.deleteProgram( program );\r\n\t\t\tthis.program = undefined;\r\n\r\n\t\t};\r\n\r\n\t\t// DEPRECATED\r\n\r\n\t\tObject.defineProperties( this, {\r\n\r\n\t\t\tuniforms: {\r\n\t\t\t\tget: function() {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\r\n\t\t\t\t\treturn this.getUniforms();\r\n\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tattributes: {\r\n\t\t\t\tget: function() {\r\n\r\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\r\n\t\t\t\t\treturn this.getAttributes();\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t} );\r\n\r\n\r\n\t\t//\r\n\r\n\t\tthis.id = programIdCount ++;\r\n\t\tthis.code = code;\r\n\t\tthis.usedTimes = 1;\r\n\t\tthis.program = program;\r\n\t\tthis.vertexShader = glVertexShader;\r\n\t\tthis.fragmentShader = glFragmentShader;\r\n\r\n\t\treturn this;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n// File:src/renderers/webgl/WebGLPrograms.js\r\n\r\nTHREE.WebGLPrograms = function ( renderer, capabilities ) {\r\n\r\n\tvar programs = [];\r\n\r\n\tvar shaderIDs = {\r\n\t\tMeshDepthMaterial: 'depth',\r\n\t\tMeshNormalMaterial: 'normal',\r\n\t\tMeshBasicMaterial: 'basic',\r\n\t\tMeshLambertMaterial: 'lambert',\r\n\t\tMeshPhongMaterial: 'phong',\r\n\t\tMeshStandardMaterial: 'physical',\r\n\t\tMeshPhysicalMaterial: 'physical',\r\n\t\tLineBasicMaterial: 'basic',\r\n\t\tLineDashedMaterial: 'dashed',\r\n\t\tPointsMaterial: 'points'\r\n\t};\r\n\r\n\tvar parameterNames = [\r\n\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\r\n\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\r\n\t\t\"roughnessMap\", \"metalnessMap\",\r\n\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\r\n\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\r\n\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\r\n\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\r\n\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\r\n\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\r\n\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"depthPacking\"\r\n\t];\r\n\r\n\r\n\tfunction allocateBones ( object ) {\r\n\r\n\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\r\n\r\n\t\t\treturn 1024;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// default for when object is not specified\r\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\r\n\t\t\t//\r\n\t\t\t// - leave some extra space for other uniforms\r\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\r\n\t\t\t// (up to 54 should be safe)\r\n\r\n\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\r\n\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\r\n\r\n\t\t\tvar maxBones = nVertexMatrices;\r\n\r\n\t\t\tif ( object !== undefined && object instanceof THREE.SkinnedMesh ) {\r\n\r\n\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\r\n\r\n\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\r\n\r\n\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn maxBones;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\r\n\r\n\t\tvar encoding;\r\n\r\n\t\tif ( ! map ) {\r\n\r\n\t\t\tencoding = THREE.LinearEncoding;\r\n\r\n\t\t} else if ( map instanceof THREE.Texture ) {\r\n\r\n\t\t\tencoding = map.encoding;\r\n\r\n\t\t} else if ( map instanceof THREE.WebGLRenderTarget ) {\r\n\r\n\t\t\tencoding = map.texture.encoding;\r\n\r\n\t\t}\r\n\r\n\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\r\n\t\tif ( encoding === THREE.LinearEncoding && gammaOverrideLinear ) {\r\n\r\n\t\t\tencoding = THREE.GammaEncoding;\r\n\r\n\t\t}\r\n\r\n\t\treturn encoding;\r\n\r\n\t}\r\n\r\n\tthis.getParameters = function ( material, lights, fog, nClipPlanes, object ) {\r\n\r\n\t\tvar shaderID = shaderIDs[ material.type ];\r\n\r\n\t\t// heuristics to create shader parameters according to lights in the scene\r\n\t\t// (not to blow over maxLights budget)\r\n\r\n\t\tvar maxBones = allocateBones( object );\r\n\t\tvar precision = renderer.getPrecision();\r\n\r\n\t\tif ( material.precision !== null ) {\r\n\r\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\r\n\r\n\t\t\tif ( precision !== material.precision ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar parameters = {\r\n\r\n\t\t\tshaderID: shaderID,\r\n\r\n\t\t\tprecision: precision,\r\n\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\r\n\t\t\toutputEncoding: getTextureEncodingFromMap( renderer.getCurrentRenderTarget(), renderer.gammaOutput ),\r\n\t\t\tmap: !! material.map,\r\n\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\r\n\t\t\tenvMap: !! material.envMap,\r\n\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\r\n\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\r\n\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === THREE.CubeUVReflectionMapping ) || ( material.envMap.mapping === THREE.CubeUVRefractionMapping ) ),\r\n\t\t\tlightMap: !! material.lightMap,\r\n\t\t\taoMap: !! material.aoMap,\r\n\t\t\temissiveMap: !! material.emissiveMap,\r\n\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\r\n\t\t\tbumpMap: !! material.bumpMap,\r\n\t\t\tnormalMap: !! material.normalMap,\r\n\t\t\tdisplacementMap: !! material.displacementMap,\r\n\t\t\troughnessMap: !! material.roughnessMap,\r\n\t\t\tmetalnessMap: !! material.metalnessMap,\r\n\t\t\tspecularMap: !! material.specularMap,\r\n\t\t\talphaMap: !! material.alphaMap,\r\n\r\n\t\t\tcombine: material.combine,\r\n\r\n\t\t\tvertexColors: material.vertexColors,\r\n\r\n\t\t\tfog: fog,\r\n\t\t\tuseFog: material.fog,\r\n\t\t\tfogExp: fog instanceof THREE.FogExp2,\r\n\r\n\t\t\tflatShading: material.shading === THREE.FlatShading,\r\n\r\n\t\t\tsizeAttenuation: material.sizeAttenuation,\r\n\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\r\n\r\n\t\t\tskinning: material.skinning,\r\n\t\t\tmaxBones: maxBones,\r\n\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\r\n\r\n\t\t\tmorphTargets: material.morphTargets,\r\n\t\t\tmorphNormals: material.morphNormals,\r\n\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\r\n\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\r\n\r\n\t\t\tnumDirLights: lights.directional.length,\r\n\t\t\tnumPointLights: lights.point.length,\r\n\t\t\tnumSpotLights: lights.spot.length,\r\n\t\t\tnumHemiLights: lights.hemi.length,\r\n\r\n\t\t\tnumClippingPlanes: nClipPlanes,\r\n\r\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\r\n\t\t\tshadowMapType: renderer.shadowMap.type,\r\n\r\n\t\t\ttoneMapping: renderer.toneMapping,\r\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\r\n\r\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\r\n\r\n\t\t\talphaTest: material.alphaTest,\r\n\t\t\tdoubleSided: material.side === THREE.DoubleSide,\r\n\t\t\tflipSided: material.side === THREE.BackSide,\r\n\r\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\r\n\r\n\t\t};\r\n\r\n\t\treturn parameters;\r\n\r\n\t};\r\n\r\n\tthis.getProgramCode = function ( material, parameters ) {\r\n\r\n\t\tvar array = [];\r\n\r\n\t\tif ( parameters.shaderID ) {\r\n\r\n\t\t\tarray.push( parameters.shaderID );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tarray.push( material.fragmentShader );\r\n\t\t\tarray.push( material.vertexShader );\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.defines !== undefined ) {\r\n\r\n\t\t\tfor ( var name in material.defines ) {\r\n\r\n\t\t\t\tarray.push( name );\r\n\t\t\t\tarray.push( material.defines[ name ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\r\n\r\n\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\r\n\r\n\t\t}\r\n\r\n\t\treturn array.join();\r\n\r\n\t};\r\n\r\n\tthis.acquireProgram = function ( material, parameters, code ) {\r\n\r\n\t\tvar program;\r\n\r\n\t\t// Check if code has been already compiled\r\n\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\r\n\r\n\t\t\tvar programInfo = programs[ p ];\r\n\r\n\t\t\tif ( programInfo.code === code ) {\r\n\r\n\t\t\t\tprogram = programInfo;\r\n\t\t\t\t++ program.usedTimes;\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( program === undefined ) {\r\n\r\n\t\t\tprogram = new THREE.WebGLProgram( renderer, code, material, parameters );\r\n\t\t\tprograms.push( program );\r\n\r\n\t\t}\r\n\r\n\t\treturn program;\r\n\r\n\t};\r\n\r\n\tthis.releaseProgram = function( program ) {\r\n\r\n\t\tif ( -- program.usedTimes === 0 ) {\r\n\r\n\t\t\t// Remove from unordered set\r\n\t\t\tvar i = programs.indexOf( program );\r\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\r\n\t\t\tprograms.pop();\r\n\r\n\t\t\t// Free WebGL resources\r\n\t\t\tprogram.destroy();\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Exposed for resource monitoring & error feedback via renderer.info:\r\n\tthis.programs = programs;\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLProperties.js\r\n\r\n/**\r\n* @author fordacious / fordacious.github.io\r\n*/\r\n\r\nTHREE.WebGLProperties = function () {\r\n\r\n\tvar properties = {};\r\n\r\n\tthis.get = function ( object ) {\r\n\r\n\t\tvar uuid = object.uuid;\r\n\t\tvar map = properties[ uuid ];\r\n\r\n\t\tif ( map === undefined ) {\r\n\r\n\t\t\tmap = {};\r\n\t\t\tproperties[ uuid ] = map;\r\n\r\n\t\t}\r\n\r\n\t\treturn map;\r\n\r\n\t};\r\n\r\n\tthis.delete = function ( object ) {\r\n\r\n\t\tdelete properties[ object.uuid ];\r\n\r\n\t};\r\n\r\n\tthis.clear = function () {\r\n\r\n\t\tproperties = {};\r\n\r\n\t};\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLShader.js\r\n\r\nTHREE.WebGLShader = ( function () {\r\n\r\n\tfunction addLineNumbers( string ) {\r\n\r\n\t\tvar lines = string.split( '\\n' );\r\n\r\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\r\n\r\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn lines.join( '\\n' );\r\n\r\n\t}\r\n\r\n\treturn function WebGLShader( gl, type, string ) {\r\n\r\n\t\tvar shader = gl.createShader( type );\r\n\r\n\t\tgl.shaderSource( shader, string );\r\n\t\tgl.compileShader( shader );\r\n\r\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\r\n\r\n\t\t}\r\n\r\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\r\n\r\n\t\t}\r\n\r\n\t\t// --enable-privileged-webgl-extension\r\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\r\n\r\n\t\treturn shader;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n// File:src/renderers/webgl/WebGLShadowMap.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {\r\n\r\n\tvar _gl = _renderer.context,\r\n\t_state = _renderer.state,\r\n\t_frustum = new THREE.Frustum(),\r\n\t_projScreenMatrix = new THREE.Matrix4(),\r\n\r\n\t_lightShadows = _lights.shadows,\r\n\r\n\t_shadowMapSize = new THREE.Vector2(),\r\n\r\n\t_lookTarget = new THREE.Vector3(),\r\n\t_lightPositionWorld = new THREE.Vector3(),\r\n\r\n\t_renderList = [],\r\n\r\n\t_MorphingFlag = 1,\r\n\t_SkinningFlag = 2,\r\n\r\n\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\r\n\r\n\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\r\n\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\r\n\r\n\t_materialCache = {};\r\n\r\n\tvar cubeDirections = [\r\n\t\tnew THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( - 1, 0, 0 ), new THREE.Vector3( 0, 0, 1 ),\r\n\t\tnew THREE.Vector3( 0, 0, - 1 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, - 1, 0 )\r\n\t];\r\n\r\n\tvar cubeUps = [\r\n\t\tnew THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ),\r\n\t\tnew THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ),\tnew THREE.Vector3( 0, 0, - 1 )\r\n\t];\r\n\r\n\tvar cube2DViewPorts = [\r\n\t\tnew THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4(),\r\n\t\tnew THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4()\r\n\t];\r\n\r\n\t// init\r\n\r\n\tvar depthMaterialTemplate = new THREE.MeshDepthMaterial();\r\n\tdepthMaterialTemplate.depthPacking = THREE.RGBADepthPacking;\r\n\tdepthMaterialTemplate.clipping = true;\r\n\r\n\tvar distanceShader = THREE.ShaderLib[ \"distanceRGBA\" ];\r\n\tvar distanceUniforms = THREE.UniformsUtils.clone( distanceShader.uniforms );\r\n\r\n\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\r\n\r\n\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\r\n\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\r\n\r\n\t\tvar depthMaterial = depthMaterialTemplate.clone();\r\n\t\tdepthMaterial.morphTargets = useMorphing;\r\n\t\tdepthMaterial.skinning = useSkinning;\r\n\r\n\t\t_depthMaterials[ i ] = depthMaterial;\r\n\r\n\t\tvar distanceMaterial = new THREE.ShaderMaterial( {\r\n\t\t\tdefines: {\r\n\t\t\t\t'USE_SHADOWMAP': ''\r\n\t\t\t},\r\n\t\t\tuniforms: distanceUniforms,\r\n\t\t\tvertexShader: distanceShader.vertexShader,\r\n\t\t\tfragmentShader: distanceShader.fragmentShader,\r\n\t\t\tmorphTargets: useMorphing,\r\n\t\t\tskinning: useSkinning,\r\n\t\t\tclipping: true\r\n\t\t} );\r\n\r\n\t\t_distanceMaterials[ i ] = distanceMaterial;\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tvar scope = this;\r\n\r\n\tthis.enabled = false;\r\n\r\n\tthis.autoUpdate = true;\r\n\tthis.needsUpdate = false;\r\n\r\n\tthis.type = THREE.PCFShadowMap;\r\n\tthis.cullFace = THREE.CullFaceFront;\r\n\r\n\tthis.render = function ( scene, camera ) {\r\n\r\n\t\tif ( scope.enabled === false ) return;\r\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\r\n\r\n\t\tif ( _lightShadows.length === 0 ) return;\r\n\r\n\t\t// Set GL state for depth map.\r\n\t\t_state.clearColor( 1, 1, 1, 1 );\r\n\t\t_state.disable( _gl.BLEND );\r\n\t\t_state.enable( _gl.CULL_FACE );\r\n\t\t_gl.frontFace( _gl.CCW );\r\n\t\t_gl.cullFace( scope.cullFace === THREE.CullFaceFront ? _gl.FRONT : _gl.BACK );\r\n\t\t_state.setDepthTest( true );\r\n\t\t_state.setScissorTest( false );\r\n\r\n\t\t// render depth map\r\n\r\n\t\tvar faceCount, isPointLight;\r\n\r\n\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar light = _lightShadows[ i ];\r\n\r\n\t\t\tvar shadow = light.shadow;\r\n\t\t\tvar shadowCamera = shadow.camera;\r\n\r\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\r\n\r\n\t\t\tif ( light instanceof THREE.PointLight ) {\r\n\r\n\t\t\t\tfaceCount = 6;\r\n\t\t\t\tisPointLight = true;\r\n\r\n\t\t\t\tvar vpWidth = _shadowMapSize.x;\r\n\t\t\t\tvar vpHeight = _shadowMapSize.y;\r\n\r\n\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\r\n\t\t\t\t// following orientation:\r\n\t\t\t\t//\r\n\t\t\t\t// xzXZ\r\n\t\t\t\t// y Y\r\n\t\t\t\t//\r\n\t\t\t\t// X - Positive x direction\r\n\t\t\t\t// x - Negative x direction\r\n\t\t\t\t// Y - Positive y direction\r\n\t\t\t\t// y - Negative y direction\r\n\t\t\t\t// Z - Positive z direction\r\n\t\t\t\t// z - Negative z direction\r\n\r\n\t\t\t\t// positive X\r\n\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\r\n\t\t\t\t// negative X\r\n\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\r\n\t\t\t\t// positive Z\r\n\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\r\n\t\t\t\t// negative Z\r\n\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\r\n\t\t\t\t// positive Y\r\n\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\r\n\t\t\t\t// negative Y\r\n\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\r\n\r\n\t\t\t\t_shadowMapSize.x *= 4.0;\r\n\t\t\t\t_shadowMapSize.y *= 2.0;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfaceCount = 1;\r\n\t\t\t\tisPointLight = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( shadow.map === null ) {\r\n\r\n\t\t\t\tvar pars = { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };\r\n\r\n\t\t\t\tshadow.map = new THREE.WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\r\n\r\n\t\t\t\tshadowCamera.updateProjectionMatrix();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( shadow instanceof THREE.SpotLightShadow ) {\r\n\r\n\t\t\t\tshadow.update( light );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar shadowMap = shadow.map;\r\n\t\t\tvar shadowMatrix = shadow.matrix;\r\n\r\n\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\r\n\t\t\tshadowCamera.position.copy( _lightPositionWorld );\r\n\r\n\t\t\t_renderer.setRenderTarget( shadowMap );\r\n\t\t\t_renderer.clear();\r\n\r\n\t\t\t// render shadow map for each cube face (if omni-directional) or\r\n\t\t\t// run a single pass if not\r\n\r\n\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\r\n\r\n\t\t\t\tif ( isPointLight ) {\r\n\r\n\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\r\n\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\r\n\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\r\n\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\r\n\r\n\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\r\n\t\t\t\t\t_state.viewport( vpDimensions );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\r\n\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tshadowCamera.updateMatrixWorld();\r\n\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\r\n\r\n\t\t\t\t// compute shadow matrix\r\n\r\n\t\t\t\tshadowMatrix.set(\r\n\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\r\n\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\r\n\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\r\n\t\t\t\t\t0.0, 0.0, 0.0, 1.0\r\n\t\t\t\t);\r\n\r\n\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\r\n\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\r\n\r\n\t\t\t\t// update camera matrices and frustum\r\n\r\n\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\r\n\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\r\n\r\n\t\t\t\t// set object matrices & frustum culling\r\n\r\n\t\t\t\t_renderList.length = 0;\r\n\r\n\t\t\t\tprojectObject( scene, camera, shadowCamera );\r\n\r\n\t\t\t\t// render shadow map\r\n\t\t\t\t// render regular objects\r\n\r\n\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tvar object = _renderList[ j ];\r\n\t\t\t\t\tvar geometry = _objects.update( object );\r\n\t\t\t\t\tvar material = object.material;\r\n\r\n\t\t\t\t\tif ( material instanceof THREE.MultiMaterial ) {\r\n\r\n\t\t\t\t\t\tvar groups = geometry.groups;\r\n\t\t\t\t\t\tvar materials = material.materials;\r\n\r\n\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\r\n\r\n\t\t\t\t\t\t\tvar group = groups[ k ];\r\n\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\r\n\r\n\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\r\n\r\n\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\r\n\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\r\n\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Restore GL state.\r\n\t\tvar clearColor = _renderer.getClearColor(),\r\n\t\tclearAlpha = _renderer.getClearAlpha();\r\n\t\t_renderer.setClearColor( clearColor, clearAlpha );\r\n\r\n\t\t_state.enable( _gl.BLEND );\r\n\r\n\t\tif ( scope.cullFace === THREE.CullFaceFront ) {\r\n\r\n\t\t\t_gl.cullFace( _gl.BACK );\r\n\r\n\t\t}\r\n\r\n\t\tscope.needsUpdate = false;\r\n\r\n\t};\r\n\r\n\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\r\n\r\n\t\tvar geometry = object.geometry;\r\n\r\n\t\tvar result = null;\r\n\r\n\t\tvar materialVariants = _depthMaterials;\r\n\t\tvar customMaterial = object.customDepthMaterial;\r\n\r\n\t\tif ( isPointLight ) {\r\n\r\n\t\t\tmaterialVariants = _distanceMaterials;\r\n\t\t\tcustomMaterial = object.customDistanceMaterial;\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! customMaterial ) {\r\n\r\n\t\t\tvar useMorphing = geometry.morphTargets !== undefined &&\r\n\t\t\t\t\tgeometry.morphTargets.length > 0 && material.morphTargets;\r\n\r\n\t\t\tvar useSkinning = object instanceof THREE.SkinnedMesh && material.skinning;\r\n\r\n\t\t\tvar variantIndex = 0;\r\n\r\n\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\r\n\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\r\n\r\n\t\t\tresult = materialVariants[ variantIndex ];\r\n\r\n\t\t} else {\r\n\r\n\t\t\tresult = customMaterial;\r\n\r\n\t\t}\r\n\r\n\t\tif ( _renderer.localClippingEnabled &&\r\n\t\t\t material.clipShadows === true &&\r\n\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\r\n\r\n\t\t\t// in this case we need a unique material instance reflecting the\r\n\t\t\t// appropriate state\r\n\r\n\t\t\tvar keyA = result.uuid, keyB = material.uuid;\r\n\r\n\t\t\tvar materialsForVariant = _materialCache[ keyA ];\r\n\r\n\t\t\tif ( materialsForVariant === undefined ) {\r\n\r\n\t\t\t\tmaterialsForVariant = {};\r\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\r\n\r\n\t\t\tif ( cachedMaterial === undefined ) {\r\n\r\n\t\t\t\tcachedMaterial = result.clone();\r\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tresult = cachedMaterial;\r\n\r\n\t\t}\r\n\r\n\t\tresult.visible = material.visible;\r\n\t\tresult.wireframe = material.wireframe;\r\n\t\tresult.side = material.side;\r\n\t\tresult.clipShadows = material.clipShadows;\r\n\t\tresult.clippingPlanes = material.clippingPlanes;\r\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\r\n\t\tresult.linewidth = material.linewidth;\r\n\r\n\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\r\n\r\n\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tfunction projectObject( object, camera, shadowCamera ) {\r\n\r\n\t\tif ( object.visible === false ) return;\r\n\r\n\t\tif ( object.layers.test( camera.layers ) && ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) ) {\r\n\r\n\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\r\n\r\n\t\t\t\tvar material = object.material;\r\n\r\n\t\t\t\tif ( material.visible === true ) {\r\n\r\n\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\r\n\t\t\t\t\t_renderList.push( object );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar children = object.children;\r\n\r\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\tprojectObject( children[ i ], camera, shadowCamera );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLState.js\r\n\r\n/**\r\n* @author mrdoob / http://mrdoob.com/\r\n*/\r\n\r\nTHREE.WebGLState = function ( gl, extensions, paramThreeToGL ) {\r\n\r\n\tvar _this = this;\r\n\r\n\tvar color = new THREE.Vector4();\r\n\r\n\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\r\n\tvar newAttributes = new Uint8Array( maxVertexAttributes );\r\n\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\r\n\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\r\n\r\n\tvar capabilities = {};\r\n\r\n\tvar compressedTextureFormats = null;\r\n\r\n\tvar currentBlending = null;\r\n\tvar currentBlendEquation = null;\r\n\tvar currentBlendSrc = null;\r\n\tvar currentBlendDst = null;\r\n\tvar currentBlendEquationAlpha = null;\r\n\tvar currentBlendSrcAlpha = null;\r\n\tvar currentBlendDstAlpha = null;\r\n\tvar currentPremultipledAlpha = false;\r\n\r\n\tvar currentDepthFunc = null;\r\n\tvar currentDepthWrite = null;\r\n\r\n\tvar currentColorWrite = null;\r\n\r\n\tvar currentStencilWrite = null;\r\n\tvar currentStencilFunc = null;\r\n\tvar currentStencilRef = null;\r\n\tvar currentStencilMask = null;\r\n\tvar currentStencilFail = null;\r\n\tvar currentStencilZFail = null;\r\n\tvar currentStencilZPass = null;\r\n\r\n\tvar currentFlipSided = null;\r\n\r\n\tvar currentLineWidth = null;\r\n\r\n\tvar currentPolygonOffsetFactor = null;\r\n\tvar currentPolygonOffsetUnits = null;\r\n\r\n\tvar currentScissorTest = null;\r\n\r\n\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\r\n\r\n\tvar currentTextureSlot = undefined;\r\n\tvar currentBoundTextures = {};\r\n\r\n\tvar currentClearColor = new THREE.Vector4();\r\n\tvar currentClearDepth = null;\r\n\tvar currentClearStencil = null;\r\n\r\n\tvar currentScissor = new THREE.Vector4();\r\n\tvar currentViewport = new THREE.Vector4();\r\n\r\n\tthis.init = function () {\r\n\r\n\t\tthis.clearColor( 0, 0, 0, 1 );\r\n\t\tthis.clearDepth( 1 );\r\n\t\tthis.clearStencil( 0 );\r\n\r\n\t\tthis.enable( gl.DEPTH_TEST );\r\n\t\tgl.depthFunc( gl.LEQUAL );\r\n\r\n\t\tgl.frontFace( gl.CCW );\r\n\t\tgl.cullFace( gl.BACK );\r\n\t\tthis.enable( gl.CULL_FACE );\r\n\r\n\t\tthis.enable( gl.BLEND );\r\n\t\tgl.blendEquation( gl.FUNC_ADD );\r\n\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );\r\n\r\n\t};\r\n\r\n\tthis.initAttributes = function () {\r\n\r\n\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\r\n\r\n\t\t\tnewAttributes[ i ] = 0;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.enableAttribute = function ( attribute ) {\r\n\r\n\t\tnewAttributes[ attribute ] = 1;\r\n\r\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\r\n\r\n\t\t\tgl.enableVertexAttribArray( attribute );\r\n\t\t\tenabledAttributes[ attribute ] = 1;\r\n\r\n\t\t}\r\n\r\n\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\r\n\r\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\r\n\r\n\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\r\n\t\t\tattributeDivisors[ attribute ] = 0;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.enableAttributeAndDivisor = function ( attribute, meshPerAttribute, extension ) {\r\n\r\n\t\tnewAttributes[ attribute ] = 1;\r\n\r\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\r\n\r\n\t\t\tgl.enableVertexAttribArray( attribute );\r\n\t\t\tenabledAttributes[ attribute ] = 1;\r\n\r\n\t\t}\r\n\r\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\r\n\r\n\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\r\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.disableUnusedAttributes = function () {\r\n\r\n\t\tfor ( var i = 0, l = enabledAttributes.length; i < l; i ++ ) {\r\n\r\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\r\n\r\n\t\t\t\tgl.disableVertexAttribArray( i );\r\n\t\t\t\tenabledAttributes[ i ] = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.enable = function ( id ) {\r\n\r\n\t\tif ( capabilities[ id ] !== true ) {\r\n\r\n\t\t\tgl.enable( id );\r\n\t\t\tcapabilities[ id ] = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.disable = function ( id ) {\r\n\r\n\t\tif ( capabilities[ id ] !== false ) {\r\n\r\n\t\t\tgl.disable( id );\r\n\t\t\tcapabilities[ id ] = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.getCompressedTextureFormats = function () {\r\n\r\n\t\tif ( compressedTextureFormats === null ) {\r\n\r\n\t\t\tcompressedTextureFormats = [];\r\n\r\n\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\r\n\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\r\n\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\r\n\r\n\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\r\n\r\n\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\r\n\r\n\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn compressedTextureFormats;\r\n\r\n\t};\r\n\r\n\tthis.setBlending = function ( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\r\n\r\n\t\tif ( blending === THREE.NoBlending ) {\r\n\r\n\t\t\tthis.disable( gl.BLEND );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.enable( gl.BLEND );\r\n\r\n\t\t}\r\n\r\n\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\r\n\r\n\t\t\tif ( blending === THREE.AdditiveBlending ) {\r\n\r\n\t\t\t\tif ( premultipliedAlpha ) {\r\n\r\n\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( blending === THREE.SubtractiveBlending ) {\r\n\r\n\t\t\t\tif ( premultipliedAlpha ) {\r\n\r\n\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( blending === THREE.MultiplyBlending ) {\r\n\r\n\t\t\t\tif ( premultipliedAlpha ) {\r\n\r\n\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.SRC_COLOR, gl.SRC_ALPHA );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( premultipliedAlpha ) {\r\n\r\n\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\r\n\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcurrentBlending = blending;\r\n\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\r\n\r\n\t\t}\r\n\r\n\t\tif ( blending === THREE.CustomBlending ) {\r\n\r\n\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\r\n\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\r\n\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\r\n\r\n\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\r\n\r\n\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\r\n\r\n\t\t\t\tcurrentBlendEquation = blendEquation;\r\n\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\r\n\r\n\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\r\n\r\n\t\t\t\tcurrentBlendSrc = blendSrc;\r\n\t\t\t\tcurrentBlendDst = blendDst;\r\n\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\r\n\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tcurrentBlendEquation = null;\r\n\t\t\tcurrentBlendSrc = null;\r\n\t\t\tcurrentBlendDst = null;\r\n\t\t\tcurrentBlendEquationAlpha = null;\r\n\t\t\tcurrentBlendSrcAlpha = null;\r\n\t\t\tcurrentBlendDstAlpha = null;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setDepthFunc = function ( depthFunc ) {\r\n\r\n\t\tif ( currentDepthFunc !== depthFunc ) {\r\n\r\n\t\t\tif ( depthFunc ) {\r\n\r\n\t\t\t\tswitch ( depthFunc ) {\r\n\r\n\t\t\t\t\tcase THREE.NeverDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.AlwaysDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.LessDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.LESS );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.LessEqualDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.EqualDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.GreaterEqualDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.GreaterDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase THREE.NotEqualDepth:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tdefault:\r\n\r\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tgl.depthFunc( gl.LEQUAL );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcurrentDepthFunc = depthFunc;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setDepthTest = function ( depthTest ) {\r\n\r\n\t\tif ( depthTest ) {\r\n\r\n\t\t\tthis.enable( gl.DEPTH_TEST );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.disable( gl.DEPTH_TEST );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setDepthWrite = function ( depthWrite ) {\r\n\r\n\t\t// TODO: Rename to setDepthMask\r\n\r\n\t\tif ( currentDepthWrite !== depthWrite ) {\r\n\r\n\t\t\tgl.depthMask( depthWrite );\r\n\t\t\tcurrentDepthWrite = depthWrite;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setColorWrite = function ( colorWrite ) {\r\n\r\n\t\t// TODO: Rename to setColorMask\r\n\r\n\t\tif ( currentColorWrite !== colorWrite ) {\r\n\r\n\t\t\tgl.colorMask( colorWrite, colorWrite, colorWrite, colorWrite );\r\n\t\t\tcurrentColorWrite = colorWrite;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setStencilFunc = function ( stencilFunc, stencilRef, stencilMask ) {\r\n\r\n\t\tif ( currentStencilFunc !== stencilFunc ||\r\n\t\t\t\t currentStencilRef \t!== stencilRef \t||\r\n\t\t\t\t currentStencilMask !== stencilMask ) {\r\n\r\n\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\r\n\r\n\t\t\tcurrentStencilFunc = stencilFunc;\r\n\t\t\tcurrentStencilRef = stencilRef;\r\n\t\t\tcurrentStencilMask = stencilMask;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setStencilOp = function ( stencilFail, stencilZFail, stencilZPass ) {\r\n\r\n\t\tif ( currentStencilFail\t !== stencilFail \t||\r\n\t\t\t\t currentStencilZFail !== stencilZFail ||\r\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\r\n\r\n\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\r\n\r\n\t\t\tcurrentStencilFail = stencilFail;\r\n\t\t\tcurrentStencilZFail = stencilZFail;\r\n\t\t\tcurrentStencilZPass = stencilZPass;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setStencilTest = function ( stencilTest ) {\r\n\r\n\t\tif ( stencilTest ) {\r\n\r\n\t\t\tthis.enable( gl.STENCIL_TEST );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.disable( gl.STENCIL_TEST );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setStencilWrite = function ( stencilWrite ) {\r\n\r\n\t\t// TODO: Rename to setStencilMask\r\n\r\n\t\tif ( currentStencilWrite !== stencilWrite ) {\r\n\r\n\t\t\tgl.stencilMask( stencilWrite );\r\n\t\t\tcurrentStencilWrite = stencilWrite;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setFlipSided = function ( flipSided ) {\r\n\r\n\t\tif ( currentFlipSided !== flipSided ) {\r\n\r\n\t\t\tif ( flipSided ) {\r\n\r\n\t\t\t\tgl.frontFace( gl.CW );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tgl.frontFace( gl.CCW );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcurrentFlipSided = flipSided;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setLineWidth = function ( width ) {\r\n\r\n\t\tif ( width !== currentLineWidth ) {\r\n\r\n\t\t\tgl.lineWidth( width );\r\n\r\n\t\t\tcurrentLineWidth = width;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setPolygonOffset = function ( polygonOffset, factor, units ) {\r\n\r\n\t\tif ( polygonOffset ) {\r\n\r\n\t\t\tthis.enable( gl.POLYGON_OFFSET_FILL );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.disable( gl.POLYGON_OFFSET_FILL );\r\n\r\n\t\t}\r\n\r\n\t\tif ( polygonOffset && ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) ) {\r\n\r\n\t\t\tgl.polygonOffset( factor, units );\r\n\r\n\t\t\tcurrentPolygonOffsetFactor = factor;\r\n\t\t\tcurrentPolygonOffsetUnits = units;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.getScissorTest = function () {\r\n\r\n\t\treturn currentScissorTest;\r\n\r\n\t};\r\n\r\n\tthis.setScissorTest = function ( scissorTest ) {\r\n\r\n\t\tcurrentScissorTest = scissorTest;\r\n\r\n\t\tif ( scissorTest ) {\r\n\r\n\t\t\tthis.enable( gl.SCISSOR_TEST );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.disable( gl.SCISSOR_TEST );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// texture\r\n\r\n\tthis.activeTexture = function ( webglSlot ) {\r\n\r\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\r\n\r\n\t\tif ( currentTextureSlot !== webglSlot ) {\r\n\r\n\t\t\tgl.activeTexture( webglSlot );\r\n\t\t\tcurrentTextureSlot = webglSlot;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.bindTexture = function ( webglType, webglTexture ) {\r\n\r\n\t\tif ( currentTextureSlot === undefined ) {\r\n\r\n\t\t\t_this.activeTexture();\r\n\r\n\t\t}\r\n\r\n\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\r\n\r\n\t\tif ( boundTexture === undefined ) {\r\n\r\n\t\t\tboundTexture = { type: undefined, texture: undefined };\r\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\r\n\r\n\t\t}\r\n\r\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\r\n\r\n\t\t\tgl.bindTexture( webglType, webglTexture );\r\n\r\n\t\t\tboundTexture.type = webglType;\r\n\t\t\tboundTexture.texture = webglTexture;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.compressedTexImage2D = function () {\r\n\r\n\t\ttry {\r\n\r\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\r\n\r\n\t\t} catch ( error ) {\r\n\r\n\t\t\tconsole.error( error );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.texImage2D = function () {\r\n\r\n\t\ttry {\r\n\r\n\t\t\tgl.texImage2D.apply( gl, arguments );\r\n\r\n\t\t} catch ( error ) {\r\n\r\n\t\t\tconsole.error( error );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// clear values\r\n\r\n\tthis.clearColor = function ( r, g, b, a ) {\r\n\r\n\t\tcolor.set( r, g, b, a );\r\n\r\n\t\tif ( currentClearColor.equals( color ) === false ) {\r\n\r\n\t\t\tgl.clearColor( r, g, b, a );\r\n\t\t\tcurrentClearColor.copy( color );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.clearDepth = function ( depth ) {\r\n\r\n\t\tif ( currentClearDepth !== depth ) {\r\n\r\n\t\t\tgl.clearDepth( depth );\r\n\t\t\tcurrentClearDepth = depth;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.clearStencil = function ( stencil ) {\r\n\r\n\t\tif ( currentClearStencil !== stencil ) {\r\n\r\n\t\t\tgl.clearStencil( stencil );\r\n\t\t\tcurrentClearStencil = stencil;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t//\r\n\r\n\tthis.scissor = function ( scissor ) {\r\n\r\n\t\tif ( currentScissor.equals( scissor ) === false ) {\r\n\r\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\r\n\t\t\tcurrentScissor.copy( scissor );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.viewport = function ( viewport ) {\r\n\r\n\t\tif ( currentViewport.equals( viewport ) === false ) {\r\n\r\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\r\n\t\t\tcurrentViewport.copy( viewport );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t//\r\n\r\n\tthis.reset = function () {\r\n\r\n\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\r\n\r\n\t\t\tif ( enabledAttributes[ i ] === 1 ) {\r\n\r\n\t\t\t\tgl.disableVertexAttribArray( i );\r\n\t\t\t\tenabledAttributes[ i ] = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcapabilities = {};\r\n\r\n\t\tcompressedTextureFormats = null;\r\n\r\n\t\tcurrentTextureSlot = undefined;\r\n\t\tcurrentBoundTextures = {};\r\n\r\n\t\tcurrentBlending = null;\r\n\r\n\t\tcurrentColorWrite = null;\r\n\t\tcurrentDepthWrite = null;\r\n\t\tcurrentStencilWrite = null;\r\n\r\n\t\tcurrentFlipSided = null;\r\n\r\n\t};\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/WebGLUniforms.js\r\n\r\n/**\r\n *\r\n * Uniforms of a program.\r\n * Those form a tree structure with a special top-level container for the root,\r\n * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\r\n *\r\n *\r\n * Properties of inner nodes including the top-level container:\r\n *\r\n * .seq - array of nested uniforms\r\n * .map - nested uniforms by name\r\n *\r\n *\r\n * Methods of all nodes except the top-level container:\r\n *\r\n * .setValue( gl, value, [renderer] )\r\n *\r\n * \t\tuploads a uniform value(s)\r\n * \tthe 'renderer' parameter is needed for sampler uniforms\r\n *\r\n *\r\n * Static methods of the top-level container (renderer factorizations):\r\n *\r\n * .upload( gl, seq, values, renderer )\r\n *\r\n * \t\tsets uniforms in 'seq' to 'values[id].value'\r\n *\r\n * .seqWithValue( seq, values ) : filteredSeq\r\n *\r\n * \t\tfilters 'seq' entries with corresponding entry in values\r\n *\r\n * .splitDynamic( seq, values ) : filteredSeq\r\n *\r\n * \t\tfilters 'seq' entries with dynamic entry and removes them from 'seq'\r\n *\r\n *\r\n * Methods of the top-level container (renderer factorizations):\r\n *\r\n * .setValue( gl, name, value )\r\n *\r\n * \t\tsets uniform with name 'name' to 'value'\r\n *\r\n * .set( gl, obj, prop )\r\n *\r\n * \t\tsets uniform from object and property with same name than uniform\r\n *\r\n * .setOptional( gl, obj, prop )\r\n *\r\n * \t\tlike .set for an optional property of the object\r\n *\r\n *\r\n * @author tschw\r\n *\r\n */\r\n\r\nTHREE.WebGLUniforms = ( function() { // scope\r\n\r\n\t// --- Base for inner nodes (including the root) ---\r\n\r\n\tvar UniformContainer = function() {\r\n\r\n\t\t\tthis.seq = [];\r\n\t\t\tthis.map = {};\r\n\r\n\t\t},\r\n\r\n\t// --- Utilities ---\r\n\r\n\t// Array Caches (provide typed arrays for temporary by size)\r\n\r\n\t\tarrayCacheF32 = [],\r\n\t\tarrayCacheI32 = [],\r\n\r\n\t\tuncacheTemporaryArrays = function() {\r\n\r\n\t\t\tarrayCacheF32.length = 0;\r\n\t\t\tarrayCacheI32.length = 0;\r\n\r\n\t\t},\r\n\r\n\t// Flattening for arrays of vectors and matrices\r\n\r\n\t\tflatten = function( array, nBlocks, blockSize ) {\r\n\r\n\t\t\tvar firstElem = array[ 0 ];\r\n\r\n\t\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\r\n\t\t\t// unoptimized: ! isNaN( firstElem )\r\n\t\t\t// see http://jacksondunstan.com/articles/983\r\n\r\n\t\t\tvar n = nBlocks * blockSize,\r\n\t\t\t\tr = arrayCacheF32[ n ];\r\n\r\n\t\t\tif ( r === undefined ) {\r\n\r\n\t\t\t\tr = new Float32Array( n );\r\n\t\t\t\tarrayCacheF32[ n ] = r;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( nBlocks !== 0 ) {\r\n\r\n\t\t\t\tfirstElem.toArray( r, 0 );\r\n\r\n\t\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\r\n\r\n\t\t\t\t\toffset += blockSize;\r\n\t\t\t\t\tarray[ i ].toArray( r, offset );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn r;\r\n\r\n\t\t},\r\n\r\n\t// Texture unit allocation\r\n\r\n\t\tallocTexUnits = function( renderer, n ) {\r\n\r\n\t\t\tvar r = arrayCacheI32[ n ];\r\n\r\n\t\t\tif ( r === undefined ) {\r\n\r\n\t\t\t\tr = new Int32Array( n );\r\n\t\t\t\tarrayCacheI32[ n ] = r;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0; i !== n; ++ i )\r\n\t\t\t\tr[ i ] = renderer.allocTextureUnit();\r\n\r\n\t\t\treturn r;\r\n\r\n\t\t},\r\n\r\n\t// --- Setters ---\r\n\r\n\t// Note: Defining these methods externally, because they come in a bunch\r\n\t// and this way their names minify.\r\n\r\n\t\t// Single scalar\r\n\r\n\t\tsetValue1f = function( gl, v ) { gl.uniform1f( this.addr, v ); },\r\n\t\tsetValue1i = function( gl, v ) { gl.uniform1i( this.addr, v ); },\r\n\r\n\t\t// Single float vector (from flat array or THREE.VectorN)\r\n\r\n\t\tsetValue2fv = function( gl, v ) {\r\n\r\n\t\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\r\n\t\t\telse gl.uniform2f( this.addr, v.x, v.y );\r\n\r\n\t\t},\r\n\r\n\t\tsetValue3fv = function( gl, v ) {\r\n\r\n\t\t\tif ( v.x !== undefined )\r\n\t\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\r\n\t\t\telse if ( v.r !== undefined )\r\n\t\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\r\n\t\t\telse\r\n\t\t\t\tgl.uniform3fv( this.addr, v );\r\n\r\n\t\t},\r\n\r\n\t\tsetValue4fv = function( gl, v ) {\r\n\r\n\t\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\r\n\t\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\r\n\r\n\t\t},\r\n\r\n\t\t// Single matrix (from flat array or MatrixN)\r\n\r\n\t\tsetValue2fm = function( gl, v ) {\r\n\r\n\t\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\r\n\r\n\t\t},\r\n\r\n\t\tsetValue3fm = function( gl, v ) {\r\n\r\n\t\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\r\n\r\n\t\t},\r\n\r\n\t\tsetValue4fm = function( gl, v ) {\r\n\r\n\t\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\r\n\r\n\t\t},\r\n\r\n\t\t// Single texture (2D / Cube)\r\n\r\n\t\tsetValueT1 = function( gl, v, renderer ) {\r\n\r\n\t\t\tvar unit = renderer.allocTextureUnit();\r\n\t\t\tgl.uniform1i( this.addr, unit );\r\n\t\t\tif ( v ) renderer.setTexture2D( v, unit );\r\n\r\n\t\t},\r\n\r\n\t\tsetValueT6 = function( gl, v, renderer ) {\r\n\r\n\t\t\tvar unit = renderer.allocTextureUnit();\r\n\t\t\tgl.uniform1i( this.addr, unit );\r\n\t\t\tif ( v ) renderer.setTextureCube( v, unit );\r\n\r\n\t\t},\r\n\r\n\t\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\r\n\r\n\t\tsetValue2iv = function( gl, v ) { gl.uniform2iv( this.addr, v ); },\r\n\t\tsetValue3iv = function( gl, v ) { gl.uniform3iv( this.addr, v ); },\r\n\t\tsetValue4iv = function( gl, v ) { gl.uniform4iv( this.addr, v ); },\r\n\r\n\t\t// Helper to pick the right setter for the singular case\r\n\r\n\t\tgetSingularSetter = function( type ) {\r\n\r\n\t\t\tswitch ( type ) {\r\n\r\n\t\t\t\tcase 0x1406: return setValue1f; // FLOAT\r\n\t\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\r\n\t\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\r\n\t\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\r\n\r\n\t\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\r\n\t\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\r\n\t\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\r\n\r\n\t\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\r\n\t\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\r\n\r\n\t\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\r\n\t\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\r\n\t\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\r\n\t\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\t// Array of scalars\r\n\r\n\t\tsetValue1fv = function( gl, v ) { gl.uniform1fv( this.addr, v ); },\r\n\t\tsetValue1iv = function( gl, v ) { gl.uniform1iv( this.addr, v ); },\r\n\r\n\t\t// Array of vectors (flat or from THREE classes)\r\n\r\n\t\tsetValueV2a = function( gl, v ) {\r\n\r\n\t\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\r\n\r\n\t\t},\r\n\r\n\t\tsetValueV3a = function( gl, v ) {\r\n\r\n\t\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\r\n\r\n\t\t},\r\n\r\n\t\tsetValueV4a = function( gl, v ) {\r\n\r\n\t\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\r\n\r\n\t\t},\r\n\r\n\t\t// Array of matrices (flat or from THREE clases)\r\n\r\n\t\tsetValueM2a = function( gl, v ) {\r\n\r\n\t\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\r\n\r\n\t\t},\r\n\r\n\t\tsetValueM3a = function( gl, v ) {\r\n\r\n\t\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\r\n\r\n\t\t},\r\n\r\n\t\tsetValueM4a = function( gl, v ) {\r\n\r\n\t\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\r\n\r\n\t\t},\r\n\r\n\t\t// Array of textures (2D / Cube)\r\n\r\n\t\tsetValueT1a = function( gl, v, renderer ) {\r\n\r\n\t\t\tvar n = v.length,\r\n\t\t\t\tunits = allocTexUnits( renderer, n );\r\n\r\n\t\t\tgl.uniform1iv( this.addr, units );\r\n\r\n\t\t\tfor ( var i = 0; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar tex = v[ i ];\r\n\t\t\t\tif ( tex ) renderer.setTexture2D( tex, units[ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tsetValueT6a = function( gl, v, renderer ) {\r\n\r\n\t\t\tvar n = v.length,\r\n\t\t\t\tunits = allocTexUnits( renderer, n );\r\n\r\n\t\t\tgl.uniform1iv( this.addr, units );\r\n\r\n\t\t\tfor ( var i = 0; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar tex = v[ i ];\r\n\t\t\t\tif ( tex ) renderer.setTextureCube( tex, units[ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\r\n\t\t// Helper to pick the right setter for a pure (bottom-level) array\r\n\r\n\t\tgetPureArraySetter = function( type ) {\r\n\r\n\t\t\tswitch ( type ) {\r\n\r\n\t\t\t\tcase 0x1406: return setValue1fv; // FLOAT\r\n\t\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\r\n\t\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\r\n\t\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\r\n\r\n\t\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\r\n\t\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\r\n\t\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\r\n\r\n\t\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\r\n\t\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\r\n\r\n\t\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\r\n\t\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\r\n\t\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\r\n\t\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t// --- Uniform Classes ---\r\n\r\n\t\tSingleUniform = function SingleUniform( id, activeInfo, addr ) {\r\n\r\n\t\t\tthis.id = id;\r\n\t\t\tthis.addr = addr;\r\n\t\t\tthis.setValue = getSingularSetter( activeInfo.type );\r\n\r\n\t\t\t// this.path = activeInfo.name; // DEBUG\r\n\r\n\t\t},\r\n\r\n\t\tPureArrayUniform = function( id, activeInfo, addr ) {\r\n\r\n\t\t\tthis.id = id;\r\n\t\t\tthis.addr = addr;\r\n\t\t\tthis.size = activeInfo.size;\r\n\t\t\tthis.setValue = getPureArraySetter( activeInfo.type );\r\n\r\n\t\t\t// this.path = activeInfo.name; // DEBUG\r\n\r\n\t\t},\r\n\r\n\t\tStructuredUniform = function( id ) {\r\n\r\n\t\t\tthis.id = id;\r\n\r\n\t\t\tUniformContainer.call( this ); // mix-in\r\n\r\n\t\t};\r\n\r\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\r\n\r\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\r\n\t\t// are not allowed in structured uniforms.\r\n\r\n\t\tvar seq = this.seq;\r\n\r\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar u = seq[ i ];\r\n\t\t\tu.setValue( gl, value[ u.id ] );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// --- Top-level ---\r\n\r\n\t// Parser - builds up the property tree from the path strings\r\n\r\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g,\r\n\t\t// extracts\r\n\t\t// \t- the identifier (member name or array index)\r\n\t\t// - followed by an optional right bracket (found when array index)\r\n\t\t// - followed by an optional left bracket or dot (type of subscript)\r\n\t\t//\r\n\t\t// Note: These portions can be read in a non-overlapping fashion and\r\n\t\t// allow straightforward parsing of the hierarchy that WebGL encodes\r\n\t\t// in the uniform names.\r\n\r\n\t\taddUniform = function( container, uniformObject ) {\r\n\r\n\t\t\tcontainer.seq.push( uniformObject );\r\n\t\t\tcontainer.map[ uniformObject.id ] = uniformObject;\r\n\r\n\t\t},\r\n\r\n\t\tparseUniform = function( activeInfo, addr, container ) {\r\n\r\n\t\t\tvar path = activeInfo.name,\r\n\t\t\t\tpathLength = path.length;\r\n\r\n\t\t\t// reset RegExp object, because of the early exit of a previous run\r\n\t\t\tRePathPart.lastIndex = 0;\r\n\r\n\t\t\tfor (; ;) {\r\n\r\n\t\t\t\tvar match = RePathPart.exec( path ),\r\n\t\t\t\t\tmatchEnd = RePathPart.lastIndex,\r\n\r\n\t\t\t\t\tid = match[ 1 ],\r\n\t\t\t\t\tidIsIndex = match[ 2 ] === ']',\r\n\t\t\t\t\tsubscript = match[ 3 ];\r\n\r\n\t\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\r\n\r\n\t\t\t\tif ( subscript === undefined ||\r\n\t\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\r\n\t\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\r\n\r\n\t\t\t\t\taddUniform( container, subscript === undefined ?\r\n\t\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\r\n\t\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// step into inner node / create it in case it doesn't exist\r\n\r\n\t\t\t\t\tvar map = container.map,\r\n\t\t\t\t\t\tnext = map[ id ];\r\n\r\n\t\t\t\t\tif ( next === undefined ) {\r\n\r\n\t\t\t\t\t\tnext = new StructuredUniform( id );\r\n\t\t\t\t\t\taddUniform( container, next );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcontainer = next;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t// Root Container\r\n\r\n\t\tWebGLUniforms = function WebGLUniforms( gl, program, renderer ) {\r\n\r\n\t\t\tUniformContainer.call( this );\r\n\r\n\t\t\tthis.renderer = renderer;\r\n\r\n\t\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\r\n\r\n\t\t\tfor ( var i = 0; i !== n; ++ i ) {\r\n\r\n\t\t\t\tvar info = gl.getActiveUniform( program, i ),\r\n\t\t\t\t\tpath = info.name,\r\n\t\t\t\t\taddr = gl.getUniformLocation( program, path );\r\n\r\n\t\t\t\tparseUniform( info, addr, this );\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\r\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\r\n\r\n\t\tvar u = this.map[ name ];\r\n\r\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\r\n\r\n\t};\r\n\r\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\r\n\r\n\t\tvar u = this.map[ name ];\r\n\r\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\r\n\r\n\t};\r\n\r\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\r\n\r\n\t\tvar v = object[ name ];\r\n\r\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\r\n\r\n\t};\r\n\r\n\r\n\t// Static interface\r\n\r\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\r\n\r\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar u = seq[ i ],\r\n\t\t\t\tv = values[ u.id ];\r\n\r\n\t\t\tif ( v.needsUpdate !== false ) {\r\n\t\t\t\t// note: always updating when .needsUpdate is undefined\r\n\r\n\t\t\t\tu.setValue( gl, v.value, renderer );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\r\n\r\n\t\tvar r = [];\r\n\r\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar u = seq[ i ];\r\n\t\t\tif ( u.id in values ) r.push( u );\r\n\r\n\t\t}\r\n\r\n\t\treturn r;\r\n\r\n\t};\r\n\r\n\tWebGLUniforms.splitDynamic = function( seq, values ) {\r\n\r\n\t\tvar r = null,\r\n\t\t\tn = seq.length,\r\n\t\t\tw = 0;\r\n\r\n\t\tfor ( var i = 0; i !== n; ++ i ) {\r\n\r\n\t\t\tvar u = seq[ i ],\r\n\t\t\t\tv = values[ u.id ];\r\n\r\n\t\t\tif ( v && v.dynamic === true ) {\r\n\r\n\t\t\t\tif ( r === null ) r = [];\r\n\t\t\t\tr.push( u );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// in-place compact 'seq', removing the matches\r\n\t\t\t\tif ( w < i ) seq[ w ] = u;\r\n\t\t\t\t++ w;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( w < n ) seq.length = w;\r\n\r\n\t\treturn r;\r\n\r\n\t};\r\n\r\n\tWebGLUniforms.evalDynamic = function( seq, values, object, camera ) {\r\n\r\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\r\n\r\n\t\t\tvar v = values[ seq[ i ].id ],\r\n\t\t\t\tf = v.onUpdateCallback;\r\n\r\n\t\t\tif ( f !== undefined ) f.call( v, object, camera );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\treturn WebGLUniforms;\r\n\r\n} )();\r\n\r\n\r\n// File:src/renderers/webgl/plugins/LensFlarePlugin.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.LensFlarePlugin = function ( renderer, flares ) {\r\n\r\n\tvar gl = renderer.context;\r\n\tvar state = renderer.state;\r\n\r\n\tvar vertexBuffer, elementBuffer;\r\n\tvar shader, program, attributes, uniforms;\r\n\r\n\tvar tempTexture, occlusionTexture;\r\n\r\n\tfunction init() {\r\n\r\n\t\tvar vertices = new Float32Array( [\r\n\t\t\t- 1, - 1, 0, 0,\r\n\t\t\t 1, - 1, 1, 0,\r\n\t\t\t 1, 1, 1, 1,\r\n\t\t\t- 1, 1, 0, 1\r\n\t\t] );\r\n\r\n\t\tvar faces = new Uint16Array( [\r\n\t\t\t0, 1, 2,\r\n\t\t\t0, 2, 3\r\n\t\t] );\r\n\r\n\t\t// buffers\r\n\r\n\t\tvertexBuffer = gl.createBuffer();\r\n\t\telementBuffer = gl.createBuffer();\r\n\r\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\r\n\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\r\n\r\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\r\n\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\r\n\r\n\t\t// textures\r\n\r\n\t\ttempTexture = gl.createTexture();\r\n\t\tocclusionTexture = gl.createTexture();\r\n\r\n\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\r\n\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\r\n\r\n\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\r\n\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\r\n\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\r\n\r\n\t\tshader = {\r\n\r\n\t\t\tvertexShader: [\r\n\r\n\t\t\t\t\"uniform lowp int renderType;\",\r\n\r\n\t\t\t\t\"uniform vec3 screenPosition;\",\r\n\t\t\t\t\"uniform vec2 scale;\",\r\n\t\t\t\t\"uniform float rotation;\",\r\n\r\n\t\t\t\t\"uniform sampler2D occlusionMap;\",\r\n\r\n\t\t\t\t\"attribute vec2 position;\",\r\n\t\t\t\t\"attribute vec2 uv;\",\r\n\r\n\t\t\t\t\"varying vec2 vUV;\",\r\n\t\t\t\t\"varying float vVisibility;\",\r\n\r\n\t\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\t\"vUV = uv;\",\r\n\r\n\t\t\t\t\t\"vec2 pos = position;\",\r\n\r\n\t\t\t\t\t\"if ( renderType == 2 ) {\",\r\n\r\n\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\r\n\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\r\n\r\n\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\r\n\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\r\n\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\r\n\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\r\n\r\n\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\r\n\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\r\n\r\n\t\t\t\t\"}\"\r\n\r\n\t\t\t].join( \"\\n\" ),\r\n\r\n\t\t\tfragmentShader: [\r\n\r\n\t\t\t\t\"uniform lowp int renderType;\",\r\n\r\n\t\t\t\t\"uniform sampler2D map;\",\r\n\t\t\t\t\"uniform float opacity;\",\r\n\t\t\t\t\"uniform vec3 color;\",\r\n\r\n\t\t\t\t\"varying vec2 vUV;\",\r\n\t\t\t\t\"varying float vVisibility;\",\r\n\r\n\t\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\t// pink square\r\n\r\n\t\t\t\t\t\"if ( renderType == 0 ) {\",\r\n\r\n\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\r\n\r\n\t\t\t\t\t// restore\r\n\r\n\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\r\n\r\n\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\r\n\r\n\t\t\t\t\t// flare\r\n\r\n\t\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\r\n\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\r\n\t\t\t\t\t\t\"gl_FragColor = texture;\",\r\n\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"}\"\r\n\r\n\t\t\t].join( \"\\n\" )\r\n\r\n\t\t};\r\n\r\n\t\tprogram = createProgram( shader );\r\n\r\n\t\tattributes = {\r\n\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\r\n\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\r\n\t\t};\r\n\r\n\t\tuniforms = {\r\n\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\r\n\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\r\n\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\r\n\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\r\n\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\r\n\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\r\n\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\r\n\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\r\n\t\t};\r\n\r\n\t}\r\n\r\n\t/*\r\n\t * Render lens flares\r\n\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\r\n\t * reads these back and calculates occlusion.\r\n\t */\r\n\r\n\tthis.render = function ( scene, camera, viewport ) {\r\n\r\n\t\tif ( flares.length === 0 ) return;\r\n\r\n\t\tvar tempPosition = new THREE.Vector3();\r\n\r\n\t\tvar invAspect = viewport.w / viewport.z,\r\n\t\t\thalfViewportWidth = viewport.z * 0.5,\r\n\t\t\thalfViewportHeight = viewport.w * 0.5;\r\n\r\n\t\tvar size = 16 / viewport.w,\r\n\t\t\tscale = new THREE.Vector2( size * invAspect, size );\r\n\r\n\t\tvar screenPosition = new THREE.Vector3( 1, 1, 0 ),\r\n\t\t\tscreenPositionPixels = new THREE.Vector2( 1, 1 );\r\n\r\n\t\tvar validArea = new THREE.Box2();\r\n\r\n\t\tvalidArea.min.set( 0, 0 );\r\n\t\tvalidArea.max.set( viewport.z - 16, viewport.w - 16 );\r\n\r\n\t\tif ( program === undefined ) {\r\n\r\n\t\t\tinit();\r\n\r\n\t\t}\r\n\r\n\t\tgl.useProgram( program );\r\n\r\n\t\tstate.initAttributes();\r\n\t\tstate.enableAttribute( attributes.vertex );\r\n\t\tstate.enableAttribute( attributes.uv );\r\n\t\tstate.disableUnusedAttributes();\r\n\r\n\t\t// loop through all lens flares to update their occlusion and positions\r\n\t\t// setup gl and common used attribs/uniforms\r\n\r\n\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\r\n\t\tgl.uniform1i( uniforms.map, 1 );\r\n\r\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\r\n\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\r\n\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\r\n\r\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\r\n\r\n\t\tstate.disable( gl.CULL_FACE );\r\n\t\tstate.setDepthWrite( false );\r\n\r\n\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\r\n\r\n\t\t\tsize = 16 / viewport.w;\r\n\t\t\tscale.set( size * invAspect, size );\r\n\r\n\t\t\t// calc object screen position\r\n\r\n\t\t\tvar flare = flares[ i ];\r\n\r\n\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\r\n\r\n\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\r\n\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\r\n\r\n\t\t\t// setup arrays for gl programs\r\n\r\n\t\t\tscreenPosition.copy( tempPosition );\r\n\r\n\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\r\n\r\n\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\r\n\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\r\n\r\n\t\t\t// screen cull\r\n\r\n\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\r\n\r\n\t\t\t\t// save current RGB to temp texture\r\n\r\n\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\r\n\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\r\n\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\r\n\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\r\n\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\r\n\r\n\r\n\t\t\t\t// render pink quad\r\n\r\n\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\r\n\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\r\n\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\r\n\r\n\t\t\t\tstate.disable( gl.BLEND );\r\n\t\t\t\tstate.enable( gl.DEPTH_TEST );\r\n\r\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\r\n\r\n\r\n\t\t\t\t// copy result to occlusionMap\r\n\r\n\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\r\n\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\r\n\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\r\n\r\n\r\n\t\t\t\t// restore graphics\r\n\r\n\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\r\n\t\t\t\tstate.disable( gl.DEPTH_TEST );\r\n\r\n\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\r\n\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\r\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\r\n\r\n\r\n\t\t\t\t// update object positions\r\n\r\n\t\t\t\tflare.positionScreen.copy( screenPosition );\r\n\r\n\t\t\t\tif ( flare.customUpdateCallback ) {\r\n\r\n\t\t\t\t\tflare.customUpdateCallback( flare );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tflare.updateLensFlares();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render flares\r\n\r\n\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\r\n\t\t\t\tstate.enable( gl.BLEND );\r\n\r\n\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\r\n\r\n\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\r\n\r\n\t\t\t\t\t\tscreenPosition.x = sprite.x;\r\n\t\t\t\t\t\tscreenPosition.y = sprite.y;\r\n\t\t\t\t\t\tscreenPosition.z = sprite.z;\r\n\r\n\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\r\n\r\n\t\t\t\t\t\tscale.x = size * invAspect;\r\n\t\t\t\t\t\tscale.y = size;\r\n\r\n\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\r\n\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\r\n\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\r\n\r\n\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\r\n\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\r\n\r\n\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\r\n\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\r\n\r\n\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore gl\r\n\r\n\t\tstate.enable( gl.CULL_FACE );\r\n\t\tstate.enable( gl.DEPTH_TEST );\r\n\t\tstate.setDepthWrite( true );\r\n\r\n\t\trenderer.resetGLState();\r\n\r\n\t};\r\n\r\n\tfunction createProgram ( shader ) {\r\n\r\n\t\tvar program = gl.createProgram();\r\n\r\n\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\r\n\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\r\n\r\n\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\r\n\r\n\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\r\n\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\r\n\r\n\t\tgl.compileShader( fragmentShader );\r\n\t\tgl.compileShader( vertexShader );\r\n\r\n\t\tgl.attachShader( program, fragmentShader );\r\n\t\tgl.attachShader( program, vertexShader );\r\n\r\n\t\tgl.linkProgram( program );\r\n\r\n\t\treturn program;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/renderers/webgl/plugins/SpritePlugin.js\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SpritePlugin = function ( renderer, sprites ) {\r\n\r\n\tvar gl = renderer.context;\r\n\tvar state = renderer.state;\r\n\r\n\tvar vertexBuffer, elementBuffer;\r\n\tvar program, attributes, uniforms;\r\n\r\n\tvar texture;\r\n\r\n\t// decompose matrixWorld\r\n\r\n\tvar spritePosition = new THREE.Vector3();\r\n\tvar spriteRotation = new THREE.Quaternion();\r\n\tvar spriteScale = new THREE.Vector3();\r\n\r\n\tfunction init() {\r\n\r\n\t\tvar vertices = new Float32Array( [\r\n\t\t\t- 0.5, - 0.5, 0, 0,\r\n\t\t\t 0.5, - 0.5, 1, 0,\r\n\t\t\t 0.5, 0.5, 1, 1,\r\n\t\t\t- 0.5, 0.5, 0, 1\r\n\t\t] );\r\n\r\n\t\tvar faces = new Uint16Array( [\r\n\t\t\t0, 1, 2,\r\n\t\t\t0, 2, 3\r\n\t\t] );\r\n\r\n\t\tvertexBuffer = gl.createBuffer();\r\n\t\telementBuffer = gl.createBuffer();\r\n\r\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\r\n\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\r\n\r\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\r\n\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\r\n\r\n\t\tprogram = createProgram();\r\n\r\n\t\tattributes = {\r\n\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\r\n\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\r\n\t\t};\r\n\r\n\t\tuniforms = {\r\n\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\r\n\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\r\n\r\n\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\r\n\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\r\n\r\n\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\r\n\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\r\n\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\r\n\r\n\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\r\n\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\r\n\r\n\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\r\n\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\r\n\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\r\n\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\r\n\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\r\n\r\n\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\r\n\t\t};\r\n\r\n\t\tvar canvas = document.createElement( 'canvas' );\r\n\t\tcanvas.width = 8;\r\n\t\tcanvas.height = 8;\r\n\r\n\t\tvar context = canvas.getContext( '2d' );\r\n\t\tcontext.fillStyle = 'white';\r\n\t\tcontext.fillRect( 0, 0, 8, 8 );\r\n\r\n\t\ttexture = new THREE.Texture( canvas );\r\n\t\ttexture.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\tthis.render = function ( scene, camera ) {\r\n\r\n\t\tif ( sprites.length === 0 ) return;\r\n\r\n\t\t// setup gl\r\n\r\n\t\tif ( program === undefined ) {\r\n\r\n\t\t\tinit();\r\n\r\n\t\t}\r\n\r\n\t\tgl.useProgram( program );\r\n\r\n\t\tstate.initAttributes();\r\n\t\tstate.enableAttribute( attributes.position );\r\n\t\tstate.enableAttribute( attributes.uv );\r\n\t\tstate.disableUnusedAttributes();\r\n\r\n\t\tstate.disable( gl.CULL_FACE );\r\n\t\tstate.enable( gl.BLEND );\r\n\r\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\r\n\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\r\n\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\r\n\r\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\r\n\r\n\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\r\n\r\n\t\tstate.activeTexture( gl.TEXTURE0 );\r\n\t\tgl.uniform1i( uniforms.map, 0 );\r\n\r\n\t\tvar oldFogType = 0;\r\n\t\tvar sceneFogType = 0;\r\n\t\tvar fog = scene.fog;\r\n\r\n\t\tif ( fog ) {\r\n\r\n\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\r\n\r\n\t\t\tif ( fog instanceof THREE.Fog ) {\r\n\r\n\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\r\n\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\r\n\r\n\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\r\n\t\t\t\toldFogType = 1;\r\n\t\t\t\tsceneFogType = 1;\r\n\r\n\t\t\t} else if ( fog instanceof THREE.FogExp2 ) {\r\n\r\n\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\r\n\r\n\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\r\n\t\t\t\toldFogType = 2;\r\n\t\t\t\tsceneFogType = 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tgl.uniform1i( uniforms.fogType, 0 );\r\n\t\t\toldFogType = 0;\r\n\t\t\tsceneFogType = 0;\r\n\r\n\t\t}\r\n\r\n\r\n\t\t// update positions and sort\r\n\r\n\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar sprite = sprites[ i ];\r\n\r\n\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\r\n\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\r\n\r\n\t\t}\r\n\r\n\t\tsprites.sort( painterSortStable );\r\n\r\n\t\t// render all sprites\r\n\r\n\t\tvar scale = [];\r\n\r\n\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar sprite = sprites[ i ];\r\n\t\t\tvar material = sprite.material;\r\n\r\n\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\r\n\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\r\n\r\n\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\r\n\r\n\t\t\tscale[ 0 ] = spriteScale.x;\r\n\t\t\tscale[ 1 ] = spriteScale.y;\r\n\r\n\t\t\tvar fogType = 0;\r\n\r\n\t\t\tif ( scene.fog && material.fog ) {\r\n\r\n\t\t\t\tfogType = sceneFogType;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( oldFogType !== fogType ) {\r\n\r\n\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\r\n\t\t\t\toldFogType = fogType;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material.map !== null ) {\r\n\r\n\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\r\n\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\r\n\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\r\n\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\r\n\r\n\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\r\n\t\t\tgl.uniform2fv( uniforms.scale, scale );\r\n\r\n\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\r\n\t\t\tstate.setDepthTest( material.depthTest );\r\n\t\t\tstate.setDepthWrite( material.depthWrite );\r\n\r\n\t\t\tif ( material.map ) {\r\n\r\n\t\t\t\trenderer.setTexture2D( material.map, 0 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\trenderer.setTexture2D( texture, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\r\n\r\n\t\t}\r\n\r\n\t\t// restore gl\r\n\r\n\t\tstate.enable( gl.CULL_FACE );\r\n\r\n\t\trenderer.resetGLState();\r\n\r\n\t};\r\n\r\n\tfunction createProgram () {\r\n\r\n\t\tvar program = gl.createProgram();\r\n\r\n\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\r\n\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\r\n\r\n\t\tgl.shaderSource( vertexShader, [\r\n\r\n\t\t\t'precision ' + renderer.getPrecision() + ' float;',\r\n\r\n\t\t\t'uniform mat4 modelViewMatrix;',\r\n\t\t\t'uniform mat4 projectionMatrix;',\r\n\t\t\t'uniform float rotation;',\r\n\t\t\t'uniform vec2 scale;',\r\n\t\t\t'uniform vec2 uvOffset;',\r\n\t\t\t'uniform vec2 uvScale;',\r\n\r\n\t\t\t'attribute vec2 position;',\r\n\t\t\t'attribute vec2 uv;',\r\n\r\n\t\t\t'varying vec2 vUV;',\r\n\r\n\t\t\t'void main() {',\r\n\r\n\t\t\t\t'vUV = uvOffset + uv * uvScale;',\r\n\r\n\t\t\t\t'vec2 alignedPosition = position * scale;',\r\n\r\n\t\t\t\t'vec2 rotatedPosition;',\r\n\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\r\n\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\r\n\r\n\t\t\t\t'vec4 finalPosition;',\r\n\r\n\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\r\n\t\t\t\t'finalPosition.xy += rotatedPosition;',\r\n\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\r\n\r\n\t\t\t\t'gl_Position = finalPosition;',\r\n\r\n\t\t\t'}'\r\n\r\n\t\t].join( '\\n' ) );\r\n\r\n\t\tgl.shaderSource( fragmentShader, [\r\n\r\n\t\t\t'precision ' + renderer.getPrecision() + ' float;',\r\n\r\n\t\t\t'uniform vec3 color;',\r\n\t\t\t'uniform sampler2D map;',\r\n\t\t\t'uniform float opacity;',\r\n\r\n\t\t\t'uniform int fogType;',\r\n\t\t\t'uniform vec3 fogColor;',\r\n\t\t\t'uniform float fogDensity;',\r\n\t\t\t'uniform float fogNear;',\r\n\t\t\t'uniform float fogFar;',\r\n\t\t\t'uniform float alphaTest;',\r\n\r\n\t\t\t'varying vec2 vUV;',\r\n\r\n\t\t\t'void main() {',\r\n\r\n\t\t\t\t'vec4 texture = texture2D( map, vUV );',\r\n\r\n\t\t\t\t'if ( texture.a < alphaTest ) discard;',\r\n\r\n\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\r\n\r\n\t\t\t\t'if ( fogType > 0 ) {',\r\n\r\n\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\r\n\t\t\t\t\t'float fogFactor = 0.0;',\r\n\r\n\t\t\t\t\t'if ( fogType == 1 ) {',\r\n\r\n\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\r\n\r\n\t\t\t\t\t'} else {',\r\n\r\n\t\t\t\t\t\t'const float LOG2 = 1.442695;',\r\n\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\r\n\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\r\n\r\n\t\t\t\t\t'}',\r\n\r\n\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\r\n\r\n\t\t\t\t'}',\r\n\r\n\t\t\t'}'\r\n\r\n\t\t].join( '\\n' ) );\r\n\r\n\t\tgl.compileShader( vertexShader );\r\n\t\tgl.compileShader( fragmentShader );\r\n\r\n\t\tgl.attachShader( program, vertexShader );\r\n\t\tgl.attachShader( program, fragmentShader );\r\n\r\n\t\tgl.linkProgram( program );\r\n\r\n\t\treturn program;\r\n\r\n\t}\r\n\r\n\tfunction painterSortStable ( a, b ) {\r\n\t\t\r\n\t\tif ( a.renderOrder !== b.renderOrder ) {\r\n\r\n\t\t\treturn a.renderOrder - b.renderOrder;\r\n\r\n\t\t} else if ( a.z !== b.z ) {\r\n\r\n\t\t\treturn b.z - a.z;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn b.id - a.id;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/Three.Legacy.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nObject.defineProperties( THREE.Box2.prototype, {\r\n\tempty: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\r\n\t\t\treturn this.isEmpty();\r\n\t\t}\r\n\t},\r\n\tisIntersectionBox: {\r\n\t\tvalue: function ( box ) {\r\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\r\n\t\t\treturn this.intersectsBox( box );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Box3.prototype, {\r\n\tempty: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\r\n\t\t\treturn this.isEmpty();\r\n\t\t}\r\n\t},\r\n\tisIntersectionBox: {\r\n\t\tvalue: function ( box ) {\r\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\r\n\t\t\treturn this.intersectsBox( box );\r\n\t\t}\r\n\t},\r\n\tisIntersectionSphere: {\r\n\t\tvalue: function ( sphere ) {\r\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\r\n\t\t\treturn this.intersectsSphere( sphere );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Matrix3.prototype, {\r\n\tmultiplyVector3: {\r\n\t\tvalue: function ( vector ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\r\n\t\t\treturn vector.applyMatrix3( this );\r\n\t\t}\r\n\t},\r\n\tmultiplyVector3Array: {\r\n\t\tvalue: function ( a ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\r\n\t\t\treturn this.applyToVector3Array( a );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Matrix4.prototype, {\r\n\textractPosition: {\r\n\t\tvalue: function ( m ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\r\n\t\t\treturn this.copyPosition( m );\r\n\t\t}\r\n\t},\r\n\tsetRotationFromQuaternion: {\r\n\t\tvalue: function ( q ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\r\n\t\t\treturn this.makeRotationFromQuaternion( q );\r\n\t\t}\r\n\t},\r\n\tmultiplyVector3: {\r\n\t\tvalue: function ( vector ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\r\n\t\t\treturn vector.applyProjection( this );\r\n\t\t}\r\n\t},\r\n\tmultiplyVector4: {\r\n\t\tvalue: function ( vector ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\r\n\t\t\treturn vector.applyMatrix4( this );\r\n\t\t}\r\n\t},\r\n\tmultiplyVector3Array: {\r\n\t\tvalue: function ( a ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\r\n\t\t\treturn this.applyToVector3Array( a );\r\n\t\t}\r\n\t},\r\n\trotateAxis: {\r\n\t\tvalue: function ( v ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\r\n\t\t\tv.transformDirection( this );\r\n\t\t}\r\n\t},\r\n\tcrossVector: {\r\n\t\tvalue: function ( vector ) {\r\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\r\n\t\t\treturn vector.applyMatrix4( this );\r\n\t\t}\r\n\t},\r\n\ttranslate: {\r\n\t\tvalue: function ( v ) {\r\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\r\n\t\t}\r\n\t},\r\n\trotateX: {\r\n\t\tvalue: function ( angle ) {\r\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\r\n\t\t}\r\n\t},\r\n\trotateY: {\r\n\t\tvalue: function ( angle ) {\r\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\r\n\t\t}\r\n\t},\r\n\trotateZ: {\r\n\t\tvalue: function ( angle ) {\r\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\r\n\t\t}\r\n\t},\r\n\trotateByAxis: {\r\n\t\tvalue: function ( axis, angle ) {\r\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Plane.prototype, {\r\n\tisIntersectionLine: {\r\n\t\tvalue: function ( line ) {\r\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\r\n\t\t\treturn this.intersectsLine( line );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Quaternion.prototype, {\r\n\tmultiplyVector3: {\r\n\t\tvalue: function ( vector ) {\r\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\r\n\t\t\treturn vector.applyQuaternion( this );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Ray.prototype, {\r\n\tisIntersectionBox: {\r\n\t\tvalue: function ( box ) {\r\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\r\n\t\t\treturn this.intersectsBox( box );\r\n\t\t}\r\n\t},\r\n\tisIntersectionPlane: {\r\n\t\tvalue: function ( plane ) {\r\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\r\n\t\t\treturn this.intersectsPlane( plane );\r\n\t\t}\r\n\t},\r\n\tisIntersectionSphere: {\r\n\t\tvalue: function ( sphere ) {\r\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\r\n\t\t\treturn this.intersectsSphere( sphere );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.Vector3.prototype, {\r\n\tsetEulerFromRotationMatrix: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\r\n\t\t}\r\n\t},\r\n\tsetEulerFromQuaternion: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\r\n\t\t}\r\n\t},\r\n\tgetPositionFromMatrix: {\r\n\t\tvalue: function ( m ) {\r\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\r\n\t\t\treturn this.setFromMatrixPosition( m );\r\n\t\t}\r\n\t},\r\n\tgetScaleFromMatrix: {\r\n\t\tvalue: function ( m ) {\r\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\r\n\t\t\treturn this.setFromMatrixScale( m );\r\n\t\t}\r\n\t},\r\n\tgetColumnFromMatrix: {\r\n\t\tvalue: function ( index, matrix ) {\r\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\r\n\t\t\treturn this.setFromMatrixColumn( index, matrix );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nTHREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) {\r\n\r\n\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\r\n\treturn new THREE.Face3( a, b, c, normal, color, materialIndex );\r\n\r\n};\r\n\r\nTHREE.Vertex = function ( x, y, z ) {\r\n\r\n\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\r\n\treturn new THREE.Vector3( x, y, z );\r\n\r\n};\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.Object3D.prototype, {\r\n\teulerOrder: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\r\n\t\t\treturn this.rotation.order;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\r\n\t\t\tthis.rotation.order = value;\r\n\t\t}\r\n\t},\r\n\tgetChildByName: {\r\n\t\tvalue: function ( name ) {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\r\n\t\t\treturn this.getObjectByName( name );\r\n\t\t}\r\n\t},\r\n\trenderDepth: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\r\n\t\t}\r\n\t},\r\n\ttranslate: {\r\n\t\tvalue: function ( distance, axis ) {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\r\n\t\t\treturn this.translateOnAxis( axis, distance );\r\n\t\t}\r\n\t},\r\n\tuseQuaternion: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE, {\r\n\tPointCloud: {\r\n\t\tvalue: function ( geometry, material ) {\r\n\t\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\r\n\t\t\treturn new THREE.Points( geometry, material );\r\n\t\t}\r\n\t},\r\n\tParticleSystem: {\r\n\t\tvalue: function ( geometry, material ) {\r\n\t\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\r\n\t\t\treturn new THREE.Points( geometry, material );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.Light.prototype, {\r\n\tonlyShadow: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\r\n\t\t}\r\n\t},\r\n\tshadowCameraFov: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\r\n\t\t\tthis.shadow.camera.fov = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraLeft: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\r\n\t\t\tthis.shadow.camera.left = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraRight: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\r\n\t\t\tthis.shadow.camera.right = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraTop: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\r\n\t\t\tthis.shadow.camera.top = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraBottom: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\r\n\t\t\tthis.shadow.camera.bottom = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraNear: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\r\n\t\t\tthis.shadow.camera.near = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraFar: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\r\n\t\t\tthis.shadow.camera.far = value;\r\n\t\t}\r\n\t},\r\n\tshadowCameraVisible: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\r\n\t\t}\r\n\t},\r\n\tshadowBias: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\r\n\t\t\tthis.shadow.bias = value;\r\n\t\t}\r\n\t},\r\n\tshadowDarkness: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\r\n\t\t}\r\n\t},\r\n\tshadowMapWidth: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\r\n\t\t\tthis.shadow.mapSize.width = value;\r\n\t\t}\r\n\t},\r\n\tshadowMapHeight: {\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\r\n\t\t\tthis.shadow.mapSize.height = value;\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.BufferAttribute.prototype, {\r\n\tlength: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\r\n\t\t\treturn this.array.length;\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.BufferGeometry.prototype, {\r\n\tdrawcalls: {\r\n\t\tget: function () {\r\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\r\n\t\t\treturn this.groups;\r\n\t\t}\r\n\t},\r\n\toffsets: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\r\n\t\t\treturn this.groups;\r\n\t\t}\r\n\t},\r\n\taddIndex: {\r\n\t\tvalue: function ( index ) {\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\r\n\t\t\tthis.setIndex( index );\r\n\t\t}\r\n\t},\r\n\taddDrawCall: {\r\n\t\tvalue: function ( start, count, indexOffset ) {\r\n\t\t\tif ( indexOffset !== undefined ) {\r\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\r\n\t\t\t}\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\r\n\t\t\tthis.addGroup( start, count );\r\n\t\t}\r\n\t},\r\n\tclearDrawCalls: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\r\n\t\t\tthis.clearGroups();\r\n\t\t}\r\n\t},\r\n\tcomputeTangents: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\r\n\t\t}\r\n\t},\r\n\tcomputeOffsets: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.Material.prototype, {\r\n\twrapAround: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\r\n\t\t}\r\n\t},\r\n\twrapRGB: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\r\n\t\t\treturn new THREE.Color();\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE, {\r\n\tPointCloudMaterial: {\r\n\t\tvalue: function ( parameters ) {\r\n\t\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\r\n\t\t\treturn new THREE.PointsMaterial( parameters );\r\n\t\t}\r\n\t},\r\n\tParticleBasicMaterial: {\r\n\t\tvalue: function ( parameters ) {\r\n\t\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\r\n\t\t\treturn new THREE.PointsMaterial( parameters );\r\n\t\t}\r\n\t},\r\n\tParticleSystemMaterial:{\r\n\t\tvalue: function ( parameters ) {\r\n\t\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\r\n\t\t\treturn new THREE.PointsMaterial( parameters );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.MeshPhongMaterial.prototype, {\r\n\tmetal: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\r\n\t\t\treturn false;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\r\n\t\t}\r\n\t}\r\n} );\r\n\r\nObject.defineProperties( THREE.ShaderMaterial.prototype, {\r\n\tderivatives: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\r\n\t\t\treturn this.extensions.derivatives;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\r\n\t\t\tthis.extensions.derivatives = value;\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.WebGLRenderer.prototype, {\r\n\tsupportsFloatTextures: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\r\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\r\n\t\t}\r\n\t},\r\n\tsupportsHalfFloatTextures: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\r\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\r\n\t\t}\r\n\t},\r\n\tsupportsStandardDerivatives: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\r\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\r\n\t\t}\r\n\t},\r\n\tsupportsCompressedTextureS3TC: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\r\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\r\n\t\t}\r\n\t},\r\n\tsupportsCompressedTexturePVRTC: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\r\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\r\n\t\t}\r\n\t},\r\n\tsupportsBlendMinMax: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\r\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\r\n\t\t}\r\n\t},\r\n\tsupportsVertexTextures: {\r\n\t\tvalue: function () {\r\n\t\t\treturn this.capabilities.vertexTextures;\r\n\t\t}\r\n\t},\r\n\tsupportsInstancedArrays: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\r\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\r\n\t\t}\r\n\t},\r\n\tenableScissorTest: {\r\n\t\tvalue: function ( boolean ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\r\n\t\t\tthis.setScissorTest( boolean );\r\n\t\t}\r\n\t},\r\n\tinitMaterial: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\r\n\t\t}\r\n\t},\r\n\taddPrePlugin: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\r\n\t\t}\r\n\t},\r\n\taddPostPlugin: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\r\n\t\t}\r\n\t},\r\n\tupdateShadowMap: {\r\n\t\tvalue: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\r\n\t\t}\r\n\t},\r\n\tshadowMapEnabled: {\r\n\t\tget: function () {\r\n\t\t\treturn this.shadowMap.enabled;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\r\n\t\t\tthis.shadowMap.enabled = value;\r\n\t\t}\r\n\t},\r\n\tshadowMapType: {\r\n\t\tget: function () {\r\n\t\t\treturn this.shadowMap.type;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\r\n\t\t\tthis.shadowMap.type = value;\r\n\t\t}\r\n\t},\r\n\tshadowMapCullFace: {\r\n\t\tget: function () {\r\n\t\t\treturn this.shadowMap.cullFace;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\r\n\t\t\tthis.shadowMap.cullFace = value;\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.WebGLRenderTarget.prototype, {\r\n\twrapS: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\r\n\t\t\treturn this.texture.wrapS;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\r\n\t\t\tthis.texture.wrapS = value;\r\n\t\t}\r\n\t},\r\n\twrapT: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\r\n\t\t\treturn this.texture.wrapT;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\r\n\t\t\tthis.texture.wrapT = value;\r\n\t\t}\r\n\t},\r\n\tmagFilter: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\r\n\t\t\treturn this.texture.magFilter;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\r\n\t\t\tthis.texture.magFilter = value;\r\n\t\t}\r\n\t},\r\n\tminFilter: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\r\n\t\t\treturn this.texture.minFilter;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\r\n\t\t\tthis.texture.minFilter = value;\r\n\t\t}\r\n\t},\r\n\tanisotropy: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\r\n\t\t\treturn this.texture.anisotropy;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\r\n\t\t\tthis.texture.anisotropy = value;\r\n\t\t}\r\n\t},\r\n\toffset: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\r\n\t\t\treturn this.texture.offset;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\r\n\t\t\tthis.texture.offset = value;\r\n\t\t}\r\n\t},\r\n\trepeat: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\r\n\t\t\treturn this.texture.repeat;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\r\n\t\t\tthis.texture.repeat = value;\r\n\t\t}\r\n\t},\r\n\tformat: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\r\n\t\t\treturn this.texture.format;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\r\n\t\t\tthis.texture.format = value;\r\n\t\t}\r\n\t},\r\n\ttype: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\r\n\t\t\treturn this.texture.type;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\r\n\t\t\tthis.texture.type = value;\r\n\t\t}\r\n\t},\r\n\tgenerateMipmaps: {\r\n\t\tget: function () {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\r\n\t\t\treturn this.texture.generateMipmaps;\r\n\t\t},\r\n\t\tset: function ( value ) {\r\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\r\n\t\t\tthis.texture.generateMipmaps = value;\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.Audio.prototype, {\r\n\tload: {\r\n\t\tvalue: function ( file ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\r\n\r\n\t\t\tvar scope = this;\r\n\r\n\t\t\tvar audioLoader = new THREE.AudioLoader();\r\n\r\n\t\t\taudioLoader.load( file, function ( buffer ) {\r\n\r\n\t\t\t\tscope.setBuffer( buffer );\r\n\r\n\t\t\t} );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n//\r\n\r\nTHREE.GeometryUtils = {\r\n\r\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\r\n\r\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\r\n\r\n\t\tvar matrix;\r\n\r\n\t\tif ( geometry2 instanceof THREE.Mesh ) {\r\n\r\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\r\n\r\n\t\t\tmatrix = geometry2.matrix;\r\n\t\t\tgeometry2 = geometry2.geometry;\r\n\r\n\t\t}\r\n\r\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\r\n\r\n\t},\r\n\r\n\tcenter: function ( geometry ) {\r\n\r\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\r\n\t\treturn geometry.center();\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ImageUtils = {\r\n\r\n\tcrossOrigin: undefined,\r\n\r\n\tloadTexture: function ( url, mapping, onLoad, onError ) {\r\n\r\n\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\r\n\r\n\t\tvar loader = new THREE.TextureLoader();\r\n\t\tloader.setCrossOrigin( this.crossOrigin );\r\n\r\n\t\tvar texture = loader.load( url, onLoad, undefined, onError );\r\n\r\n\t\tif ( mapping ) texture.mapping = mapping;\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\r\n\r\n\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\r\n\r\n\t\tvar loader = new THREE.CubeTextureLoader();\r\n\t\tloader.setCrossOrigin( this.crossOrigin );\r\n\r\n\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\r\n\r\n\t\tif ( mapping ) texture.mapping = mapping;\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tloadCompressedTexture: function () {\r\n\r\n\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\r\n\r\n\t},\r\n\r\n\tloadCompressedTextureCube: function () {\r\n\r\n\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\r\n\r\n\t}\r\n\r\n};\r\n\r\n//\r\n\r\nTHREE.Projector = function () {\r\n\r\n\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\r\n\r\n\tthis.projectVector = function ( vector, camera ) {\r\n\r\n\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\r\n\t\tvector.project( camera );\r\n\r\n\t};\r\n\r\n\tthis.unprojectVector = function ( vector, camera ) {\r\n\r\n\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\r\n\t\tvector.unproject( camera );\r\n\r\n\t};\r\n\r\n\tthis.pickingRay = function ( vector, camera ) {\r\n\r\n\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\r\n\r\n\t};\r\n\r\n};\r\n\r\n//\r\n\r\nTHREE.CanvasRenderer = function () {\r\n\r\n\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\r\n\r\n\tthis.domElement = document.createElement( 'canvas' );\r\n\tthis.clear = function () {};\r\n\tthis.render = function () {};\r\n\tthis.setClearColor = function () {};\r\n\tthis.setSize = function () {};\r\n\r\n};\r\n\r\n//\r\n\r\nTHREE.MeshFaceMaterial = THREE.MultiMaterial;\r\n\r\n//\r\n\r\nObject.defineProperties( THREE.LOD.prototype, {\r\n\tobjects: {\r\n\t\tget: function () {\r\n\r\n\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\r\n\t\t\treturn this.levels;\r\n\r\n\t\t}\r\n\t}\r\n} );\r\n\r\n// File:src/extras/CurveUtils.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n */\r\n\r\nTHREE.CurveUtils = {\r\n\r\n\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\r\n\r\n\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\r\n\r\n\t},\r\n\r\n\t// Puay Bing, thanks for helping with this derivative!\r\n\r\n\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\r\n\r\n\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\r\n\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\r\n\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\r\n\t\t\t3 * t * t * p3;\r\n\r\n\t},\r\n\r\n\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\r\n\r\n\t\t// To check if my formulas are correct\r\n\r\n\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\r\n\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\r\n\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\r\n\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\r\n\r\n\t\treturn h00 + h10 + h01 + h11;\r\n\r\n\t},\r\n\r\n\t// Catmull-Rom\r\n\r\n\tinterpolate: function( p0, p1, p2, p3, t ) {\r\n\r\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\r\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\r\n\t\tvar t2 = t * t;\r\n\t\tvar t3 = t * t2;\r\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/extras/SceneUtils.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SceneUtils = {\r\n\r\n\tcreateMultiMaterialObject: function ( geometry, materials ) {\r\n\r\n\t\tvar group = new THREE.Group();\r\n\r\n\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\r\n\r\n\t\t\tgroup.add( new THREE.Mesh( geometry, materials[ i ] ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn group;\r\n\r\n\t},\r\n\r\n\tdetach: function ( child, parent, scene ) {\r\n\r\n\t\tchild.applyMatrix( parent.matrixWorld );\r\n\t\tparent.remove( child );\r\n\t\tscene.add( child );\r\n\r\n\t},\r\n\r\n\tattach: function ( child, scene, parent ) {\r\n\r\n\t\tvar matrixWorldInverse = new THREE.Matrix4();\r\n\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\r\n\t\tchild.applyMatrix( matrixWorldInverse );\r\n\r\n\t\tscene.remove( child );\r\n\t\tparent.add( child );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/extras/ShapeUtils.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n */\r\n\r\nTHREE.ShapeUtils = {\r\n\r\n\t// calculate area of the contour polygon\r\n\r\n\tarea: function ( contour ) {\r\n\r\n\t\tvar n = contour.length;\r\n\t\tvar a = 0.0;\r\n\r\n\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\r\n\r\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\r\n\r\n\t\t}\r\n\r\n\t\treturn a * 0.5;\r\n\r\n\t},\r\n\r\n\ttriangulate: ( function () {\r\n\r\n\t\t/**\r\n\t\t * This code is a quick port of code written in C++ which was submitted to\r\n\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\r\n\t\t * See original code and more information here:\r\n\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\r\n\t\t *\r\n\t\t * ported to actionscript by Zevan Rosser\r\n\t\t * www.actionsnippet.com\r\n\t\t *\r\n\t\t * ported to javascript by Joshua Koo\r\n\t\t * http://www.lab4games.net/zz85/blog\r\n\t\t *\r\n\t\t */\r\n\r\n\t\tfunction snip( contour, u, v, w, n, verts ) {\r\n\r\n\t\t\tvar p;\r\n\t\t\tvar ax, ay, bx, by;\r\n\t\t\tvar cx, cy, px, py;\r\n\r\n\t\t\tax = contour[ verts[ u ] ].x;\r\n\t\t\tay = contour[ verts[ u ] ].y;\r\n\r\n\t\t\tbx = contour[ verts[ v ] ].x;\r\n\t\t\tby = contour[ verts[ v ] ].y;\r\n\r\n\t\t\tcx = contour[ verts[ w ] ].x;\r\n\t\t\tcy = contour[ verts[ w ] ].y;\r\n\r\n\t\t\tif ( Number.EPSILON > ( ( ( bx - ax ) * ( cy - ay ) ) - ( ( by - ay ) * ( cx - ax ) ) ) ) return false;\r\n\r\n\t\t\tvar aX, aY, bX, bY, cX, cY;\r\n\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\r\n\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\r\n\r\n\t\t\taX = cx - bx; aY = cy - by;\r\n\t\t\tbX = ax - cx; bY = ay - cy;\r\n\t\t\tcX = bx - ax; cY = by - ay;\r\n\r\n\t\t\tfor ( p = 0; p < n; p ++ ) {\r\n\r\n\t\t\t\tpx = contour[ verts[ p ] ].x;\r\n\t\t\t\tpy = contour[ verts[ p ] ].y;\r\n\r\n\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\r\n\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\r\n\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\r\n\r\n\t\t\t\tapx = px - ax; apy = py - ay;\r\n\t\t\t\tbpx = px - bx; bpy = py - by;\r\n\t\t\t\tcpx = px - cx; cpy = py - cy;\r\n\r\n\t\t\t\t// see if p is inside triangle abc\r\n\r\n\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\r\n\t\t\t\tcCROSSap = cX * apy - cY * apx;\r\n\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\r\n\r\n\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\t// takes in an contour array and returns\r\n\r\n\t\treturn function ( contour, indices ) {\r\n\r\n\t\t\tvar n = contour.length;\r\n\r\n\t\t\tif ( n < 3 ) return null;\r\n\r\n\t\t\tvar result = [],\r\n\t\t\t\tverts = [],\r\n\t\t\t\tvertIndices = [];\r\n\r\n\t\t\t/* we want a counter-clockwise polygon in verts */\r\n\r\n\t\t\tvar u, v, w;\r\n\r\n\t\t\tif ( THREE.ShapeUtils.area( contour ) > 0.0 ) {\r\n\r\n\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar nv = n;\r\n\r\n\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\r\n\r\n\t\t\tvar count = 2 * nv; /* error detection */\r\n\r\n\t\t\tfor ( v = nv - 1; nv > 2; ) {\r\n\r\n\t\t\t\t/* if we loop, it is probably a non-simple polygon */\r\n\r\n\t\t\t\tif ( ( count -- ) <= 0 ) {\r\n\r\n\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\r\n\r\n\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\r\n\t\t\t\t\t//return null;\r\n\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\r\n\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\r\n\r\n\t\t\t\t\tif ( indices ) return vertIndices;\r\n\t\t\t\t\treturn result;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* three consecutive vertices in current polygon, */\r\n\r\n\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\r\n\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\r\n\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\r\n\r\n\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\r\n\r\n\t\t\t\t\tvar a, b, c, s, t;\r\n\r\n\t\t\t\t\t/* true names of the vertices */\r\n\r\n\t\t\t\t\ta = verts[ u ];\r\n\t\t\t\t\tb = verts[ v ];\r\n\t\t\t\t\tc = verts[ w ];\r\n\r\n\t\t\t\t\t/* output Triangle */\r\n\r\n\t\t\t\t\tresult.push( [ contour[ a ],\r\n\t\t\t\t\t\tcontour[ b ],\r\n\t\t\t\t\t\tcontour[ c ] ] );\r\n\r\n\r\n\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\r\n\r\n\t\t\t\t\t/* remove v from the remaining polygon */\r\n\r\n\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\r\n\r\n\t\t\t\t\t\tverts[ s ] = verts[ t ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tnv --;\r\n\r\n\t\t\t\t\t/* reset error detection counter */\r\n\r\n\t\t\t\t\tcount = 2 * nv;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( indices ) return vertIndices;\r\n\t\t\treturn result;\r\n\r\n\t\t}\r\n\r\n\t} )(),\r\n\r\n\ttriangulateShape: function ( contour, holes ) {\r\n\r\n\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\r\n\r\n\t\t\t// inOtherPt needs to be collinear to the inSegment\r\n\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\r\n\r\n\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\r\n\r\n\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\r\n\r\n\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\r\n\r\n\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\r\n\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\r\n\r\n\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\r\n\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\r\n\r\n\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\r\n\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\r\n\r\n\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\r\n\r\n\t\t\t\t// not parallel\r\n\r\n\t\t\t\tvar perpSeg2;\r\n\t\t\t\tif ( limit > 0 ) {\r\n\r\n\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\r\n\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\r\n\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\r\n\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\r\n\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// i.e. to reduce rounding errors\r\n\t\t\t\t// intersection at endpoint of segment#1?\r\n\t\t\t\tif ( perpSeg2 === 0 ) {\r\n\r\n\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\r\n\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\r\n\t\t\t\t\treturn [ inSeg1Pt1 ];\r\n\r\n\t\t\t\t}\r\n\t\t\t\tif ( perpSeg2 === limit ) {\r\n\r\n\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\r\n\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\r\n\t\t\t\t\treturn [ inSeg1Pt2 ];\r\n\r\n\t\t\t\t}\r\n\t\t\t\t// intersection at endpoint of segment#2?\r\n\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\r\n\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\r\n\r\n\t\t\t\t// return real intersection point\r\n\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\r\n\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\r\n\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// parallel or collinear\r\n\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\r\n\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\r\n\r\n\t\t\t\t// they are collinear or degenerate\r\n\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\r\n\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\r\n\t\t\t\t// both segments are points\r\n\t\t\t\tif ( seg1Pt && seg2Pt ) {\r\n\r\n\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\r\n\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\r\n\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\r\n\r\n\t\t\t\t}\r\n\t\t\t\t// segment#1 is a single point\r\n\t\t\t\tif ( seg1Pt ) {\r\n\r\n\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\r\n\t\t\t\t\treturn [ inSeg1Pt1 ];\r\n\r\n\t\t\t\t}\r\n\t\t\t\t// segment#2 is a single point\r\n\t\t\t\tif ( seg2Pt ) {\r\n\r\n\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\r\n\t\t\t\t\treturn [ inSeg2Pt1 ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// they are collinear segments, which might overlap\r\n\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\r\n\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\r\n\t\t\t\tif ( seg1dx !== 0 ) {\r\n\r\n\t\t\t\t\t// the segments are NOT on a vertical line\r\n\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\r\n\r\n\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\r\n\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\r\n\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\r\n\r\n\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\r\n\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\r\n\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// the segments are on a vertical line\r\n\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\r\n\r\n\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\r\n\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\r\n\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\r\n\r\n\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\r\n\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\r\n\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t\tif ( seg1minVal <= seg2minVal ) {\r\n\r\n\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\r\n\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\r\n\r\n\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\r\n\t\t\t\t\t\treturn [ seg2min ];\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\r\n\t\t\t\t\treturn\t[ seg2min, seg2max ];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\r\n\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\r\n\r\n\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\r\n\t\t\t\t\t\treturn [ seg1min ];\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\r\n\t\t\t\t\treturn\t[ seg1min, seg2max ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\r\n\r\n\t\t\t// The order of legs is important\r\n\r\n\t\t\t// translation of all points, so that Vertex is at (0,0)\r\n\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\r\n\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\r\n\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\r\n\r\n\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\r\n\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\r\n\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\r\n\r\n\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\r\n\r\n\t\t\t\t// angle != 180 deg.\r\n\r\n\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\r\n\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\r\n\r\n\t\t\t\tif ( from2toAngle > 0 ) {\r\n\r\n\t\t\t\t\t// main angle < 180 deg.\r\n\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// main angle > 180 deg.\r\n\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// angle == 180 deg.\r\n\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\r\n\t\t\t\treturn\t( from2otherAngle > 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\r\n\t\tfunction removeHoles( contour, holes ) {\r\n\r\n\t\t\tvar shape = contour.concat(); // work on this shape\r\n\t\t\tvar hole;\r\n\r\n\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\r\n\r\n\t\t\t\t// Check if hole point lies within angle around shape point\r\n\t\t\t\tvar lastShapeIdx = shape.length - 1;\r\n\r\n\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\r\n\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\r\n\r\n\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\r\n\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\r\n\r\n\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\r\n\t\t\t\tif ( ! insideAngle ) {\r\n\r\n\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\r\n\t\t\t\t\treturn\tfalse;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Check if shape point lies within angle around hole point\r\n\t\t\t\tvar lastHoleIdx = hole.length - 1;\r\n\r\n\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\r\n\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\r\n\r\n\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\r\n\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\r\n\r\n\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\r\n\t\t\t\tif ( ! insideAngle ) {\r\n\r\n\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\r\n\t\t\t\t\treturn\tfalse;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn\ttrue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\r\n\r\n\t\t\t\t// checks for intersections with shape edges\r\n\t\t\t\tvar sIdx, nextIdx, intersection;\r\n\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\r\n\r\n\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\r\n\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\r\n\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn\tfalse;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar indepHoles = [];\r\n\r\n\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\r\n\r\n\t\t\t\t// checks for intersections with hole edges\r\n\t\t\t\tvar ihIdx, chkHole,\r\n\t\t\t\t\thIdx, nextIdx, intersection;\r\n\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\r\n\r\n\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\r\n\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\r\n\r\n\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\r\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\r\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t\treturn\tfalse;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar holeIndex, shapeIndex,\r\n\t\t\t\tshapePt, holePt,\r\n\t\t\t\tholeIdx, cutKey, failedCuts = [],\r\n\t\t\t\ttmpShape1, tmpShape2,\r\n\t\t\t\ttmpHole1, tmpHole2;\r\n\r\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\t\tindepHoles.push( h );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar minShapeIndex = 0;\r\n\t\t\tvar counter = indepHoles.length * 2;\r\n\t\t\twhile ( indepHoles.length > 0 ) {\r\n\r\n\t\t\t\tcounter --;\r\n\t\t\t\tif ( counter < 0 ) {\r\n\r\n\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// search for shape-vertex and hole-vertex,\r\n\t\t\t\t// which can be connected without intersections\r\n\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\r\n\r\n\t\t\t\t\tshapePt = shape[ shapeIndex ];\r\n\t\t\t\t\tholeIndex\t= - 1;\r\n\r\n\t\t\t\t\t// search for hole which can be reached without intersections\r\n\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\r\n\r\n\t\t\t\t\t\tholeIdx = indepHoles[ h ];\r\n\r\n\t\t\t\t\t\t// prevent multiple checks\r\n\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\r\n\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\thole = holes[ holeIdx ];\r\n\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\r\n\r\n\t\t\t\t\t\t\tholePt = hole[ h2 ];\r\n\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\r\n\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\r\n\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\tholeIndex = h2;\r\n\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\r\n\r\n\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\r\n\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\r\n\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\r\n\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\r\n\r\n\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\r\n\r\n\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\r\n\r\n\t\t\t\t\t\t\t// Debug only, to show the selected cuts\r\n\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\r\n\r\n\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn shape; \t\t\t/* shape with no holes */\r\n\r\n\t\t}\r\n\r\n\r\n\t\tvar i, il, f, face,\r\n\t\t\tkey, index,\r\n\t\t\tallPointsMap = {};\r\n\r\n\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\r\n\r\n\t\tvar allpoints = contour.concat();\r\n\r\n\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\r\n\r\n\t\t}\r\n\r\n\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\r\n\r\n\t\t// prepare all points map\r\n\r\n\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\r\n\r\n\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\r\n\r\n\t\t\tif ( allPointsMap[ key ] !== undefined ) {\r\n\r\n\t\t\t\tconsole.warn( \"THREE.Shape: Duplicate point\", key );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tallPointsMap[ key ] = i;\r\n\r\n\t\t}\r\n\r\n\t\t// remove holes by cutting paths to holes and adding them to the shape\r\n\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\r\n\r\n\t\tvar triangles = THREE.ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\r\n\t\t//console.log( \"triangles\",triangles, triangles.length );\r\n\r\n\t\t// check all face vertices against all points map\r\n\r\n\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\r\n\r\n\t\t\tface = triangles[ i ];\r\n\r\n\t\t\tfor ( f = 0; f < 3; f ++ ) {\r\n\r\n\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\r\n\r\n\t\t\t\tindex = allPointsMap[ key ];\r\n\r\n\t\t\t\tif ( index !== undefined ) {\r\n\r\n\t\t\t\t\tface[ f ] = index;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn triangles.concat();\r\n\r\n\t},\r\n\r\n\tisClockWise: function ( pts ) {\r\n\r\n\t\treturn THREE.ShapeUtils.area( pts ) < 0;\r\n\r\n\t},\r\n\r\n\t// Bezier Curves formulas obtained from\r\n\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\r\n\r\n\t// Quad Bezier Functions\r\n\r\n\tb2: ( function () {\r\n\r\n\t\tfunction b2p0( t, p ) {\r\n\r\n\t\t\tvar k = 1 - t;\r\n\t\t\treturn k * k * p;\r\n\r\n\t\t}\r\n\r\n\t\tfunction b2p1( t, p ) {\r\n\r\n\t\t\treturn 2 * ( 1 - t ) * t * p;\r\n\r\n\t\t}\r\n\r\n\t\tfunction b2p2( t, p ) {\r\n\r\n\t\t\treturn t * t * p;\r\n\r\n\t\t}\r\n\r\n\t\treturn function ( t, p0, p1, p2 ) {\r\n\r\n\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\r\n\r\n\t\t};\r\n\r\n\t} )(),\r\n\r\n\t// Cubic Bezier Functions\r\n\r\n\tb3: ( function () {\r\n\r\n\t\tfunction b3p0( t, p ) {\r\n\r\n\t\t\tvar k = 1 - t;\r\n\t\t\treturn k * k * k * p;\r\n\r\n\t\t}\r\n\r\n\t\tfunction b3p1( t, p ) {\r\n\r\n\t\t\tvar k = 1 - t;\r\n\t\t\treturn 3 * k * k * t * p;\r\n\r\n\t\t}\r\n\r\n\t\tfunction b3p2( t, p ) {\r\n\r\n\t\t\tvar k = 1 - t;\r\n\t\t\treturn 3 * k * t * t * p;\r\n\r\n\t\t}\r\n\r\n\t\tfunction b3p3( t, p ) {\r\n\r\n\t\t\treturn t * t * t * p;\r\n\r\n\t\t}\r\n\r\n\t\treturn function ( t, p0, p1, p2, p3 ) {\r\n\r\n\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\r\n\r\n\t\t};\r\n\r\n\t} )()\r\n\r\n};\r\n\r\n// File:src/extras/core/Curve.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * Extensible curve object\r\n *\r\n * Some common of Curve methods\r\n * .getPoint(t), getTangent(t)\r\n * .getPointAt(u), getTagentAt(u)\r\n * .getPoints(), .getSpacedPoints()\r\n * .getLength()\r\n * .updateArcLengths()\r\n *\r\n * This following classes subclasses THREE.Curve:\r\n *\r\n * -- 2d classes --\r\n * THREE.LineCurve\r\n * THREE.QuadraticBezierCurve\r\n * THREE.CubicBezierCurve\r\n * THREE.SplineCurve\r\n * THREE.ArcCurve\r\n * THREE.EllipseCurve\r\n *\r\n * -- 3d classes --\r\n * THREE.LineCurve3\r\n * THREE.QuadraticBezierCurve3\r\n * THREE.CubicBezierCurve3\r\n * THREE.SplineCurve3\r\n *\r\n * A series of curves can be represented as a THREE.CurvePath\r\n *\r\n **/\r\n\r\n/**************************************************************\r\n *\tAbstract Curve base class\r\n **************************************************************/\r\n\r\nTHREE.Curve = function () {\r\n\r\n};\r\n\r\nTHREE.Curve.prototype = {\r\n\r\n\tconstructor: THREE.Curve,\r\n\r\n\t// Virtual base class method to overwrite and implement in subclasses\r\n\t//\t- t [0 .. 1]\r\n\r\n\tgetPoint: function ( t ) {\r\n\r\n\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\r\n\t\treturn null;\r\n\r\n\t},\r\n\r\n\t// Get point at relative position in curve according to arc length\r\n\t// - u [0 .. 1]\r\n\r\n\tgetPointAt: function ( u ) {\r\n\r\n\t\tvar t = this.getUtoTmapping( u );\r\n\t\treturn this.getPoint( t );\r\n\r\n\t},\r\n\r\n\t// Get sequence of points using getPoint( t )\r\n\r\n\tgetPoints: function ( divisions ) {\r\n\r\n\t\tif ( ! divisions ) divisions = 5;\r\n\r\n\t\tvar d, pts = [];\r\n\r\n\t\tfor ( d = 0; d <= divisions; d ++ ) {\r\n\r\n\t\t\tpts.push( this.getPoint( d / divisions ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn pts;\r\n\r\n\t},\r\n\r\n\t// Get sequence of points using getPointAt( u )\r\n\r\n\tgetSpacedPoints: function ( divisions ) {\r\n\r\n\t\tif ( ! divisions ) divisions = 5;\r\n\r\n\t\tvar d, pts = [];\r\n\r\n\t\tfor ( d = 0; d <= divisions; d ++ ) {\r\n\r\n\t\t\tpts.push( this.getPointAt( d / divisions ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn pts;\r\n\r\n\t},\r\n\r\n\t// Get total curve arc length\r\n\r\n\tgetLength: function () {\r\n\r\n\t\tvar lengths = this.getLengths();\r\n\t\treturn lengths[ lengths.length - 1 ];\r\n\r\n\t},\r\n\r\n\t// Get list of cumulative segment lengths\r\n\r\n\tgetLengths: function ( divisions ) {\r\n\r\n\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\r\n\r\n\t\tif ( this.cacheArcLengths\r\n\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\r\n\t\t\t&& ! this.needsUpdate ) {\r\n\r\n\t\t\t//console.log( \"cached\", this.cacheArcLengths );\r\n\t\t\treturn this.cacheArcLengths;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t\tvar cache = [];\r\n\t\tvar current, last = this.getPoint( 0 );\r\n\t\tvar p, sum = 0;\r\n\r\n\t\tcache.push( 0 );\r\n\r\n\t\tfor ( p = 1; p <= divisions; p ++ ) {\r\n\r\n\t\t\tcurrent = this.getPoint ( p / divisions );\r\n\t\t\tsum += current.distanceTo( last );\r\n\t\t\tcache.push( sum );\r\n\t\t\tlast = current;\r\n\r\n\t\t}\r\n\r\n\t\tthis.cacheArcLengths = cache;\r\n\r\n\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\r\n\r\n\t},\r\n\r\n\tupdateArcLengths: function() {\r\n\r\n\t\tthis.needsUpdate = true;\r\n\t\tthis.getLengths();\r\n\r\n\t},\r\n\r\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\r\n\r\n\tgetUtoTmapping: function ( u, distance ) {\r\n\r\n\t\tvar arcLengths = this.getLengths();\r\n\r\n\t\tvar i = 0, il = arcLengths.length;\r\n\r\n\t\tvar targetArcLength; // The targeted u distance value to get\r\n\r\n\t\tif ( distance ) {\r\n\r\n\t\t\ttargetArcLength = distance;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\r\n\r\n\t\t}\r\n\r\n\t\t//var time = Date.now();\r\n\r\n\t\t// binary search for the index with largest value smaller than target u distance\r\n\r\n\t\tvar low = 0, high = il - 1, comparison;\r\n\r\n\t\twhile ( low <= high ) {\r\n\r\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\r\n\r\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\r\n\r\n\t\t\tif ( comparison < 0 ) {\r\n\r\n\t\t\t\tlow = i + 1;\r\n\r\n\t\t\t} else if ( comparison > 0 ) {\r\n\r\n\t\t\t\thigh = i - 1;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\thigh = i;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\t// DONE\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\ti = high;\r\n\r\n\t\t//console.log('b' , i, low, high, Date.now()- time);\r\n\r\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\r\n\r\n\t\t\tvar t = i / ( il - 1 );\r\n\t\t\treturn t;\r\n\r\n\t\t}\r\n\r\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\r\n\r\n\t\tvar lengthBefore = arcLengths[ i ];\r\n\t\tvar lengthAfter = arcLengths[ i + 1 ];\r\n\r\n\t\tvar segmentLength = lengthAfter - lengthBefore;\r\n\r\n\t\t// determine where we are between the 'before' and 'after' points\r\n\r\n\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\r\n\r\n\t\t// add that fractional amount to t\r\n\r\n\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\r\n\r\n\t\treturn t;\r\n\r\n\t},\r\n\r\n\t// Returns a unit vector tangent at t\r\n\t// In case any sub curve does not implement its tangent derivation,\r\n\t// 2 points a small delta apart will be used to find its gradient\r\n\t// which seems to give a reasonable approximation\r\n\r\n\tgetTangent: function( t ) {\r\n\r\n\t\tvar delta = 0.0001;\r\n\t\tvar t1 = t - delta;\r\n\t\tvar t2 = t + delta;\r\n\r\n\t\t// Capping in case of danger\r\n\r\n\t\tif ( t1 < 0 ) t1 = 0;\r\n\t\tif ( t2 > 1 ) t2 = 1;\r\n\r\n\t\tvar pt1 = this.getPoint( t1 );\r\n\t\tvar pt2 = this.getPoint( t2 );\r\n\r\n\t\tvar vec = pt2.clone().sub( pt1 );\r\n\t\treturn vec.normalize();\r\n\r\n\t},\r\n\r\n\tgetTangentAt: function ( u ) {\r\n\r\n\t\tvar t = this.getUtoTmapping( u );\r\n\t\treturn this.getTangent( t );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// TODO: Transformation for Curves?\r\n\r\n/**************************************************************\r\n *\t3D Curves\r\n **************************************************************/\r\n\r\n// A Factory method for creating new curve subclasses\r\n\r\nTHREE.Curve.create = function ( constructor, getPointFunc ) {\r\n\r\n\tconstructor.prototype = Object.create( THREE.Curve.prototype );\r\n\tconstructor.prototype.constructor = constructor;\r\n\tconstructor.prototype.getPoint = getPointFunc;\r\n\r\n\treturn constructor;\r\n\r\n};\r\n\r\n// File:src/extras/core/CurvePath.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n *\r\n **/\r\n\r\n/**************************************************************\r\n *\tCurved Path - a curve path is simply a array of connected\r\n * curves, but retains the api of a curve\r\n **************************************************************/\r\n\r\nTHREE.CurvePath = function () {\r\n\r\n\tthis.curves = [];\r\n\r\n\tthis.autoClose = false; // Automatically closes the path\r\n\r\n};\r\n\r\nTHREE.CurvePath.prototype = Object.create( THREE.Curve.prototype );\r\nTHREE.CurvePath.prototype.constructor = THREE.CurvePath;\r\n\r\nTHREE.CurvePath.prototype.add = function ( curve ) {\r\n\r\n\tthis.curves.push( curve );\r\n\r\n};\r\n\r\n/*\r\nTHREE.CurvePath.prototype.checkConnection = function() {\r\n\t// TODO\r\n\t// If the ending of curve is not connected to the starting\r\n\t// or the next curve, then, this is not a real path\r\n};\r\n*/\r\n\r\nTHREE.CurvePath.prototype.closePath = function() {\r\n\r\n\t// TODO Test\r\n\t// and verify for vector3 (needs to implement equals)\r\n\t// Add a line curve if start and end of lines are not connected\r\n\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\r\n\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\r\n\r\n\tif ( ! startPoint.equals( endPoint ) ) {\r\n\r\n\t\tthis.curves.push( new THREE.LineCurve( endPoint, startPoint ) );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// To get accurate point with reference to\r\n// entire path distance at time t,\r\n// following has to be done:\r\n\r\n// 1. Length of each sub path have to be known\r\n// 2. Locate and identify type of curve\r\n// 3. Get t for the curve\r\n// 4. Return curve.getPointAt(t')\r\n\r\nTHREE.CurvePath.prototype.getPoint = function( t ) {\r\n\r\n\tvar d = t * this.getLength();\r\n\tvar curveLengths = this.getCurveLengths();\r\n\tvar i = 0;\r\n\r\n\t// To think about boundaries points.\r\n\r\n\twhile ( i < curveLengths.length ) {\r\n\r\n\t\tif ( curveLengths[ i ] >= d ) {\r\n\r\n\t\t\tvar diff = curveLengths[ i ] - d;\r\n\t\t\tvar curve = this.curves[ i ];\r\n\r\n\t\t\tvar u = 1 - diff / curve.getLength();\r\n\r\n\t\t\treturn curve.getPointAt( u );\r\n\r\n\t\t}\r\n\r\n\t\ti ++;\r\n\r\n\t}\r\n\r\n\treturn null;\r\n\r\n\t// loop where sum != 0, sum > d , sum+1 0 ) {\r\n\r\n\t\t\t\tlaste = points[ points.length - 1 ];\r\n\r\n\t\t\t\tcpx0 = laste.x;\r\n\t\t\t\tcpy0 = laste.y;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tlaste = this.actions[ i - 1 ].args;\r\n\r\n\t\t\t\tcpx0 = laste[ laste.length - 2 ];\r\n\t\t\t\tcpy0 = laste[ laste.length - 1 ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 1; j <= divisions; j ++ ) {\r\n\r\n\t\t\t\tvar t = j / divisions;\r\n\r\n\t\t\t\ttx = b2( t, cpx0, cpx1, cpx );\r\n\t\t\t\tty = b2( t, cpy0, cpy1, cpy );\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'bezierCurveTo':\r\n\r\n\t\t\tcpx = args[ 4 ];\r\n\t\t\tcpy = args[ 5 ];\r\n\r\n\t\t\tcpx1 = args[ 0 ];\r\n\t\t\tcpy1 = args[ 1 ];\r\n\r\n\t\t\tcpx2 = args[ 2 ];\r\n\t\t\tcpy2 = args[ 3 ];\r\n\r\n\t\t\tif ( points.length > 0 ) {\r\n\r\n\t\t\t\tlaste = points[ points.length - 1 ];\r\n\r\n\t\t\t\tcpx0 = laste.x;\r\n\t\t\t\tcpy0 = laste.y;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tlaste = this.actions[ i - 1 ].args;\r\n\r\n\t\t\t\tcpx0 = laste[ laste.length - 2 ];\r\n\t\t\t\tcpy0 = laste[ laste.length - 1 ];\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tfor ( var j = 1; j <= divisions; j ++ ) {\r\n\r\n\t\t\t\tvar t = j / divisions;\r\n\r\n\t\t\t\ttx = b3( t, cpx0, cpx1, cpx2, cpx );\r\n\t\t\t\tty = b3( t, cpy0, cpy1, cpy2, cpy );\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'splineThru':\r\n\r\n\t\t\tlaste = this.actions[ i - 1 ].args;\r\n\r\n\t\t\tvar last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] );\r\n\t\t\tvar spts = [ last ];\r\n\r\n\t\t\tvar n = divisions * args[ 0 ].length;\r\n\r\n\t\t\tspts = spts.concat( args[ 0 ] );\r\n\r\n\t\t\tvar spline = new THREE.SplineCurve( spts );\r\n\r\n\t\t\tfor ( var j = 1; j <= n; j ++ ) {\r\n\r\n\t\t\t\tpoints.push( spline.getPointAt( j / n ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'arc':\r\n\r\n\t\t\tvar aX = args[ 0 ], aY = args[ 1 ],\r\n\t\t\t\taRadius = args[ 2 ],\r\n\t\t\t\taStartAngle = args[ 3 ], aEndAngle = args[ 4 ],\r\n\t\t\t\taClockwise = !! args[ 5 ];\r\n\r\n\t\t\tvar deltaAngle = aEndAngle - aStartAngle;\r\n\t\t\tvar angle;\r\n\t\t\tvar tdivisions = divisions * 2;\r\n\r\n\t\t\tfor ( var j = 1; j <= tdivisions; j ++ ) {\r\n\r\n\t\t\t\tvar t = j / tdivisions;\r\n\r\n\t\t\t\tif ( ! aClockwise ) {\r\n\r\n\t\t\t\t\tt = 1 - t;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tangle = aStartAngle + t * deltaAngle;\r\n\r\n\t\t\t\ttx = aX + aRadius * Math.cos( angle );\r\n\t\t\t\tty = aY + aRadius * Math.sin( angle );\r\n\r\n\t\t\t\t//console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty);\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//console.log(points);\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'ellipse':\r\n\r\n\t\t\tvar aX = args[ 0 ], aY = args[ 1 ],\r\n\t\t\t\txRadius = args[ 2 ],\r\n\t\t\t\tyRadius = args[ 3 ],\r\n\t\t\t\taStartAngle = args[ 4 ], aEndAngle = args[ 5 ],\r\n\t\t\t\taClockwise = !! args[ 6 ],\r\n\t\t\t\taRotation = args[ 7 ];\r\n\r\n\r\n\t\t\tvar deltaAngle = aEndAngle - aStartAngle;\r\n\t\t\tvar angle;\r\n\t\t\tvar tdivisions = divisions * 2;\r\n\r\n\t\t\tvar cos, sin;\r\n\t\t\tif ( aRotation !== 0 ) {\r\n\r\n\t\t\t\tcos = Math.cos( aRotation );\r\n\t\t\t\tsin = Math.sin( aRotation );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 1; j <= tdivisions; j ++ ) {\r\n\r\n\t\t\t\tvar t = j / tdivisions;\r\n\r\n\t\t\t\tif ( ! aClockwise ) {\r\n\r\n\t\t\t\t\tt = 1 - t;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tangle = aStartAngle + t * deltaAngle;\r\n\r\n\t\t\t\ttx = aX + xRadius * Math.cos( angle );\r\n\t\t\t\tty = aY + yRadius * Math.sin( angle );\r\n\r\n\t\t\t\tif ( aRotation !== 0 ) {\r\n\r\n\t\t\t\t\tvar x = tx, y = ty;\r\n\r\n\t\t\t\t\t// Rotate the point about the center of the ellipse.\r\n\t\t\t\t\ttx = ( x - aX ) * cos - ( y - aY ) * sin + aX;\r\n\t\t\t\t\tty = ( x - aX ) * sin + ( y - aY ) * cos + aY;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty);\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//console.log(points);\r\n\r\n\t\t\tbreak;\r\n\r\n\t\t} // end switch\r\n\r\n\t}\r\n\r\n\r\n\r\n\t// Normalize to remove the closing point by default.\r\n\tvar lastPoint = points[ points.length - 1 ];\r\n\tif ( Math.abs( lastPoint.x - points[ 0 ].x ) < Number.EPSILON &&\r\n\t\t\t Math.abs( lastPoint.y - points[ 0 ].y ) < Number.EPSILON )\r\n\t\tpoints.splice( points.length - 1, 1 );\r\n\r\n\tif ( this.autoClose ) {\r\n\r\n\t\tpoints.push( points[ 0 ] );\r\n\r\n\t}\r\n\r\n\treturn points;\r\n\r\n};\r\n\r\n//\r\n// Breaks path into shapes\r\n//\r\n//\tAssumptions (if parameter isCCW==true the opposite holds):\r\n//\t- solid shapes are defined clockwise (CW)\r\n//\t- holes are defined counterclockwise (CCW)\r\n//\r\n//\tIf parameter noHoles==true:\r\n// - all subPaths are regarded as solid shapes\r\n// - definition order CW/CCW has no relevance\r\n//\r\n\r\nTHREE.Path.prototype.toShapes = function( isCCW, noHoles ) {\r\n\r\n\tfunction extractSubpaths( inActions ) {\r\n\r\n\t\tvar subPaths = [], lastPath = new THREE.Path();\r\n\r\n\t\tfor ( var i = 0, l = inActions.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar item = inActions[ i ];\r\n\r\n\t\t\tvar args = item.args;\r\n\t\t\tvar action = item.action;\r\n\r\n\t\t\tif ( action === 'moveTo' ) {\r\n\r\n\t\t\t\tif ( lastPath.actions.length !== 0 ) {\r\n\r\n\t\t\t\t\tsubPaths.push( lastPath );\r\n\t\t\t\t\tlastPath = new THREE.Path();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlastPath[ action ].apply( lastPath, args );\r\n\r\n\t\t}\r\n\r\n\t\tif ( lastPath.actions.length !== 0 ) {\r\n\r\n\t\t\tsubPaths.push( lastPath );\r\n\r\n\t\t}\r\n\r\n\t\t// console.log(subPaths);\r\n\r\n\t\treturn\tsubPaths;\r\n\r\n\t}\r\n\r\n\tfunction toShapesNoHoles( inSubpaths ) {\r\n\r\n\t\tvar shapes = [];\r\n\r\n\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar tmpPath = inSubpaths[ i ];\r\n\r\n\t\t\tvar tmpShape = new THREE.Shape();\r\n\t\t\ttmpShape.actions = tmpPath.actions;\r\n\t\t\ttmpShape.curves = tmpPath.curves;\r\n\r\n\t\t\tshapes.push( tmpShape );\r\n\r\n\t\t}\r\n\r\n\t\t//console.log(\"shape\", shapes);\r\n\r\n\t\treturn shapes;\r\n\r\n\t}\r\n\r\n\tfunction isPointInsidePolygon( inPt, inPolygon ) {\r\n\r\n\t\tvar polyLen = inPolygon.length;\r\n\r\n\t\t// inPt on polygon contour => immediate success or\r\n\t\t// toggling of inside/outside at every single! intersection point of an edge\r\n\t\t// with the horizontal line through inPt, left of inPt\r\n\t\t// not counting lowerY endpoints of edges and whole edges on that line\r\n\t\tvar inside = false;\r\n\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\r\n\r\n\t\t\tvar edgeLowPt = inPolygon[ p ];\r\n\t\t\tvar edgeHighPt = inPolygon[ q ];\r\n\r\n\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\r\n\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\r\n\r\n\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\r\n\r\n\t\t\t\t// not parallel\r\n\t\t\t\tif ( edgeDy < 0 ) {\r\n\r\n\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\r\n\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\r\n\r\n\t\t\t\t}\r\n\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\r\n\r\n\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\r\n\r\n\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\r\n\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\r\n\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\r\n\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\r\n\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// parallel or collinear\r\n\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\r\n\t\t\t\t// edge lies on the same horizontal line as inPt\r\n\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\r\n\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\r\n\t\t\t\t// continue;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn\tinside;\r\n\r\n\t}\r\n\r\n\tvar isClockWise = THREE.ShapeUtils.isClockWise;\r\n\r\n\tvar subPaths = extractSubpaths( this.actions );\r\n\tif ( subPaths.length === 0 ) return [];\r\n\r\n\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\r\n\r\n\r\n\tvar solid, tmpPath, tmpShape, shapes = [];\r\n\r\n\tif ( subPaths.length === 1 ) {\r\n\r\n\t\ttmpPath = subPaths[ 0 ];\r\n\t\ttmpShape = new THREE.Shape();\r\n\t\ttmpShape.actions = tmpPath.actions;\r\n\t\ttmpShape.curves = tmpPath.curves;\r\n\t\tshapes.push( tmpShape );\r\n\t\treturn shapes;\r\n\r\n\t}\r\n\r\n\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\r\n\tholesFirst = isCCW ? ! holesFirst : holesFirst;\r\n\r\n\t// console.log(\"Holes first\", holesFirst);\r\n\r\n\tvar betterShapeHoles = [];\r\n\tvar newShapes = [];\r\n\tvar newShapeHoles = [];\r\n\tvar mainIdx = 0;\r\n\tvar tmpPoints;\r\n\r\n\tnewShapes[ mainIdx ] = undefined;\r\n\tnewShapeHoles[ mainIdx ] = [];\r\n\r\n\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\r\n\r\n\t\ttmpPath = subPaths[ i ];\r\n\t\ttmpPoints = tmpPath.getPoints();\r\n\t\tsolid = isClockWise( tmpPoints );\r\n\t\tsolid = isCCW ? ! solid : solid;\r\n\r\n\t\tif ( solid ) {\r\n\r\n\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\r\n\r\n\t\t\tnewShapes[ mainIdx ] = { s: new THREE.Shape(), p: tmpPoints };\r\n\t\t\tnewShapes[ mainIdx ].s.actions = tmpPath.actions;\r\n\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\r\n\r\n\t\t\tif ( holesFirst )\tmainIdx ++;\r\n\t\t\tnewShapeHoles[ mainIdx ] = [];\r\n\r\n\t\t\t//console.log('cw', i);\r\n\r\n\t\t} else {\r\n\r\n\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\r\n\r\n\t\t\t//console.log('ccw', i);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// only Holes? -> probably all Shapes with wrong orientation\r\n\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\r\n\r\n\r\n\tif ( newShapes.length > 1 ) {\r\n\r\n\t\tvar ambiguous = false;\r\n\t\tvar toChange = [];\r\n\r\n\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\r\n\r\n\t\t\tbetterShapeHoles[ sIdx ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\r\n\r\n\t\t\tvar sho = newShapeHoles[ sIdx ];\r\n\r\n\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\r\n\r\n\t\t\t\tvar ho = sho[ hIdx ];\r\n\t\t\t\tvar hole_unassigned = true;\r\n\r\n\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\r\n\r\n\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\r\n\r\n\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\r\n\t\t\t\t\t\tif ( hole_unassigned ) {\r\n\r\n\t\t\t\t\t\t\thole_unassigned = false;\r\n\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tambiguous = true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t\tif ( hole_unassigned ) {\r\n\r\n\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\t// console.log(\"ambiguous: \", ambiguous);\r\n\t\tif ( toChange.length > 0 ) {\r\n\r\n\t\t\t// console.log(\"to change: \", toChange);\r\n\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tvar tmpHoles;\r\n\r\n\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\r\n\r\n\t\ttmpShape = newShapes[ i ].s;\r\n\t\tshapes.push( tmpShape );\r\n\t\ttmpHoles = newShapeHoles[ i ];\r\n\r\n\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\r\n\r\n\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t//console.log(\"shape\", shapes);\r\n\r\n\treturn shapes;\r\n\r\n};\r\n\r\n// File:src/extras/core/Shape.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * Defines a 2d shape plane using paths.\r\n **/\r\n\r\n// STEP 1 Create a path.\r\n// STEP 2 Turn path into shape.\r\n// STEP 3 ExtrudeGeometry takes in Shape/Shapes\r\n// STEP 3a - Extract points from each shape, turn to vertices\r\n// STEP 3b - Triangulate each shape, add faces.\r\n\r\nTHREE.Shape = function () {\r\n\r\n\tTHREE.Path.apply( this, arguments );\r\n\r\n\tthis.holes = [];\r\n\r\n};\r\n\r\nTHREE.Shape.prototype = Object.create( THREE.Path.prototype );\r\nTHREE.Shape.prototype.constructor = THREE.Shape;\r\n\r\n// Convenience method to return ExtrudeGeometry\r\n\r\nTHREE.Shape.prototype.extrude = function ( options ) {\r\n\r\n\treturn new THREE.ExtrudeGeometry( this, options );\r\n\r\n};\r\n\r\n// Convenience method to return ShapeGeometry\r\n\r\nTHREE.Shape.prototype.makeGeometry = function ( options ) {\r\n\r\n\treturn new THREE.ShapeGeometry( this, options );\r\n\r\n};\r\n\r\n// Get points of holes\r\n\r\nTHREE.Shape.prototype.getPointsHoles = function ( divisions ) {\r\n\r\n\tvar holesPts = [];\r\n\r\n\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\r\n\r\n\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\r\n\r\n\t}\r\n\r\n\treturn holesPts;\r\n\r\n};\r\n\r\n\r\n// Get points of shape and holes (keypoints based on segments parameter)\r\n\r\nTHREE.Shape.prototype.extractAllPoints = function ( divisions ) {\r\n\r\n\treturn {\r\n\r\n\t\tshape: this.getPoints( divisions ),\r\n\t\tholes: this.getPointsHoles( divisions )\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.Shape.prototype.extractPoints = function ( divisions ) {\r\n\r\n\treturn this.extractAllPoints( divisions );\r\n\r\n};\r\n\r\n// File:src/extras/curves/LineCurve.js\r\n\r\n/**************************************************************\r\n *\tLine\r\n **************************************************************/\r\n\r\nTHREE.LineCurve = function ( v1, v2 ) {\r\n\r\n\tthis.v1 = v1;\r\n\tthis.v2 = v2;\r\n\r\n};\r\n\r\nTHREE.LineCurve.prototype = Object.create( THREE.Curve.prototype );\r\nTHREE.LineCurve.prototype.constructor = THREE.LineCurve;\r\n\r\nTHREE.LineCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar point = this.v2.clone().sub( this.v1 );\r\n\tpoint.multiplyScalar( t ).add( this.v1 );\r\n\r\n\treturn point;\r\n\r\n};\r\n\r\n// Line curve is linear, so we can overwrite default getPointAt\r\n\r\nTHREE.LineCurve.prototype.getPointAt = function ( u ) {\r\n\r\n\treturn this.getPoint( u );\r\n\r\n};\r\n\r\nTHREE.LineCurve.prototype.getTangent = function( t ) {\r\n\r\n\tvar tangent = this.v2.clone().sub( this.v1 );\r\n\r\n\treturn tangent.normalize();\r\n\r\n};\r\n\r\n// File:src/extras/curves/QuadraticBezierCurve.js\r\n\r\n/**************************************************************\r\n *\tQuadratic Bezier curve\r\n **************************************************************/\r\n\r\n\r\nTHREE.QuadraticBezierCurve = function ( v0, v1, v2 ) {\r\n\r\n\tthis.v0 = v0;\r\n\tthis.v1 = v1;\r\n\tthis.v2 = v2;\r\n\r\n};\r\n\r\nTHREE.QuadraticBezierCurve.prototype = Object.create( THREE.Curve.prototype );\r\nTHREE.QuadraticBezierCurve.prototype.constructor = THREE.QuadraticBezierCurve;\r\n\r\n\r\nTHREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar b2 = THREE.ShapeUtils.b2;\r\n\r\n\treturn new THREE.Vector2(\r\n\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\r\n\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\r\n\t);\r\n\r\n};\r\n\r\n\r\nTHREE.QuadraticBezierCurve.prototype.getTangent = function( t ) {\r\n\r\n\tvar tangentQuadraticBezier = THREE.CurveUtils.tangentQuadraticBezier;\r\n\r\n\treturn new THREE.Vector2(\r\n\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\r\n\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\r\n\t).normalize();\r\n\r\n};\r\n\r\n// File:src/extras/curves/CubicBezierCurve.js\r\n\r\n/**************************************************************\r\n *\tCubic Bezier curve\r\n **************************************************************/\r\n\r\nTHREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) {\r\n\r\n\tthis.v0 = v0;\r\n\tthis.v1 = v1;\r\n\tthis.v2 = v2;\r\n\tthis.v3 = v3;\r\n\r\n};\r\n\r\nTHREE.CubicBezierCurve.prototype = Object.create( THREE.Curve.prototype );\r\nTHREE.CubicBezierCurve.prototype.constructor = THREE.CubicBezierCurve;\r\n\r\nTHREE.CubicBezierCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar b3 = THREE.ShapeUtils.b3;\r\n\r\n\treturn new THREE.Vector2( \r\n\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\r\n\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\r\n\t);\r\n\r\n};\r\n\r\nTHREE.CubicBezierCurve.prototype.getTangent = function( t ) {\r\n\r\n\tvar tangentCubicBezier = THREE.CurveUtils.tangentCubicBezier;\r\n\r\n\treturn new THREE.Vector2( \r\n\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\r\n\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\r\n\t).normalize();\r\n\r\n};\r\n\r\n// File:src/extras/curves/SplineCurve.js\r\n\r\n/**************************************************************\r\n *\tSpline curve\r\n **************************************************************/\r\n\r\nTHREE.SplineCurve = function ( points /* array of Vector2 */ ) {\r\n\r\n\tthis.points = ( points == undefined ) ? [] : points;\r\n\r\n};\r\n\r\nTHREE.SplineCurve.prototype = Object.create( THREE.Curve.prototype );\r\nTHREE.SplineCurve.prototype.constructor = THREE.SplineCurve;\r\n\r\nTHREE.SplineCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar points = this.points;\r\n\tvar point = ( points.length - 1 ) * t;\r\n\r\n\tvar intPoint = Math.floor( point );\r\n\tvar weight = point - intPoint;\r\n\r\n\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\r\n\tvar point1 = points[ intPoint ];\r\n\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\r\n\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\r\n\r\n\tvar interpolate = THREE.CurveUtils.interpolate;\r\n\r\n\treturn new THREE.Vector2(\r\n\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\r\n\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\r\n\t);\r\n\r\n};\r\n\r\n// File:src/extras/curves/EllipseCurve.js\r\n\r\n/**************************************************************\r\n *\tEllipse curve\r\n **************************************************************/\r\n\r\nTHREE.EllipseCurve = function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\r\n\r\n\tthis.aX = aX;\r\n\tthis.aY = aY;\r\n\r\n\tthis.xRadius = xRadius;\r\n\tthis.yRadius = yRadius;\r\n\r\n\tthis.aStartAngle = aStartAngle;\r\n\tthis.aEndAngle = aEndAngle;\r\n\r\n\tthis.aClockwise = aClockwise;\r\n\t\r\n\tthis.aRotation = aRotation || 0;\r\n\r\n};\r\n\r\nTHREE.EllipseCurve.prototype = Object.create( THREE.Curve.prototype );\r\nTHREE.EllipseCurve.prototype.constructor = THREE.EllipseCurve;\r\n\r\nTHREE.EllipseCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\r\n\r\n\tif ( deltaAngle < 0 ) deltaAngle += Math.PI * 2;\r\n\tif ( deltaAngle > Math.PI * 2 ) deltaAngle -= Math.PI * 2;\r\n\r\n\tvar angle;\r\n\r\n\tif ( this.aClockwise === true ) {\r\n\r\n\t\tangle = this.aEndAngle + ( 1 - t ) * ( Math.PI * 2 - deltaAngle );\r\n\r\n\t} else {\r\n\r\n\t\tangle = this.aStartAngle + t * deltaAngle;\r\n\r\n\t}\r\n\t\r\n\tvar x = this.aX + this.xRadius * Math.cos( angle );\r\n\tvar y = this.aY + this.yRadius * Math.sin( angle );\r\n\r\n\tif ( this.aRotation !== 0 ) {\r\n\r\n\t\tvar cos = Math.cos( this.aRotation );\r\n\t\tvar sin = Math.sin( this.aRotation );\r\n\r\n\t\tvar tx = x, ty = y;\r\n\r\n\t\t// Rotate the point about the center of the ellipse.\r\n\t\tx = ( tx - this.aX ) * cos - ( ty - this.aY ) * sin + this.aX;\r\n\t\ty = ( tx - this.aX ) * sin + ( ty - this.aY ) * cos + this.aY;\r\n\r\n\t}\r\n\r\n\treturn new THREE.Vector2( x, y );\r\n\r\n};\r\n\r\n// File:src/extras/curves/ArcCurve.js\r\n\r\n/**************************************************************\r\n *\tArc curve\r\n **************************************************************/\r\n\r\nTHREE.ArcCurve = function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\r\n\r\n\tTHREE.EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\r\n\r\n};\r\n\r\nTHREE.ArcCurve.prototype = Object.create( THREE.EllipseCurve.prototype );\r\nTHREE.ArcCurve.prototype.constructor = THREE.ArcCurve;\r\n\r\n// File:src/extras/curves/LineCurve3.js\r\n\r\n/**************************************************************\r\n *\tLine3D\r\n **************************************************************/\r\n\r\nTHREE.LineCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( v1, v2 ) {\r\n\r\n\t\tthis.v1 = v1;\r\n\t\tthis.v2 = v2;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar vector = new THREE.Vector3();\r\n\r\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\r\n\t\tvector.multiplyScalar( t );\r\n\t\tvector.add( this.v1 );\r\n\r\n\t\treturn vector;\r\n\r\n\t}\r\n\r\n);\r\n\r\n// File:src/extras/curves/QuadraticBezierCurve3.js\r\n\r\n/**************************************************************\r\n *\tQuadratic Bezier 3D curve\r\n **************************************************************/\r\n\r\nTHREE.QuadraticBezierCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( v0, v1, v2 ) {\r\n\r\n\t\tthis.v0 = v0;\r\n\t\tthis.v1 = v1;\r\n\t\tthis.v2 = v2;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar b2 = THREE.ShapeUtils.b2;\t\t\r\n\r\n\t\treturn new THREE.Vector3(\r\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\r\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\r\n\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\r\n\t\t);\r\n\r\n\t}\r\n\r\n);\r\n\r\n// File:src/extras/curves/CubicBezierCurve3.js\r\n\r\n/**************************************************************\r\n *\tCubic Bezier 3D curve\r\n **************************************************************/\r\n\r\nTHREE.CubicBezierCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( v0, v1, v2, v3 ) {\r\n\r\n\t\tthis.v0 = v0;\r\n\t\tthis.v1 = v1;\r\n\t\tthis.v2 = v2;\r\n\t\tthis.v3 = v3;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar b3 = THREE.ShapeUtils.b3;\r\n\r\n\t\treturn new THREE.Vector3(\r\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\r\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\r\n\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\r\n\t\t);\r\n\r\n\t}\r\n\r\n);\r\n\r\n// File:src/extras/curves/SplineCurve3.js\r\n\r\n/**************************************************************\r\n *\tSpline 3D curve\r\n **************************************************************/\r\n\r\n\r\nTHREE.SplineCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( points /* array of Vector3 */ ) {\r\n\r\n\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\r\n\t\tthis.points = ( points == undefined ) ? [] : points;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar points = this.points;\r\n\t\tvar point = ( points.length - 1 ) * t;\r\n\r\n\t\tvar intPoint = Math.floor( point );\r\n\t\tvar weight = point - intPoint;\r\n\r\n\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\r\n\t\tvar point1 = points[ intPoint ];\r\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\r\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\r\n\r\n\t\tvar interpolate = THREE.CurveUtils.interpolate;\r\n\r\n\t\treturn new THREE.Vector3(\r\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\r\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\r\n\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\r\n\t\t);\r\n\r\n\t}\r\n\r\n);\r\n\r\n// File:src/extras/curves/CatmullRomCurve3.js\r\n\r\n/**\r\n * @author zz85 https://github.com/zz85\r\n *\r\n * Centripetal CatmullRom Curve - which is useful for avoiding\r\n * cusps and self-intersections in non-uniform catmull rom curves.\r\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\r\n *\r\n * curve.type accepts centripetal(default), chordal and catmullrom\r\n * curve.tension is used for catmullrom which defaults to 0.5\r\n */\r\n\r\nTHREE.CatmullRomCurve3 = ( function() {\r\n\r\n\tvar\r\n\t\ttmp = new THREE.Vector3(),\r\n\t\tpx = new CubicPoly(),\r\n\t\tpy = new CubicPoly(),\r\n\t\tpz = new CubicPoly();\r\n\r\n\t/*\r\n\tBased on an optimized c++ solution in\r\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\r\n\t - http://ideone.com/NoEbVM\r\n\r\n\tThis CubicPoly class could be used for reusing some variables and calculations,\r\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\r\n\twhich can be placed in CurveUtils.\r\n\t*/\r\n\r\n\tfunction CubicPoly() {\r\n\r\n\t}\r\n\r\n\t/*\r\n\t * Compute coefficients for a cubic polynomial\r\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\r\n\t * such that\r\n\t * p(0) = x0, p(1) = x1\r\n\t * and\r\n\t * p'(0) = t0, p'(1) = t1.\r\n\t */\r\n\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\r\n\r\n\t\tthis.c0 = x0;\r\n\t\tthis.c1 = t0;\r\n\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\r\n\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\r\n\r\n\t};\r\n\r\n\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\r\n\r\n\t\t// compute tangents when parameterized in [t1,t2]\r\n\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\r\n\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\r\n\r\n\t\t// rescale tangents for parametrization in [0,1]\r\n\t\tt1 *= dt1;\r\n\t\tt2 *= dt1;\r\n\r\n\t\t// initCubicPoly\r\n\t\tthis.init( x1, x2, t1, t2 );\r\n\r\n\t};\r\n\r\n\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\r\n\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\r\n\r\n\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\r\n\r\n\t};\r\n\r\n\tCubicPoly.prototype.calc = function( t ) {\r\n\r\n\t\tvar t2 = t * t;\r\n\t\tvar t3 = t2 * t;\r\n\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\r\n\r\n\t};\r\n\r\n\t// Subclass Three.js curve\r\n\treturn THREE.Curve.create(\r\n\r\n\t\tfunction ( p /* array of Vector3 */ ) {\r\n\r\n\t\t\tthis.points = p || [];\r\n\t\t\tthis.closed = false;\r\n\r\n\t\t},\r\n\r\n\t\tfunction ( t ) {\r\n\r\n\t\t\tvar points = this.points,\r\n\t\t\t\tpoint, intPoint, weight, l;\r\n\r\n\t\t\tl = points.length;\r\n\r\n\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\r\n\r\n\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\r\n\t\t\tintPoint = Math.floor( point );\r\n\t\t\tweight = point - intPoint;\r\n\r\n\t\t\tif ( this.closed ) {\r\n\r\n\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\r\n\r\n\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\r\n\r\n\t\t\t\tintPoint = l - 2;\r\n\t\t\t\tweight = 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar p0, p1, p2, p3; // 4 points\r\n\r\n\t\t\tif ( this.closed || intPoint > 0 ) {\r\n\r\n\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// extrapolate first point\r\n\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\r\n\t\t\t\tp0 = tmp;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tp1 = points[ intPoint % l ];\r\n\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\r\n\r\n\t\t\tif ( this.closed || intPoint + 2 < l ) {\r\n\r\n\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// extrapolate last point\r\n\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\r\n\t\t\t\tp3 = tmp;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\r\n\r\n\t\t\t\t// init Centripetal / Chordal Catmull-Rom\r\n\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\r\n\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\r\n\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\r\n\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\r\n\r\n\t\t\t\t// safety check for repeated points\r\n\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\r\n\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\r\n\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\r\n\r\n\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\r\n\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\r\n\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\r\n\r\n\t\t\t} else if ( this.type === 'catmullrom' ) {\r\n\r\n\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\r\n\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\r\n\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\r\n\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar v = new THREE.Vector3(\r\n\t\t\t\tpx.calc( weight ),\r\n\t\t\t\tpy.calc( weight ),\r\n\t\t\t\tpz.calc( weight )\r\n\t\t\t);\r\n\r\n\t\t\treturn v;\r\n\r\n\t\t}\r\n\r\n\t);\r\n\r\n} )();\r\n\r\n// File:src/extras/curves/ClosedSplineCurve3.js\r\n\r\n/**************************************************************\r\n *\tClosed Spline 3D curve\r\n **************************************************************/\r\n\r\n\r\nTHREE.ClosedSplineCurve3 = function ( points ) {\r\n\r\n\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\r\n\r\n\tTHREE.CatmullRomCurve3.call( this, points );\r\n\tthis.type = 'catmullrom';\r\n\tthis.closed = true;\r\n\r\n};\r\n\r\nTHREE.ClosedSplineCurve3.prototype = Object.create( THREE.CatmullRomCurve3.prototype );\r\n\r\n// File:src/extras/geometries/BoxGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\r\n */\r\n\r\nTHREE.BoxGeometry = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'BoxGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\twidth: width,\r\n\t\theight: height,\r\n\t\tdepth: depth,\r\n\t\twidthSegments: widthSegments,\r\n\t\theightSegments: heightSegments,\r\n\t\tdepthSegments: depthSegments\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\r\n\tthis.mergeVertices();\r\n\r\n};\r\n\r\nTHREE.BoxGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.BoxGeometry.prototype.constructor = THREE.BoxGeometry;\r\n\r\nTHREE.CubeGeometry = THREE.BoxGeometry;\r\n\r\n// File:src/extras/geometries/BoxBufferGeometry.js\r\n\r\n/**\r\n * @author Mugen87 / https://github.com/Mugen87\r\n */\r\n\r\nTHREE.BoxBufferGeometry = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'BoxBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\twidth: width,\r\n\t\theight: height,\r\n\t\tdepth: depth,\r\n\t\twidthSegments: widthSegments,\r\n\t\theightSegments: heightSegments,\r\n\t\tdepthSegments: depthSegments\r\n\t};\r\n\r\n\tvar scope = this;\r\n\r\n\t// segments\r\n\twidthSegments = Math.floor( widthSegments ) || 1;\r\n\theightSegments = Math.floor( heightSegments ) || 1;\r\n\tdepthSegments = Math.floor( depthSegments ) || 1;\r\n\r\n\t// these are used to calculate buffer length\r\n\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\r\n\tvar indexCount = ( vertexCount / 4 ) * 6;\r\n\r\n\t// buffers\r\n\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\r\n\tvar vertices = new Float32Array( vertexCount * 3 );\r\n\tvar normals = new Float32Array( vertexCount * 3 );\r\n\tvar uvs = new Float32Array( vertexCount * 2 );\r\n\r\n\t// offset variables\r\n\tvar vertexBufferOffset = 0;\r\n\tvar uvBufferOffset = 0;\r\n\tvar indexBufferOffset = 0;\r\n\tvar numberOfVertices = 0;\r\n\r\n\t// group variables\r\n\tvar groupStart = 0;\r\n\r\n\t// build each side of the box geometry\r\n\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\r\n\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\r\n\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\r\n\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\r\n\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\r\n\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\r\n\r\n\t// build geometry\r\n\tthis.setIndex( new THREE.BufferAttribute( indices, 1 ) );\r\n\tthis.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\r\n\tthis.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\r\n\tthis.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\r\n\r\n\t// helper functions\r\n\r\n\tfunction calculateVertexCount ( w, h, d ) {\r\n\r\n\t\tvar segments = 0;\r\n\r\n\t\t// calculate the amount of segments for each side\r\n\t\tsegments += w * h * 2; // xy\r\n\t\tsegments += w * d * 2; // xz\r\n\t\tsegments += d * h * 2; // zy\r\n\r\n\t\treturn segments * 4; // four vertices per segments\r\n\r\n\t}\r\n\r\n\tfunction buildPlane ( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\r\n\r\n\t\tvar segmentWidth\t= width / gridX;\r\n\t\tvar segmentHeight = height / gridY;\r\n\r\n\t\tvar widthHalf = width / 2;\r\n\t\tvar heightHalf = height / 2;\r\n\t\tvar depthHalf = depth / 2;\r\n\r\n\t\tvar gridX1 = gridX + 1;\r\n\t\tvar gridY1 = gridY + 1;\r\n\r\n\t\tvar vertexCounter = 0;\r\n\t\tvar groupCount = 0;\r\n\r\n\t\tvar vector = new THREE.Vector3();\r\n\r\n\t\t// generate vertices, normals and uvs\r\n\r\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\r\n\r\n\t\t\tvar y = iy * segmentHeight - heightHalf;\r\n\r\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\r\n\r\n\t\t\t\tvar x = ix * segmentWidth - widthHalf;\r\n\r\n\t\t\t\t// set values to correct vector component\r\n\t\t\t\tvector[ u ] = x * udir;\r\n\t\t\t\tvector[ v ] = y * vdir;\r\n\t\t\t\tvector[ w ] = depthHalf;\r\n\r\n\t\t\t\t// now apply vector to vertex buffer\r\n\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\r\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\r\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\r\n\r\n\t\t\t\t// set values to correct vector component\r\n\t\t\t\tvector[ u ] = 0;\r\n\t\t\t\tvector[ v ] = 0;\r\n\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\r\n\r\n\t\t\t\t// now apply vector to normal buffer\r\n\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\r\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\r\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\r\n\r\n\t\t\t\t// uvs\r\n\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\r\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\r\n\r\n\t\t\t\t// update offsets and counters\r\n\t\t\t\tvertexBufferOffset += 3;\r\n\t\t\t\tuvBufferOffset += 2;\r\n\t\t\t\tvertexCounter += 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// 1. you need three indices to draw a single face\r\n\t\t// 2. a single segment consists of two faces\r\n\t\t// 3. so we need to generate six (2*3) indices per segment\r\n\r\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\r\n\r\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\r\n\r\n\t\t\t\t// indices\r\n\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\r\n\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\r\n\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\r\n\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\r\n\r\n\t\t\t\t// face one\r\n\t\t\t\tindices[ indexBufferOffset ] = a;\r\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\r\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\r\n\r\n\t\t\t\t// face two\r\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\r\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\r\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\r\n\r\n\t\t\t\t// update offsets and counters\r\n\t\t\t\tindexBufferOffset += 6;\r\n\t\t\t\tgroupCount += 6;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// add a group to the geometry. this will ensure multi material support\r\n\t\tscope.addGroup( groupStart, groupCount, materialIndex );\r\n\r\n\t\t// calculate new start value for groups\r\n\t\tgroupStart += groupCount;\r\n\r\n\t\t// update total number of vertices\r\n\t\tnumberOfVertices += vertexCounter;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.BoxBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.BoxBufferGeometry.prototype.constructor = THREE.BoxBufferGeometry;\r\n\r\n// File:src/extras/geometries/CircleGeometry.js\r\n\r\n/**\r\n * @author hughes\r\n */\r\n\r\nTHREE.CircleGeometry = function ( radius, segments, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'CircleGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\tsegments: segments,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\r\n\r\n};\r\n\r\nTHREE.CircleGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.CircleGeometry.prototype.constructor = THREE.CircleGeometry;\r\n\r\n// File:src/extras/geometries/CircleBufferGeometry.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n */\r\n\r\nTHREE.CircleBufferGeometry = function ( radius, segments, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'CircleBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\tsegments: segments,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tradius = radius || 50;\r\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\r\n\r\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\r\n\r\n\tvar vertices = segments + 2;\r\n\r\n\tvar positions = new Float32Array( vertices * 3 );\r\n\tvar normals = new Float32Array( vertices * 3 );\r\n\tvar uvs = new Float32Array( vertices * 2 );\r\n\r\n\t// center data is already zero, but need to set a few extras\r\n\tnormals[ 2 ] = 1.0;\r\n\tuvs[ 0 ] = 0.5;\r\n\tuvs[ 1 ] = 0.5;\r\n\r\n\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\r\n\r\n\t\tvar segment = thetaStart + s / segments * thetaLength;\r\n\r\n\t\tpositions[ i ] = radius * Math.cos( segment );\r\n\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\r\n\r\n\t\tnormals[ i + 2 ] = 1; // normal z\r\n\r\n\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\r\n\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\r\n\r\n\t}\r\n\r\n\tvar indices = [];\r\n\r\n\tfor ( var i = 1; i <= segments; i ++ ) {\r\n\r\n\t\tindices.push( i, i + 1, 0 );\r\n\r\n\t}\r\n\r\n\tthis.setIndex( new THREE.BufferAttribute( new Uint16Array( indices ), 1 ) );\r\n\tthis.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\r\n\tthis.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\r\n\tthis.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n};\r\n\r\nTHREE.CircleBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.CircleBufferGeometry.prototype.constructor = THREE.CircleBufferGeometry;\r\n\r\n// File:src/extras/geometries/CylinderBufferGeometry.js\r\n\r\n/**\r\n * @author Mugen87 / https://github.com/Mugen87\r\n */\r\n\r\nTHREE.CylinderBufferGeometry = function( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'CylinderBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradiusTop: radiusTop,\r\n\t\tradiusBottom: radiusBottom,\r\n\t\theight: height,\r\n\t\tradialSegments: radialSegments,\r\n\t\theightSegments: heightSegments,\r\n\t\topenEnded: openEnded,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tvar scope = this;\r\n\r\n\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\r\n\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\r\n\theight = height !== undefined ? height : 100;\r\n\r\n\tradialSegments = Math.floor( radialSegments ) || 8;\r\n\theightSegments = Math.floor( heightSegments ) || 1;\r\n\r\n\topenEnded = openEnded !== undefined ? openEnded : false;\r\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthetaLength = thetaLength !== undefined ? thetaLength : 2 * Math.PI;\r\n\r\n\t// used to calculate buffer length\r\n\r\n\tvar vertexCount = calculateVertexCount();\r\n\tvar indexCount = calculateIndexCount();\r\n\r\n\t// buffers\r\n\r\n\tvar indices = new THREE.BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\r\n\tvar vertices = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar normals = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\r\n\r\n\t// helper variables\r\n\r\n\tvar index = 0, indexOffset = 0, indexArray = [], halfHeight = height / 2;\r\n\r\n\t// group variables\r\n\tvar groupStart = 0;\r\n\r\n\t// generate geometry\r\n\r\n\tgenerateTorso();\r\n\r\n\tif ( openEnded === false ) {\r\n\r\n\t\tif ( radiusTop > 0 ) generateCap( true );\r\n\t\tif ( radiusBottom > 0 ) generateCap( false );\r\n\r\n\t}\r\n\r\n\t// build geometry\r\n\r\n\tthis.setIndex( indices );\r\n\tthis.addAttribute( 'position', vertices );\r\n\tthis.addAttribute( 'normal', normals );\r\n\tthis.addAttribute( 'uv', uvs );\r\n\r\n\t// helper functions\r\n\r\n\tfunction calculateVertexCount() {\r\n\r\n\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\r\n\r\n\t\tif ( openEnded === false ) {\r\n\r\n\t\t\tcount += ( ( radialSegments + 1 ) * 2 ) + ( radialSegments * 2 );\r\n\r\n\t\t}\r\n\r\n\t\treturn count;\r\n\r\n\t}\r\n\r\n\tfunction calculateIndexCount() {\r\n\r\n\t\tvar count = radialSegments * heightSegments * 2 * 3;\r\n\r\n\t\tif ( openEnded === false ) {\r\n\r\n\t\t\tcount += radialSegments * 2 * 3;\r\n\r\n\t\t}\r\n\r\n\t\treturn count;\r\n\r\n\t}\r\n\r\n\tfunction generateTorso() {\r\n\r\n\t\tvar x, y;\r\n\t\tvar normal = new THREE.Vector3();\r\n\t\tvar vertex = new THREE.Vector3();\r\n\r\n\t\tvar groupCount = 0;\r\n\r\n\t\t// this will be used to calculate the normal\r\n\t\tvar tanTheta = ( radiusBottom - radiusTop ) / height;\r\n\r\n\t\t// generate vertices, normals and uvs\r\n\r\n\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\r\n\r\n\t\t\tvar indexRow = [];\r\n\r\n\t\t\tvar v = y / heightSegments;\r\n\r\n\t\t\t// calculate the radius of the current row\r\n\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\r\n\r\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\r\n\r\n\t\t\t\tvar u = x / radialSegments;\r\n\r\n\t\t\t\t// vertex\r\n\t\t\t\tvertex.x = radius * Math.sin( u * thetaLength + thetaStart );\r\n\t\t\t\tvertex.y = - v * height + halfHeight;\r\n\t\t\t\tvertex.z = radius * Math.cos( u * thetaLength + thetaStart );\r\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\r\n\r\n\t\t\t\t// normal\r\n\t\t\t\tnormal.copy( vertex );\r\n\r\n\t\t\t\t// handle special case if radiusTop/radiusBottom is zero\r\n\t\t\t\tif ( ( radiusTop === 0 && y === 0 ) || ( radiusBottom === 0 && y === heightSegments ) ) {\r\n\r\n\t\t\t\t\tnormal.x = Math.sin( u * thetaLength + thetaStart );\r\n\t\t\t\t\tnormal.z = Math.cos( u * thetaLength + thetaStart );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnormal.setY( Math.sqrt( normal.x * normal.x + normal.z * normal.z ) * tanTheta ).normalize();\r\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\r\n\r\n\t\t\t\t// uv\r\n\t\t\t\tuvs.setXY( index, u, 1 - v );\r\n\r\n\t\t\t\t// save index of vertex in respective row\r\n\t\t\t\tindexRow.push( index );\r\n\r\n\t\t\t\t// increase index\r\n\t\t\t\tindex ++;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// now save vertices of the row in our index array\r\n\t\t\tindexArray.push( indexRow );\r\n\r\n\t\t}\r\n\r\n\t\t// generate indices\r\n\r\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\r\n\r\n\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\r\n\r\n\t\t\t\t// we use the index array to access the correct indices\r\n\t\t\t\tvar i1 = indexArray[ y ][ x ];\r\n\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\r\n\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\r\n\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\r\n\r\n\t\t\t\t// face one\r\n\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\r\n\r\n\t\t\t\t// face two\r\n\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\r\n\r\n\t\t\t\t// update counters\r\n\t\t\t\tgroupCount += 6;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// add a group to the geometry. this will ensure multi material support\r\n\t\tscope.addGroup( groupStart, groupCount, 0 );\r\n\r\n\t\t// calculate new start value for groups\r\n\t\tgroupStart += groupCount;\r\n\r\n\t}\r\n\r\n\tfunction generateCap( top ) {\r\n\r\n\t\tvar x, centerIndexStart, centerIndexEnd;\r\n\t\tvar uv = new THREE.Vector2();\r\n\t\tvar vertex = new THREE.Vector3();\r\n\r\n\t\tvar groupCount = 0;\r\n\r\n\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\r\n\t\tvar sign = ( top === true ) ? 1 : - 1;\r\n\r\n\t\t// save the index of the first center vertex\r\n\t\tcenterIndexStart = index;\r\n\r\n\t\t// first we generate the center vertex data of the cap.\r\n\t\t// because the geometry needs one set of uvs per face,\r\n\t\t// we must generate a center vertex per face/segment\r\n\r\n\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\r\n\r\n\t\t\t// vertex\r\n\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\r\n\r\n\t\t\t// normal\r\n\t\t\tnormals.setXYZ( index, 0, sign, 0 );\r\n\r\n\t\t\t// uv\r\n\t\t\tif ( top === true ) {\r\n\r\n\t\t\t\tuv.x = x / radialSegments;\r\n\t\t\t\tuv.y = 0;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tuv.x = ( x - 1 ) / radialSegments;\r\n\t\t\t\tuv.y = 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuvs.setXY( index, uv.x, uv.y );\r\n\r\n\t\t\t// increase index\r\n\t\t\tindex ++;\r\n\r\n\t\t}\r\n\r\n\t\t// save the index of the last center vertex\r\n\t\tcenterIndexEnd = index;\r\n\r\n\t\t// now we generate the surrounding vertices, normals and uvs\r\n\r\n\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\r\n\r\n\t\t\tvar u = x / radialSegments;\r\n\r\n\t\t\t// vertex\r\n\t\t\tvertex.x = radius * Math.sin( u * thetaLength + thetaStart );\r\n\t\t\tvertex.y = halfHeight * sign;\r\n\t\t\tvertex.z = radius * Math.cos( u * thetaLength + thetaStart );\r\n\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\r\n\r\n\t\t\t// normal\r\n\t\t\tnormals.setXYZ( index, 0, sign, 0 );\r\n\r\n\t\t\t// uv\r\n\t\t\tuvs.setXY( index, u, ( top === true ) ? 1 : 0 );\r\n\r\n\t\t\t// increase index\r\n\t\t\tindex ++;\r\n\r\n\t\t}\r\n\r\n\t\t// generate indices\r\n\r\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\r\n\r\n\t\t\tvar c = centerIndexStart + x;\r\n\t\t\tvar i = centerIndexEnd + x;\r\n\r\n\t\t\tif ( top === true ) {\r\n\r\n\t\t\t\t// face top\r\n\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// face bottom\r\n\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\r\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// update counters\r\n\t\t\tgroupCount += 3;\r\n\r\n\t\t}\r\n\r\n\t\t// add a group to the geometry. this will ensure multi material support\r\n\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\r\n\r\n\t\t// calculate new start value for groups\r\n\t\tgroupStart += groupCount;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.CylinderBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.CylinderBufferGeometry.prototype.constructor = THREE.CylinderBufferGeometry;\r\n\r\n// File:src/extras/geometries/CylinderGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'CylinderGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradiusTop: radiusTop,\r\n\t\tradiusBottom: radiusBottom,\r\n\t\theight: height,\r\n\t\tradialSegments: radialSegments,\r\n\t\theightSegments: heightSegments,\r\n\t\topenEnded: openEnded,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\r\n\tthis.mergeVertices();\r\n\r\n};\r\n\r\nTHREE.CylinderGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.CylinderGeometry.prototype.constructor = THREE.CylinderGeometry;\r\n\r\n// File:src/extras/geometries/EdgesGeometry.js\r\n\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.EdgesGeometry = function ( geometry, thresholdAngle ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\r\n\r\n\tvar thresholdDot = Math.cos( THREE.Math.DEG2RAD * thresholdAngle );\r\n\r\n\tvar edge = [ 0, 0 ], hash = {};\r\n\r\n\tfunction sortFunction( a, b ) {\r\n\r\n\t\treturn a - b;\r\n\r\n\t}\r\n\r\n\tvar keys = [ 'a', 'b', 'c' ];\r\n\r\n\tvar geometry2;\r\n\r\n\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\tgeometry2 = new THREE.Geometry();\r\n\t\tgeometry2.fromBufferGeometry( geometry );\r\n\r\n\t} else {\r\n\r\n\t\tgeometry2 = geometry.clone();\r\n\r\n\t}\r\n\r\n\tgeometry2.mergeVertices();\r\n\tgeometry2.computeFaceNormals();\r\n\r\n\tvar vertices = geometry2.vertices;\r\n\tvar faces = geometry2.faces;\r\n\r\n\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\tvar face = faces[ i ];\r\n\r\n\t\tfor ( var j = 0; j < 3; j ++ ) {\r\n\r\n\t\t\tedge[ 0 ] = face[ keys[ j ] ];\r\n\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\r\n\t\t\tedge.sort( sortFunction );\r\n\r\n\t\t\tvar key = edge.toString();\r\n\r\n\t\t\tif ( hash[ key ] === undefined ) {\r\n\r\n\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\thash[ key ].face2 = i;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tvar coords = [];\r\n\r\n\tfor ( var key in hash ) {\r\n\r\n\t\tvar h = hash[ key ];\r\n\r\n\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\r\n\r\n\t\t\tvar vertex = vertices[ h.vert1 ];\r\n\t\t\tcoords.push( vertex.x );\r\n\t\t\tcoords.push( vertex.y );\r\n\t\t\tcoords.push( vertex.z );\r\n\r\n\t\t\tvertex = vertices[ h.vert2 ];\r\n\t\t\tcoords.push( vertex.x );\r\n\t\t\tcoords.push( vertex.y );\r\n\t\t\tcoords.push( vertex.z );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( coords ), 3 ) );\r\n\r\n};\r\n\r\nTHREE.EdgesGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.EdgesGeometry.prototype.constructor = THREE.EdgesGeometry;\r\n\r\n// File:src/extras/geometries/ExtrudeGeometry.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n *\r\n * Creates extruded geometry from a path shape.\r\n *\r\n * parameters = {\r\n *\r\n * curveSegments: , // number of points on the curves\r\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\r\n * amount: , // Depth to extrude the shape\r\n *\r\n * bevelEnabled: , // turn on bevel\r\n * bevelThickness: , // how deep into the original shape bevel goes\r\n * bevelSize: , // how far from shape outline is bevel\r\n * bevelSegments: , // number of bevel layers\r\n *\r\n * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\r\n * frames: // containing arrays of tangents, normals, binormals\r\n *\r\n * uvGenerator: // object that provides UV generator functions\r\n *\r\n * }\r\n **/\r\n\r\nTHREE.ExtrudeGeometry = function ( shapes, options ) {\r\n\r\n\tif ( typeof( shapes ) === \"undefined\" ) {\r\n\r\n\t\tshapes = [];\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'ExtrudeGeometry';\r\n\r\n\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\r\n\r\n\tthis.addShapeList( shapes, options );\r\n\r\n\tthis.computeFaceNormals();\r\n\r\n\t// can't really use automatic vertex normals\r\n\t// as then front and back sides get smoothed too\r\n\t// should do separate smoothing just for sides\r\n\r\n\t//this.computeVertexNormals();\r\n\r\n\t//console.log( \"took\", ( Date.now() - startTime ) );\r\n\r\n};\r\n\r\nTHREE.ExtrudeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry;\r\n\r\nTHREE.ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\r\n\r\n\tvar sl = shapes.length;\r\n\r\n\tfor ( var s = 0; s < sl; s ++ ) {\r\n\r\n\t\tvar shape = shapes[ s ];\r\n\t\tthis.addShape( shape, options );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) {\r\n\r\n\tvar amount = options.amount !== undefined ? options.amount : 100;\r\n\r\n\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\r\n\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\r\n\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\r\n\r\n\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\r\n\r\n\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\r\n\r\n\tvar steps = options.steps !== undefined ? options.steps : 1;\r\n\r\n\tvar extrudePath = options.extrudePath;\r\n\tvar extrudePts, extrudeByPath = false;\r\n\r\n\t// Use default WorldUVGenerator if no UV generators are specified.\r\n\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator;\r\n\r\n\tvar splineTube, binormal, normal, position2;\r\n\tif ( extrudePath ) {\r\n\r\n\t\textrudePts = extrudePath.getSpacedPoints( steps );\r\n\r\n\t\textrudeByPath = true;\r\n\t\tbevelEnabled = false; // bevels not supported for path extrusion\r\n\r\n\t\t// SETUP TNB variables\r\n\r\n\t\t// Reuse TNB from TubeGeomtry for now.\r\n\t\t// TODO1 - have a .isClosed in spline?\r\n\r\n\t\tsplineTube = options.frames !== undefined ? options.frames : new THREE.TubeGeometry.FrenetFrames( extrudePath, steps, false );\r\n\r\n\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\r\n\r\n\t\tbinormal = new THREE.Vector3();\r\n\t\tnormal = new THREE.Vector3();\r\n\t\tposition2 = new THREE.Vector3();\r\n\r\n\t}\r\n\r\n\t// Safeguards if bevels are not enabled\r\n\r\n\tif ( ! bevelEnabled ) {\r\n\r\n\t\tbevelSegments = 0;\r\n\t\tbevelThickness = 0;\r\n\t\tbevelSize = 0;\r\n\r\n\t}\r\n\r\n\t// Variables initialization\r\n\r\n\tvar ahole, h, hl; // looping of holes\r\n\tvar scope = this;\r\n\r\n\tvar shapesOffset = this.vertices.length;\r\n\r\n\tvar shapePoints = shape.extractPoints( curveSegments );\r\n\r\n\tvar vertices = shapePoints.shape;\r\n\tvar holes = shapePoints.holes;\r\n\r\n\tvar reverse = ! THREE.ShapeUtils.isClockWise( vertices );\r\n\r\n\tif ( reverse ) {\r\n\r\n\t\tvertices = vertices.reverse();\r\n\r\n\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\r\n\t\t\tif ( THREE.ShapeUtils.isClockWise( ahole ) ) {\r\n\r\n\t\t\t\tholes[ h ] = ahole.reverse();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\r\n\r\n\t}\r\n\r\n\r\n\tvar faces = THREE.ShapeUtils.triangulateShape( vertices, holes );\r\n\r\n\t/* Vertices */\r\n\r\n\tvar contour = vertices; // vertices has all points but contour has only points of circumference\r\n\r\n\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\tahole = holes[ h ];\r\n\r\n\t\tvertices = vertices.concat( ahole );\r\n\r\n\t}\r\n\r\n\r\n\tfunction scalePt2 ( pt, vec, size ) {\r\n\r\n\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\r\n\r\n\t\treturn vec.clone().multiplyScalar( size ).add( pt );\r\n\r\n\t}\r\n\r\n\tvar b, bs, t, z,\r\n\t\tvert, vlen = vertices.length,\r\n\t\tface, flen = faces.length;\r\n\r\n\r\n\t// Find directions for point movement\r\n\r\n\r\n\tfunction getBevelVec( inPt, inPrev, inNext ) {\r\n\r\n\t\t// computes for inPt the corresponding point inPt' on a new contour\r\n\t\t// shifted by 1 unit (length of normalized vector) to the left\r\n\t\t// if we walk along contour clockwise, this new contour is outside the old one\r\n\t\t//\r\n\t\t// inPt' is the intersection of the two lines parallel to the two\r\n\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\r\n\r\n\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\r\n\r\n\t\t// good reading for geometry algorithms (here: line-line intersection)\r\n\t\t// http://geomalgorithms.com/a05-_intersect-1.html\r\n\r\n\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\r\n\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\r\n\r\n\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\r\n\r\n\t\t// check for collinear edges\r\n\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\r\n\r\n\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\r\n\r\n\t\t\t// not collinear\r\n\r\n\t\t\t// length of vectors for normalizing\r\n\r\n\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\r\n\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\r\n\r\n\t\t\t// shift adjacent points by unit vectors to the left\r\n\r\n\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\r\n\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\r\n\r\n\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\r\n\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\r\n\r\n\t\t\t// scaling factor for v_prev to intersection point\r\n\r\n\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\r\n\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\r\n\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\r\n\r\n\t\t\t// vector from inPt to intersection point\r\n\r\n\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\r\n\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\r\n\r\n\t\t\t// Don't normalize!, otherwise sharp corners become ugly\r\n\t\t\t// but prevent crazy spikes\r\n\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\r\n\t\t\tif ( v_trans_lensq <= 2 ) {\r\n\r\n\t\t\t\treturn\tnew THREE.Vector2( v_trans_x, v_trans_y );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// handle special case of collinear edges\r\n\r\n\t\t\tvar direction_eq = false;\t\t// assumes: opposite\r\n\t\t\tif ( v_prev_x > Number.EPSILON ) {\r\n\r\n\t\t\t\tif ( v_next_x > Number.EPSILON ) {\r\n\r\n\t\t\t\t\tdirection_eq = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\r\n\r\n\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\r\n\r\n\t\t\t\t\t\tdirection_eq = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\r\n\r\n\t\t\t\t\t\tdirection_eq = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( direction_eq ) {\r\n\r\n\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\r\n\t\t\t\tv_trans_x = - v_prev_y;\r\n\t\t\t\tv_trans_y = v_prev_x;\r\n\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\r\n\t\t\t\tv_trans_x = v_prev_x;\r\n\t\t\t\tv_trans_y = v_prev_y;\r\n\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn\tnew THREE.Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\r\n\r\n\t}\r\n\r\n\r\n\tvar contourMovements = [];\r\n\r\n\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\r\n\r\n\t\tif ( j === il ) j = 0;\r\n\t\tif ( k === il ) k = 0;\r\n\r\n\t\t// (j)---(i)---(k)\r\n\t\t// console.log('i,j,k', i, j , k)\r\n\r\n\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\r\n\r\n\t}\r\n\r\n\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\r\n\r\n\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\tahole = holes[ h ];\r\n\r\n\t\toneHoleMovements = [];\r\n\r\n\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\r\n\r\n\t\t\tif ( j === il ) j = 0;\r\n\t\t\tif ( k === il ) k = 0;\r\n\r\n\t\t\t// (j)---(i)---(k)\r\n\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\r\n\r\n\t\t}\r\n\r\n\t\tholesMovements.push( oneHoleMovements );\r\n\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\r\n\r\n\t}\r\n\r\n\r\n\t// Loop bevelSegments, 1 for the front, 1 for the back\r\n\r\n\tfor ( b = 0; b < bevelSegments; b ++ ) {\r\n\r\n\t\t//for ( b = bevelSegments; b > 0; b -- ) {\r\n\r\n\t\tt = b / bevelSegments;\r\n\t\tz = bevelThickness * ( 1 - t );\r\n\r\n\t\t//z = bevelThickness * t;\r\n\t\tbs = bevelSize * ( Math.sin ( t * Math.PI / 2 ) ); // curved\r\n\t\t//bs = bevelSize * t; // linear\r\n\r\n\t\t// contract shape\r\n\r\n\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\r\n\r\n\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\r\n\r\n\t\t\tv( vert.x, vert.y, - z );\r\n\r\n\t\t}\r\n\r\n\t\t// expand holes\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\t\t\toneHoleMovements = holesMovements[ h ];\r\n\r\n\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\r\n\r\n\t\t\t\tv( vert.x, vert.y, - z );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tbs = bevelSize;\r\n\r\n\t// Back facing vertices\r\n\r\n\tfor ( i = 0; i < vlen; i ++ ) {\r\n\r\n\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\r\n\r\n\t\tif ( ! extrudeByPath ) {\r\n\r\n\t\t\tv( vert.x, vert.y, 0 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\r\n\r\n\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\r\n\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\r\n\r\n\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\r\n\r\n\t\t\tv( position2.x, position2.y, position2.z );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Add stepped vertices...\r\n\t// Including front facing vertices\r\n\r\n\tvar s;\r\n\r\n\tfor ( s = 1; s <= steps; s ++ ) {\r\n\r\n\t\tfor ( i = 0; i < vlen; i ++ ) {\r\n\r\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\r\n\r\n\t\t\tif ( ! extrudeByPath ) {\r\n\r\n\t\t\t\tv( vert.x, vert.y, amount / steps * s );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\r\n\r\n\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\r\n\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\r\n\r\n\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\r\n\r\n\t\t\t\tv( position2.x, position2.y, position2.z );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// Add bevel segments planes\r\n\r\n\t//for ( b = 1; b <= bevelSegments; b ++ ) {\r\n\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\r\n\r\n\t\tt = b / bevelSegments;\r\n\t\tz = bevelThickness * ( 1 - t );\r\n\t\t//bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) );\r\n\t\tbs = bevelSize * Math.sin ( t * Math.PI / 2 );\r\n\r\n\t\t// contract shape\r\n\r\n\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\r\n\r\n\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\r\n\t\t\tv( vert.x, vert.y, amount + z );\r\n\r\n\t\t}\r\n\r\n\t\t// expand holes\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\t\t\toneHoleMovements = holesMovements[ h ];\r\n\r\n\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\r\n\r\n\t\t\t\tif ( ! extrudeByPath ) {\r\n\r\n\t\t\t\t\tv( vert.x, vert.y, amount + z );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/* Faces */\r\n\r\n\t// Top and bottom faces\r\n\r\n\tbuildLidFaces();\r\n\r\n\t// Sides faces\r\n\r\n\tbuildSideFaces();\r\n\r\n\r\n\t///// Internal functions\r\n\r\n\tfunction buildLidFaces() {\r\n\r\n\t\tif ( bevelEnabled ) {\r\n\r\n\t\t\tvar layer = 0; // steps + 1\r\n\t\t\tvar offset = vlen * layer;\r\n\r\n\t\t\t// Bottom faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlayer = steps + bevelSegments * 2;\r\n\t\t\toffset = vlen * layer;\r\n\r\n\t\t\t// Top faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// Bottom faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Top faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Create faces for the z-sides of the shape\r\n\r\n\tfunction buildSideFaces() {\r\n\r\n\t\tvar layeroffset = 0;\r\n\t\tsidewalls( contour, layeroffset );\r\n\t\tlayeroffset += contour.length;\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\t\t\tsidewalls( ahole, layeroffset );\r\n\r\n\t\t\t//, true\r\n\t\t\tlayeroffset += ahole.length;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction sidewalls( contour, layeroffset ) {\r\n\r\n\t\tvar j, k;\r\n\t\ti = contour.length;\r\n\r\n\t\twhile ( -- i >= 0 ) {\r\n\r\n\t\t\tj = i;\r\n\t\t\tk = i - 1;\r\n\t\t\tif ( k < 0 ) k = contour.length - 1;\r\n\r\n\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\r\n\r\n\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\r\n\r\n\t\t\tfor ( s = 0; s < sl; s ++ ) {\r\n\r\n\t\t\t\tvar slen1 = vlen * s;\r\n\t\t\t\tvar slen2 = vlen * ( s + 1 );\r\n\r\n\t\t\t\tvar a = layeroffset + j + slen1,\r\n\t\t\t\t\tb = layeroffset + k + slen1,\r\n\t\t\t\t\tc = layeroffset + k + slen2,\r\n\t\t\t\t\td = layeroffset + j + slen2;\r\n\r\n\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\tfunction v( x, y, z ) {\r\n\r\n\t\tscope.vertices.push( new THREE.Vector3( x, y, z ) );\r\n\r\n\t}\r\n\r\n\tfunction f3( a, b, c ) {\r\n\r\n\t\ta += shapesOffset;\r\n\t\tb += shapesOffset;\r\n\t\tc += shapesOffset;\r\n\r\n\t\tscope.faces.push( new THREE.Face3( a, b, c, null, null, 0 ) );\r\n\r\n\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\r\n\r\n\t\tscope.faceVertexUvs[ 0 ].push( uvs );\r\n\r\n\t}\r\n\r\n\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\r\n\r\n\t\ta += shapesOffset;\r\n\t\tb += shapesOffset;\r\n\t\tc += shapesOffset;\r\n\t\td += shapesOffset;\r\n\r\n\t\tscope.faces.push( new THREE.Face3( a, b, d, null, null, 1 ) );\r\n\t\tscope.faces.push( new THREE.Face3( b, c, d, null, null, 1 ) );\r\n\r\n\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\r\n\r\n\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\r\n\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ExtrudeGeometry.WorldUVGenerator = {\r\n\r\n\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\r\n\r\n\t\tvar vertices = geometry.vertices;\r\n\r\n\t\tvar a = vertices[ indexA ];\r\n\t\tvar b = vertices[ indexB ];\r\n\t\tvar c = vertices[ indexC ];\r\n\r\n\t\treturn [\r\n\t\t\tnew THREE.Vector2( a.x, a.y ),\r\n\t\t\tnew THREE.Vector2( b.x, b.y ),\r\n\t\t\tnew THREE.Vector2( c.x, c.y )\r\n\t\t];\r\n\r\n\t},\r\n\r\n\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\r\n\r\n\t\tvar vertices = geometry.vertices;\r\n\r\n\t\tvar a = vertices[ indexA ];\r\n\t\tvar b = vertices[ indexB ];\r\n\t\tvar c = vertices[ indexC ];\r\n\t\tvar d = vertices[ indexD ];\r\n\r\n\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\r\n\r\n\t\t\treturn [\r\n\t\t\t\tnew THREE.Vector2( a.x, 1 - a.z ),\r\n\t\t\t\tnew THREE.Vector2( b.x, 1 - b.z ),\r\n\t\t\t\tnew THREE.Vector2( c.x, 1 - c.z ),\r\n\t\t\t\tnew THREE.Vector2( d.x, 1 - d.z )\r\n\t\t\t];\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn [\r\n\t\t\t\tnew THREE.Vector2( a.y, 1 - a.z ),\r\n\t\t\t\tnew THREE.Vector2( b.y, 1 - b.z ),\r\n\t\t\t\tnew THREE.Vector2( c.y, 1 - c.z ),\r\n\t\t\t\tnew THREE.Vector2( d.y, 1 - d.z )\r\n\t\t\t];\r\n\r\n\t\t}\r\n\r\n\t}\r\n};\r\n\r\n// File:src/extras/geometries/ShapeGeometry.js\r\n\r\n/**\r\n * @author jonobr1 / http://jonobr1.com\r\n *\r\n * Creates a one-sided polygonal geometry from a path shape. Similar to\r\n * ExtrudeGeometry.\r\n *\r\n * parameters = {\r\n *\r\n *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\r\n *\r\n *\tmaterial: // material index for front and back faces\r\n *\tuvGenerator: // object that provides UV generator functions\r\n *\r\n * }\r\n **/\r\n\r\nTHREE.ShapeGeometry = function ( shapes, options ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'ShapeGeometry';\r\n\r\n\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\r\n\r\n\tthis.addShapeList( shapes, options );\r\n\r\n\tthis.computeFaceNormals();\r\n\r\n};\r\n\r\nTHREE.ShapeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.ShapeGeometry.prototype.constructor = THREE.ShapeGeometry;\r\n\r\n/**\r\n * Add an array of shapes to THREE.ShapeGeometry.\r\n */\r\nTHREE.ShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\r\n\r\n\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\r\n\r\n\t\tthis.addShape( shapes[ i ], options );\r\n\r\n\t}\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n/**\r\n * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\r\n */\r\nTHREE.ShapeGeometry.prototype.addShape = function ( shape, options ) {\r\n\r\n\tif ( options === undefined ) options = {};\r\n\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\r\n\r\n\tvar material = options.material;\r\n\tvar uvgen = options.UVGenerator === undefined ? THREE.ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\r\n\r\n\t//\r\n\r\n\tvar i, l, hole;\r\n\r\n\tvar shapesOffset = this.vertices.length;\r\n\tvar shapePoints = shape.extractPoints( curveSegments );\r\n\r\n\tvar vertices = shapePoints.shape;\r\n\tvar holes = shapePoints.holes;\r\n\r\n\tvar reverse = ! THREE.ShapeUtils.isClockWise( vertices );\r\n\r\n\tif ( reverse ) {\r\n\r\n\t\tvertices = vertices.reverse();\r\n\r\n\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\r\n\r\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\r\n\r\n\t\t\thole = holes[ i ];\r\n\r\n\t\t\tif ( THREE.ShapeUtils.isClockWise( hole ) ) {\r\n\r\n\t\t\t\tholes[ i ] = hole.reverse();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treverse = false;\r\n\r\n\t}\r\n\r\n\tvar faces = THREE.ShapeUtils.triangulateShape( vertices, holes );\r\n\r\n\t// Vertices\r\n\r\n\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\r\n\r\n\t\thole = holes[ i ];\r\n\t\tvertices = vertices.concat( hole );\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tvar vert, vlen = vertices.length;\r\n\tvar face, flen = faces.length;\r\n\r\n\tfor ( i = 0; i < vlen; i ++ ) {\r\n\r\n\t\tvert = vertices[ i ];\r\n\r\n\t\tthis.vertices.push( new THREE.Vector3( vert.x, vert.y, 0 ) );\r\n\r\n\t}\r\n\r\n\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\tface = faces[ i ];\r\n\r\n\t\tvar a = face[ 0 ] + shapesOffset;\r\n\t\tvar b = face[ 1 ] + shapesOffset;\r\n\t\tvar c = face[ 2 ] + shapesOffset;\r\n\r\n\t\tthis.faces.push( new THREE.Face3( a, b, c, null, null, material ) );\r\n\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/extras/geometries/LatheBufferGeometry.js\r\n\r\n/**\r\n * @author Mugen87 / https://github.com/Mugen87\r\n */\r\n\r\n // points - to create a closed torus, one must use a set of points\r\n // like so: [ a, b, c, d, a ], see first is the same as last.\r\n // segments - the number of circumference segments to create\r\n // phiStart - the starting radian\r\n // phiLength - the radian (0 to 2PI) range of the lathed section\r\n // 2PI is a closed lathe, less than 2PI is a portion.\r\n\r\nTHREE.LatheBufferGeometry = function ( points, segments, phiStart, phiLength ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'LatheBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tpoints: points,\r\n\t\tsegments: segments,\r\n\t\tphiStart: phiStart,\r\n\t\tphiLength: phiLength\r\n\t};\r\n\r\n\tsegments = Math.floor( segments ) || 12;\r\n\tphiStart = phiStart || 0;\r\n\tphiLength = phiLength || Math.PI * 2;\r\n\r\n\t// clamp phiLength so it's in range of [ 0, 2PI ]\r\n\tphiLength = THREE.Math.clamp( phiLength, 0, Math.PI * 2 );\r\n\r\n\t// these are used to calculate buffer length\r\n\tvar vertexCount = ( segments + 1 ) * points.length;\r\n\tvar indexCount = segments * points.length * 2 * 3;\r\n\r\n\t// buffers\r\n\tvar indices = new THREE.BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\r\n\tvar vertices = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\r\n\r\n\t// helper variables\r\n\tvar index = 0, indexOffset = 0, base;\r\n\tvar inversePointLength = 1.0 / ( points.length - 1 );\r\n\tvar inverseSegments = 1.0 / segments;\r\n\tvar vertex = new THREE.Vector3();\r\n\tvar uv = new THREE.Vector2();\r\n\tvar i, j;\r\n\r\n\t// generate vertices and uvs\r\n\r\n\tfor ( i = 0; i <= segments; i ++ ) {\r\n\r\n\t\tvar phi = phiStart + i * inverseSegments * phiLength;\r\n\r\n\t\tvar sin = Math.sin( phi );\r\n\t\tvar cos = Math.cos( phi );\r\n\r\n\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\r\n\r\n\t\t\t// vertex\r\n\t\t\tvertex.x = points[ j ].x * sin;\r\n\t\t\tvertex.y = points[ j ].y;\r\n\t\t\tvertex.z = points[ j ].x * cos;\r\n\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\r\n\r\n\t\t\t// uv\r\n\t\t\tuv.x = i / segments;\r\n\t\t\tuv.y = j / ( points.length - 1 );\r\n\t\t\tuvs.setXY( index, uv.x, uv.y );\r\n\r\n\t\t\t// increase index\r\n\t\t\tindex ++;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// generate indices\r\n\r\n\tfor ( i = 0; i < segments; i ++ ) {\r\n\r\n\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\r\n\r\n\t\t\tbase = j + i * points.length;\r\n\r\n\t\t\t// indices\r\n\t\t\tvar a = base;\r\n\t\t\tvar b = base + points.length;\r\n\t\t\tvar c = base + points.length + 1;\r\n\t\t\tvar d = base + 1;\r\n\r\n\t\t\t// face one\r\n\t\t\tindices.setX( indexOffset, a ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, b ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, d ); indexOffset++;\r\n\r\n\t\t\t// face two\r\n\t\t\tindices.setX( indexOffset, b ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, c ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, d ); indexOffset++;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// build geometry\r\n\r\n\tthis.setIndex( indices );\r\n\tthis.addAttribute( 'position', vertices );\r\n\tthis.addAttribute( 'uv', uvs );\r\n\r\n\t// generate normals\r\n\r\n\tthis.computeVertexNormals();\r\n\r\n\t// if the geometry is closed, we need to average the normals along the seam.\r\n\t// because the corresponding vertices are identical (but still have different UVs).\r\n\r\n\tif( phiLength === Math.PI * 2 ) {\r\n\r\n\t\tvar normals = this.attributes.normal.array;\r\n\t\tvar n1 = new THREE.Vector3();\r\n\t\tvar n2 = new THREE.Vector3();\r\n\t\tvar n = new THREE.Vector3();\r\n\r\n\t\t// this is the buffer offset for the last line of vertices\r\n\t\tbase = segments * points.length * 3;\r\n\r\n\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\r\n\r\n\t\t\t// select the normal of the vertex in the first line\r\n\t\t\tn1.x = normals[ j + 0 ];\r\n\t\t\tn1.y = normals[ j + 1 ];\r\n\t\t\tn1.z = normals[ j + 2 ];\r\n\r\n\t\t\t// select the normal of the vertex in the last line\r\n\t\t\tn2.x = normals[ base + j + 0 ];\r\n\t\t\tn2.y = normals[ base + j + 1 ];\r\n\t\t\tn2.z = normals[ base + j + 2 ];\r\n\r\n\t\t\t// average normals\r\n\t\t\tn.addVectors( n1, n2 ).normalize();\r\n\r\n\t\t\t// assign the new values to both normals\r\n\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\r\n\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\r\n\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\r\n\r\n\t\t} // next row\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.LatheBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.LatheBufferGeometry.prototype.constructor = THREE.LatheBufferGeometry;\r\n\r\n// File:src/extras/geometries/LatheGeometry.js\r\n\r\n/**\r\n * @author astrodud / http://astrodud.isgreat.org/\r\n * @author zz85 / https://github.com/zz85\r\n * @author bhouston / http://clara.io\r\n */\r\n\r\n// points - to create a closed torus, one must use a set of points\r\n// like so: [ a, b, c, d, a ], see first is the same as last.\r\n// segments - the number of circumference segments to create\r\n// phiStart - the starting radian\r\n// phiLength - the radian (0 to 2PI) range of the lathed section\r\n// 2PI is a closed lathe, less than 2PI is a portion.\r\n\r\nTHREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'LatheGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tpoints: points,\r\n\t\tsegments: segments,\r\n\t\tphiStart: phiStart,\r\n\t\tphiLength: phiLength\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.LatheBufferGeometry( points, segments, phiStart, phiLength ) );\r\n\tthis.mergeVertices();\r\n\r\n};\r\n\r\nTHREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.LatheGeometry.prototype.constructor = THREE.LatheGeometry;\r\n\r\n// File:src/extras/geometries/PlaneGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\r\n */\r\n\r\nTHREE.PlaneGeometry = function ( width, height, widthSegments, heightSegments ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'PlaneGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\twidth: width,\r\n\t\theight: height,\r\n\t\twidthSegments: widthSegments,\r\n\t\theightSegments: heightSegments\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\r\n\r\n};\r\n\r\nTHREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.PlaneGeometry.prototype.constructor = THREE.PlaneGeometry;\r\n\r\n// File:src/extras/geometries/PlaneBufferGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\r\n */\r\n\r\nTHREE.PlaneBufferGeometry = function ( width, height, widthSegments, heightSegments ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'PlaneBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\twidth: width,\r\n\t\theight: height,\r\n\t\twidthSegments: widthSegments,\r\n\t\theightSegments: heightSegments\r\n\t};\r\n\r\n\tvar width_half = width / 2;\r\n\tvar height_half = height / 2;\r\n\r\n\tvar gridX = Math.floor( widthSegments ) || 1;\r\n\tvar gridY = Math.floor( heightSegments ) || 1;\r\n\r\n\tvar gridX1 = gridX + 1;\r\n\tvar gridY1 = gridY + 1;\r\n\r\n\tvar segment_width = width / gridX;\r\n\tvar segment_height = height / gridY;\r\n\r\n\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\r\n\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\r\n\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\r\n\r\n\tvar offset = 0;\r\n\tvar offset2 = 0;\r\n\r\n\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\r\n\r\n\t\tvar y = iy * segment_height - height_half;\r\n\r\n\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\r\n\r\n\t\t\tvar x = ix * segment_width - width_half;\r\n\r\n\t\t\tvertices[ offset ] = x;\r\n\t\t\tvertices[ offset + 1 ] = - y;\r\n\r\n\t\t\tnormals[ offset + 2 ] = 1;\r\n\r\n\t\t\tuvs[ offset2 ] = ix / gridX;\r\n\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\r\n\r\n\t\t\toffset += 3;\r\n\t\t\toffset2 += 2;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\toffset = 0;\r\n\r\n\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\r\n\r\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\r\n\r\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\r\n\r\n\t\t\tvar a = ix + gridX1 * iy;\r\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\r\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\r\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\r\n\r\n\t\t\tindices[ offset ] = a;\r\n\t\t\tindices[ offset + 1 ] = b;\r\n\t\t\tindices[ offset + 2 ] = d;\r\n\r\n\t\t\tindices[ offset + 3 ] = b;\r\n\t\t\tindices[ offset + 4 ] = c;\r\n\t\t\tindices[ offset + 5 ] = d;\r\n\r\n\t\t\toffset += 6;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.setIndex( new THREE.BufferAttribute( indices, 1 ) );\r\n\tthis.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\r\n\tthis.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\r\n\tthis.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\r\n\r\n};\r\n\r\nTHREE.PlaneBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.PlaneBufferGeometry.prototype.constructor = THREE.PlaneBufferGeometry;\r\n\r\n// File:src/extras/geometries/RingBufferGeometry.js\r\n\r\n/**\r\n * @author Mugen87 / https://github.com/Mugen87\r\n */\r\n\r\nTHREE.RingBufferGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'RingBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tinnerRadius: innerRadius,\r\n\t\touterRadius: outerRadius,\r\n\t\tthetaSegments: thetaSegments,\r\n\t\tphiSegments: phiSegments,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tinnerRadius = innerRadius || 20;\r\n\touterRadius = outerRadius || 50;\r\n\r\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\r\n\r\n\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\r\n\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\r\n\r\n\t// these are used to calculate buffer length\r\n\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\r\n\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\r\n\r\n\t// buffers\r\n\tvar indices = new THREE.BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\r\n\tvar vertices = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar normals = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\r\n\r\n\t// some helper variables\r\n\tvar index = 0, indexOffset = 0, segment;\r\n\tvar radius = innerRadius;\r\n\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\r\n\tvar vertex = new THREE.Vector3();\r\n\tvar uv = new THREE.Vector2();\r\n\tvar j, i;\r\n\r\n\t// generate vertices, normals and uvs\r\n\r\n\t// values are generate from the inside of the ring to the outside\r\n\r\n\tfor ( j = 0; j <= phiSegments; j ++ ) {\r\n\r\n\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\r\n\r\n\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\r\n\r\n\t\t\t// vertex\r\n\t\t\tvertex.x = radius * Math.cos( segment );\r\n\t\t\tvertex.y = radius * Math.sin( segment );\r\n\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\r\n\r\n\t\t\t// normal\r\n\t\t\tnormals.setXYZ( index, 0, 0, 1 );\r\n\r\n\t\t\t// uv\r\n\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\r\n\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\r\n\t\t\tuvs.setXY( index, uv.x, uv.y );\r\n\r\n\t\t\t// increase index\r\n\t\t\tindex++;\r\n\r\n\t\t}\r\n\r\n\t\t// increase the radius for next row of vertices\r\n\t\tradius += radiusStep;\r\n\r\n\t}\r\n\r\n\t// generate indices\r\n\r\n\tfor ( j = 0; j < phiSegments; j ++ ) {\r\n\r\n\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\r\n\r\n\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\r\n\r\n\t\t\tsegment = i + thetaSegmentLevel;\r\n\r\n\t\t\t// indices\r\n\t\t\tvar a = segment;\r\n\t\t\tvar b = segment + thetaSegments + 1;\r\n\t\t\tvar c = segment + thetaSegments + 2;\r\n\t\t\tvar d = segment + 1;\r\n\r\n\t\t\t// face one\r\n\t\t\tindices.setX( indexOffset, a ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, b ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, c ); indexOffset++;\r\n\r\n\t\t\t// face two\r\n\t\t\tindices.setX( indexOffset, a ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, c ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, d ); indexOffset++;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// build geometry\r\n\r\n\tthis.setIndex( indices );\r\n\tthis.addAttribute( 'position', vertices );\r\n\tthis.addAttribute( 'normal', normals );\r\n\tthis.addAttribute( 'uv', uvs );\r\n\r\n};\r\n\r\nTHREE.RingBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.RingBufferGeometry.prototype.constructor = THREE.RingBufferGeometry;\r\n\r\n// File:src/extras/geometries/RingGeometry.js\r\n\r\n/**\r\n * @author Kaleb Murphy\r\n */\r\n\r\nTHREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'RingGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tinnerRadius: innerRadius,\r\n\t\touterRadius: outerRadius,\r\n\t\tthetaSegments: thetaSegments,\r\n\t\tphiSegments: phiSegments,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\r\n\r\n};\r\n\r\nTHREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.RingGeometry.prototype.constructor = THREE.RingGeometry;\r\n\r\n// File:src/extras/geometries/SphereGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.SphereGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'SphereGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\twidthSegments: widthSegments,\r\n\t\theightSegments: heightSegments,\r\n\t\tphiStart: phiStart,\r\n\t\tphiLength: phiLength,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\r\n\r\n};\r\n\r\nTHREE.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.SphereGeometry.prototype.constructor = THREE.SphereGeometry;\r\n\r\n// File:src/extras/geometries/SphereBufferGeometry.js\r\n\r\n/**\r\n * @author benaadams / https://twitter.com/ben_a_adams\r\n * based on THREE.SphereGeometry\r\n */\r\n\r\nTHREE.SphereBufferGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'SphereBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\twidthSegments: widthSegments,\r\n\t\theightSegments: heightSegments,\r\n\t\tphiStart: phiStart,\r\n\t\tphiLength: phiLength,\r\n\t\tthetaStart: thetaStart,\r\n\t\tthetaLength: thetaLength\r\n\t};\r\n\r\n\tradius = radius || 50;\r\n\r\n\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\r\n\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\r\n\r\n\tphiStart = phiStart !== undefined ? phiStart : 0;\r\n\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\r\n\r\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\r\n\r\n\tvar thetaEnd = thetaStart + thetaLength;\r\n\r\n\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\r\n\r\n\tvar positions = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar normals = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\r\n\r\n\tvar index = 0, vertices = [], normal = new THREE.Vector3();\r\n\r\n\tfor ( var y = 0; y <= heightSegments; y ++ ) {\r\n\r\n\t\tvar verticesRow = [];\r\n\r\n\t\tvar v = y / heightSegments;\r\n\r\n\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\r\n\r\n\t\t\tvar u = x / widthSegments;\r\n\r\n\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\r\n\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\r\n\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\r\n\r\n\t\t\tnormal.set( px, py, pz ).normalize();\r\n\r\n\t\t\tpositions.setXYZ( index, px, py, pz );\r\n\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\r\n\t\t\tuvs.setXY( index, u, 1 - v );\r\n\r\n\t\t\tverticesRow.push( index );\r\n\r\n\t\t\tindex ++;\r\n\r\n\t\t}\r\n\r\n\t\tvertices.push( verticesRow );\r\n\r\n\t}\r\n\r\n\tvar indices = [];\r\n\r\n\tfor ( var y = 0; y < heightSegments; y ++ ) {\r\n\r\n\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\r\n\r\n\t\t\tvar v1 = vertices[ y ][ x + 1 ];\r\n\t\t\tvar v2 = vertices[ y ][ x ];\r\n\t\t\tvar v3 = vertices[ y + 1 ][ x ];\r\n\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\r\n\r\n\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\r\n\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.setIndex( new ( positions.count > 65535 ? THREE.Uint32Attribute : THREE.Uint16Attribute )( indices, 1 ) );\r\n\tthis.addAttribute( 'position', positions );\r\n\tthis.addAttribute( 'normal', normals );\r\n\tthis.addAttribute( 'uv', uvs );\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n};\r\n\r\nTHREE.SphereBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.SphereBufferGeometry.prototype.constructor = THREE.SphereBufferGeometry;\r\n\r\n// File:src/extras/geometries/TextGeometry.js\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * Text = 3D Text\r\n *\r\n * parameters = {\r\n * font: , // font\r\n *\r\n * size: , // size of the text\r\n * height: , // thickness to extrude text\r\n * curveSegments: , // number of points on the curves\r\n *\r\n * bevelEnabled: , // turn on bevel\r\n * bevelThickness: , // how deep into text bevel goes\r\n * bevelSize: // how far from text outline is bevel\r\n * }\r\n */\r\n\r\nTHREE.TextGeometry = function ( text, parameters ) {\r\n\r\n\tparameters = parameters || {};\r\n\r\n\tvar font = parameters.font;\r\n\r\n\tif ( font instanceof THREE.Font === false ) {\r\n\r\n\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\r\n\t\treturn new THREE.Geometry();\r\n\r\n\t}\r\n\r\n\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\r\n\r\n\t// translate parameters to ExtrudeGeometry API\r\n\r\n\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\r\n\r\n\t// defaults\r\n\r\n\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\r\n\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\r\n\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\r\n\r\n\tTHREE.ExtrudeGeometry.call( this, shapes, parameters );\r\n\r\n\tthis.type = 'TextGeometry';\r\n\r\n};\r\n\r\nTHREE.TextGeometry.prototype = Object.create( THREE.ExtrudeGeometry.prototype );\r\nTHREE.TextGeometry.prototype.constructor = THREE.TextGeometry;\r\n\r\n// File:src/extras/geometries/TorusBufferGeometry.js\r\n\r\n/**\r\n * @author Mugen87 / https://github.com/Mugen87\r\n */\r\n\r\nTHREE.TorusBufferGeometry = function ( radius, tube, radialSegments, tubularSegments, arc ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'TorusBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\ttube: tube,\r\n\t\tradialSegments: radialSegments,\r\n\t\ttubularSegments: tubularSegments,\r\n\t\tarc: arc\r\n\t};\r\n\r\n\tradius = radius || 100;\r\n\ttube = tube || 40;\r\n\tradialSegments = Math.floor( radialSegments ) || 8;\r\n\ttubularSegments = Math.floor( tubularSegments ) || 6;\r\n\tarc = arc || Math.PI * 2;\r\n\r\n\t// used to calculate buffer length\r\n\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\r\n\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\r\n\r\n\t// buffers\r\n\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\r\n\tvar vertices = new Float32Array( vertexCount * 3 );\r\n\tvar normals = new Float32Array( vertexCount * 3 );\r\n\tvar uvs = new Float32Array( vertexCount * 2 );\r\n\r\n\t// offset variables\r\n\tvar vertexBufferOffset = 0;\r\n\tvar uvBufferOffset = 0;\r\n\tvar indexBufferOffset = 0;\r\n\r\n\t// helper variables\r\n\tvar center = new THREE.Vector3();\r\n\tvar vertex = new THREE.Vector3();\r\n\tvar normal = new THREE.Vector3();\r\n\r\n\tvar j, i;\r\n\r\n\t// generate vertices, normals and uvs\r\n\r\n\tfor ( j = 0; j <= radialSegments; j ++ ) {\r\n\r\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\r\n\r\n\t\t\tvar u = i / tubularSegments * arc;\r\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\r\n\r\n\t\t\t// vertex\r\n\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\r\n\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\r\n\t\t\tvertex.z = tube * Math.sin( v );\r\n\r\n\t\t\tvertices[ vertexBufferOffset ] = vertex.x;\r\n\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\r\n\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\r\n\r\n\t\t\t// this vector is used to calculate the normal\r\n\t\t\tcenter.x = radius * Math.cos( u );\r\n\t\t\tcenter.y = radius * Math.sin( u );\r\n\r\n\t\t\t// normal\r\n\t\t\tnormal.subVectors( vertex, center ).normalize();\r\n\r\n\t\t\tnormals[ vertexBufferOffset ] = normal.x;\r\n\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\r\n\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\r\n\r\n\t\t\t// uv\r\n\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\r\n\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\r\n\r\n\t\t\t// update offsets\r\n\t\t\tvertexBufferOffset += 3;\r\n\t\t\tuvBufferOffset += 2;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// generate indices\r\n\r\n\tfor ( j = 1; j <= radialSegments; j ++ ) {\r\n\r\n\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\r\n\r\n\t\t\t// indices\r\n\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\r\n\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\r\n\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\r\n\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\r\n\r\n\t\t\t// face one\r\n\t\t\tindices[ indexBufferOffset ] = a;\r\n\t\t\tindices[ indexBufferOffset + 1 ] = b;\r\n\t\t\tindices[ indexBufferOffset + 2 ] = d;\r\n\r\n\t\t\t// face two\r\n\t\t\tindices[ indexBufferOffset + 3 ] = b;\r\n\t\t\tindices[ indexBufferOffset + 4 ] = c;\r\n\t\t\tindices[ indexBufferOffset + 5 ] = d;\r\n\r\n\t\t\t// update offset\r\n\t\t\tindexBufferOffset += 6;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// build geometry\r\n\tthis.setIndex( new THREE.BufferAttribute( indices, 1 ) );\r\n\tthis.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\r\n\tthis.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\r\n\tthis.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\r\n\r\n};\r\n\r\nTHREE.TorusBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.TorusBufferGeometry.prototype.constructor = THREE.TorusBufferGeometry;\r\n\r\n// File:src/extras/geometries/TorusGeometry.js\r\n\r\n/**\r\n * @author oosmoxiecode\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\r\n */\r\n\r\nTHREE.TorusGeometry = function ( radius, tube, radialSegments, tubularSegments, arc ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'TorusGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\ttube: tube,\r\n\t\tradialSegments: radialSegments,\r\n\t\ttubularSegments: tubularSegments,\r\n\t\tarc: arc\r\n\t};\r\n\r\n\tthis.fromBufferGeometry( new THREE.TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\r\n\r\n};\r\n\r\nTHREE.TorusGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.TorusGeometry.prototype.constructor = THREE.TorusGeometry;\r\n\r\n// File:src/extras/geometries/TorusKnotBufferGeometry.js\r\n\r\n/**\r\n * @author Mugen87 / https://github.com/Mugen87\r\n *\r\n * see: http://www.blackpawn.com/texts/pqtorus/\r\n */\r\nTHREE.TorusKnotBufferGeometry = function ( radius, tube, tubularSegments, radialSegments, p, q ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tthis.type = 'TorusKnotBufferGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\ttube: tube,\r\n\t\ttubularSegments: tubularSegments,\r\n\t\tradialSegments: radialSegments,\r\n\t\tp: p,\r\n\t\tq: q\r\n\t};\r\n\r\n\tradius = radius || 100;\r\n\ttube = tube || 40;\r\n\ttubularSegments = Math.floor( tubularSegments ) || 64;\r\n\tradialSegments = Math.floor( radialSegments ) || 8;\r\n\tp = p || 2;\r\n\tq = q || 3;\r\n\r\n\t// used to calculate buffer length\r\n\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\r\n\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\r\n\r\n\t// buffers\r\n\tvar indices = new THREE.BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\r\n\tvar vertices = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar normals = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\r\n\tvar uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\r\n\r\n\t// helper variables\r\n\tvar i, j, index = 0, indexOffset = 0;\r\n\r\n\tvar vertex = new THREE.Vector3();\r\n\tvar normal = new THREE.Vector3();\r\n\tvar uv = new THREE.Vector2();\r\n\r\n\tvar P1 = new THREE.Vector3();\r\n\tvar P2 = new THREE.Vector3();\r\n\r\n\tvar B = new THREE.Vector3();\r\n\tvar T = new THREE.Vector3();\r\n\tvar N = new THREE.Vector3();\r\n\r\n\t// generate vertices, normals and uvs\r\n\r\n\tfor ( i = 0; i <= tubularSegments; ++ i ) {\r\n\r\n\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\r\n\r\n\t\tvar u = i / tubularSegments * p * Math.PI * 2;\r\n\r\n\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\r\n\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\r\n\r\n\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\r\n\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\r\n\r\n\t\t// calculate orthonormal basis\r\n\r\n\t\tT.subVectors( P2, P1 );\r\n\t\tN.addVectors( P2, P1 );\r\n\t\tB.crossVectors( T, N );\r\n\t\tN.crossVectors( B, T );\r\n\r\n\t\t// normalize B, N. T can be ignored, we don't use it\r\n\r\n\t\tB.normalize();\r\n\t\tN.normalize();\r\n\r\n\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\r\n\r\n\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\r\n\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\r\n\r\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\r\n\t\t\tvar cx = - tube * Math.cos( v );\r\n\t\t\tvar cy = tube * Math.sin( v );\r\n\r\n\t\t\t// now calculate the final vertex position.\r\n\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\r\n\r\n\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\r\n\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\r\n\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\r\n\r\n\t\t\t// vertex\r\n\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\r\n\r\n\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\r\n\t\t\tnormal.subVectors( vertex, P1 ).normalize();\r\n\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\r\n\r\n\t\t\t// uv\r\n\t\t\tuv.x = i / tubularSegments;\r\n\t\t\tuv.y = j / radialSegments;\r\n\t\t\tuvs.setXY( index, uv.x, uv.y );\r\n\r\n\t\t\t// increase index\r\n\t\t\tindex ++;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// generate indices\r\n\r\n\tfor ( j = 1; j <= tubularSegments; j ++ ) {\r\n\r\n\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\r\n\r\n\t\t\t// indices\r\n\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\r\n\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\r\n\t\t\tvar c = ( radialSegments + 1 ) * j + i;\r\n\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\r\n\r\n\t\t\t// face one\r\n\t\t\tindices.setX( indexOffset, a ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, b ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, d ); indexOffset++;\r\n\r\n\t\t\t// face two\r\n\t\t\tindices.setX( indexOffset, b ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, c ); indexOffset++;\r\n\t\t\tindices.setX( indexOffset, d ); indexOffset++;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// build geometry\r\n\r\n\tthis.setIndex( indices );\r\n\tthis.addAttribute( 'position', vertices );\r\n\tthis.addAttribute( 'normal', normals );\r\n\tthis.addAttribute( 'uv', uvs );\r\n\r\n\t// this function calculates the current position on the torus curve\r\n\r\n\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\r\n\r\n\t\tvar cu = Math.cos( u );\r\n\t\tvar su = Math.sin( u );\r\n\t\tvar quOverP = q / p * u;\r\n\t\tvar cs = Math.cos( quOverP );\r\n\r\n\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\r\n\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\r\n\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.TorusKnotBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.TorusKnotBufferGeometry.prototype.constructor = THREE.TorusKnotBufferGeometry;\r\n\r\n// File:src/extras/geometries/TorusKnotGeometry.js\r\n\r\n/**\r\n * @author oosmoxiecode\r\n */\r\n\r\nTHREE.TorusKnotGeometry = function ( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'TorusKnotGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\ttube: tube,\r\n\t\ttubularSegments: tubularSegments,\r\n\t\tradialSegments: radialSegments,\r\n\t\tp: p,\r\n\t\tq: q\r\n\t};\r\n\r\n\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\r\n\r\n\tthis.fromBufferGeometry( new THREE.TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\r\n\tthis.mergeVertices();\r\n\r\n};\r\n\r\nTHREE.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.TorusKnotGeometry.prototype.constructor = THREE.TorusKnotGeometry;\r\n\r\n// File:src/extras/geometries/TubeGeometry.js\r\n\r\n/**\r\n * @author WestLangley / https://github.com/WestLangley\r\n * @author zz85 / https://github.com/zz85\r\n * @author miningold / https://github.com/miningold\r\n * @author jonobr1 / https://github.com/jonobr1\r\n *\r\n * Modified from the TorusKnotGeometry by @oosmoxiecode\r\n *\r\n * Creates a tube which extrudes along a 3d spline\r\n *\r\n * Uses parallel transport frames as described in\r\n * http://www.cs.indiana.edu/pub/techreports/TR425.pdf\r\n */\r\n\r\nTHREE.TubeGeometry = function ( path, segments, radius, radialSegments, closed, taper ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'TubeGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tpath: path,\r\n\t\tsegments: segments,\r\n\t\tradius: radius,\r\n\t\tradialSegments: radialSegments,\r\n\t\tclosed: closed,\r\n\t\ttaper: taper\r\n\t};\r\n\r\n\tsegments = segments || 64;\r\n\tradius = radius || 1;\r\n\tradialSegments = radialSegments || 8;\r\n\tclosed = closed || false;\r\n\ttaper = taper || THREE.TubeGeometry.NoTaper;\r\n\r\n\tvar grid = [];\r\n\r\n\tvar scope = this,\r\n\r\n\t\ttangent,\r\n\t\tnormal,\r\n\t\tbinormal,\r\n\r\n\t\tnumpoints = segments + 1,\r\n\r\n\t\tu, v, r,\r\n\r\n\t\tcx, cy,\r\n\t\tpos, pos2 = new THREE.Vector3(),\r\n\t\ti, j,\r\n\t\tip, jp,\r\n\t\ta, b, c, d,\r\n\t\tuva, uvb, uvc, uvd;\r\n\r\n\tvar frames = new THREE.TubeGeometry.FrenetFrames( path, segments, closed ),\r\n\t\ttangents = frames.tangents,\r\n\t\tnormals = frames.normals,\r\n\t\tbinormals = frames.binormals;\r\n\r\n\t// proxy internals\r\n\tthis.tangents = tangents;\r\n\tthis.normals = normals;\r\n\tthis.binormals = binormals;\r\n\r\n\tfunction vert( x, y, z ) {\r\n\r\n\t\treturn scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1;\r\n\r\n\t}\r\n\r\n\t// construct the grid\r\n\r\n\tfor ( i = 0; i < numpoints; i ++ ) {\r\n\r\n\t\tgrid[ i ] = [];\r\n\r\n\t\tu = i / ( numpoints - 1 );\r\n\r\n\t\tpos = path.getPointAt( u );\r\n\r\n\t\ttangent = tangents[ i ];\r\n\t\tnormal = normals[ i ];\r\n\t\tbinormal = binormals[ i ];\r\n\r\n\t\tr = radius * taper( u );\r\n\r\n\t\tfor ( j = 0; j < radialSegments; j ++ ) {\r\n\r\n\t\t\tv = j / radialSegments * 2 * Math.PI;\r\n\r\n\t\t\tcx = - r * Math.cos( v ); // TODO: Hack: Negating it so it faces outside.\r\n\t\t\tcy = r * Math.sin( v );\r\n\r\n\t\t\tpos2.copy( pos );\r\n\t\t\tpos2.x += cx * normal.x + cy * binormal.x;\r\n\t\t\tpos2.y += cx * normal.y + cy * binormal.y;\r\n\t\t\tpos2.z += cx * normal.z + cy * binormal.z;\r\n\r\n\t\t\tgrid[ i ][ j ] = vert( pos2.x, pos2.y, pos2.z );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// construct the mesh\r\n\r\n\tfor ( i = 0; i < segments; i ++ ) {\r\n\r\n\t\tfor ( j = 0; j < radialSegments; j ++ ) {\r\n\r\n\t\t\tip = ( closed ) ? ( i + 1 ) % segments : i + 1;\r\n\t\t\tjp = ( j + 1 ) % radialSegments;\r\n\r\n\t\t\ta = grid[ i ][ j ];\t\t// *** NOT NECESSARILY PLANAR ! ***\r\n\t\t\tb = grid[ ip ][ j ];\r\n\t\t\tc = grid[ ip ][ jp ];\r\n\t\t\td = grid[ i ][ jp ];\r\n\r\n\t\t\tuva = new THREE.Vector2( i / segments, j / radialSegments );\r\n\t\t\tuvb = new THREE.Vector2( ( i + 1 ) / segments, j / radialSegments );\r\n\t\t\tuvc = new THREE.Vector2( ( i + 1 ) / segments, ( j + 1 ) / radialSegments );\r\n\t\t\tuvd = new THREE.Vector2( i / segments, ( j + 1 ) / radialSegments );\r\n\r\n\t\t\tthis.faces.push( new THREE.Face3( a, b, d ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] );\r\n\r\n\t\t\tthis.faces.push( new THREE.Face3( b, c, d ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n};\r\n\r\nTHREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.TubeGeometry.prototype.constructor = THREE.TubeGeometry;\r\n\r\nTHREE.TubeGeometry.NoTaper = function ( u ) {\r\n\r\n\treturn 1;\r\n\r\n};\r\n\r\nTHREE.TubeGeometry.SinusoidalTaper = function ( u ) {\r\n\r\n\treturn Math.sin( Math.PI * u );\r\n\r\n};\r\n\r\n// For computing of Frenet frames, exposing the tangents, normals and binormals the spline\r\nTHREE.TubeGeometry.FrenetFrames = function ( path, segments, closed ) {\r\n\r\n\tvar\tnormal = new THREE.Vector3(),\r\n\r\n\t\ttangents = [],\r\n\t\tnormals = [],\r\n\t\tbinormals = [],\r\n\r\n\t\tvec = new THREE.Vector3(),\r\n\t\tmat = new THREE.Matrix4(),\r\n\r\n\t\tnumpoints = segments + 1,\r\n\t\ttheta,\r\n\t\tsmallest,\r\n\r\n\t\ttx, ty, tz,\r\n\t\ti, u;\r\n\r\n\r\n\t// expose internals\r\n\tthis.tangents = tangents;\r\n\tthis.normals = normals;\r\n\tthis.binormals = binormals;\r\n\r\n\t// compute the tangent vectors for each segment on the path\r\n\r\n\tfor ( i = 0; i < numpoints; i ++ ) {\r\n\r\n\t\tu = i / ( numpoints - 1 );\r\n\r\n\t\ttangents[ i ] = path.getTangentAt( u );\r\n\t\ttangents[ i ].normalize();\r\n\r\n\t}\r\n\r\n\tinitialNormal3();\r\n\r\n\t/*\r\n\tfunction initialNormal1(lastBinormal) {\r\n\t\t// fixed start binormal. Has dangers of 0 vectors\r\n\t\tnormals[ 0 ] = new THREE.Vector3();\r\n\t\tbinormals[ 0 ] = new THREE.Vector3();\r\n\t\tif (lastBinormal===undefined) lastBinormal = new THREE.Vector3( 0, 0, 1 );\r\n\t\tnormals[ 0 ].crossVectors( lastBinormal, tangents[ 0 ] ).normalize();\r\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize();\r\n\t}\r\n\r\n\tfunction initialNormal2() {\r\n\r\n\t\t// This uses the Frenet-Serret formula for deriving binormal\r\n\t\tvar t2 = path.getTangentAt( epsilon );\r\n\r\n\t\tnormals[ 0 ] = new THREE.Vector3().subVectors( t2, tangents[ 0 ] ).normalize();\r\n\t\tbinormals[ 0 ] = new THREE.Vector3().crossVectors( tangents[ 0 ], normals[ 0 ] );\r\n\r\n\t\tnormals[ 0 ].crossVectors( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent\r\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize();\r\n\r\n\t}\r\n\t*/\r\n\r\n\tfunction initialNormal3() {\r\n\r\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\r\n\t\t// and in the direction of the smallest tangent xyz component\r\n\r\n\t\tnormals[ 0 ] = new THREE.Vector3();\r\n\t\tbinormals[ 0 ] = new THREE.Vector3();\r\n\t\tsmallest = Number.MAX_VALUE;\r\n\t\ttx = Math.abs( tangents[ 0 ].x );\r\n\t\tty = Math.abs( tangents[ 0 ].y );\r\n\t\ttz = Math.abs( tangents[ 0 ].z );\r\n\r\n\t\tif ( tx <= smallest ) {\r\n\r\n\t\t\tsmallest = tx;\r\n\t\t\tnormal.set( 1, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( ty <= smallest ) {\r\n\r\n\t\t\tsmallest = ty;\r\n\t\t\tnormal.set( 0, 1, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( tz <= smallest ) {\r\n\r\n\t\t\tnormal.set( 0, 0, 1 );\r\n\r\n\t\t}\r\n\r\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\r\n\r\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\r\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\r\n\r\n\t}\r\n\r\n\r\n\t// compute the slowly-varying normal and binormal vectors for each segment on the path\r\n\r\n\tfor ( i = 1; i < numpoints; i ++ ) {\r\n\r\n\t\tnormals[ i ] = normals[ i - 1 ].clone();\r\n\r\n\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\r\n\r\n\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\r\n\r\n\t\tif ( vec.length() > Number.EPSILON ) {\r\n\r\n\t\t\tvec.normalize();\r\n\r\n\t\t\ttheta = Math.acos( THREE.Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\r\n\r\n\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\r\n\r\n\t\t}\r\n\r\n\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\r\n\r\n\t}\r\n\r\n\r\n\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\r\n\r\n\tif ( closed ) {\r\n\r\n\t\ttheta = Math.acos( THREE.Math.clamp( normals[ 0 ].dot( normals[ numpoints - 1 ] ), - 1, 1 ) );\r\n\t\ttheta /= ( numpoints - 1 );\r\n\r\n\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ numpoints - 1 ] ) ) > 0 ) {\r\n\r\n\t\t\ttheta = - theta;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = 1; i < numpoints; i ++ ) {\r\n\r\n\t\t\t// twist a little...\r\n\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\r\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// File:src/extras/geometries/PolyhedronGeometry.js\r\n\r\n/**\r\n * @author clockworkgeek / https://github.com/clockworkgeek\r\n * @author timothypratley / https://github.com/timothypratley\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.PolyhedronGeometry = function ( vertices, indices, radius, detail ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'PolyhedronGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tvertices: vertices,\r\n\t\tindices: indices,\r\n\t\tradius: radius,\r\n\t\tdetail: detail\r\n\t};\r\n\r\n\tradius = radius || 1;\r\n\tdetail = detail || 0;\r\n\r\n\tvar that = this;\r\n\r\n\tfor ( var i = 0, l = vertices.length; i < l; i += 3 ) {\r\n\r\n\t\tprepare( new THREE.Vector3( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] ) );\r\n\r\n\t}\r\n\r\n\tvar p = this.vertices;\r\n\r\n\tvar faces = [];\r\n\r\n\tfor ( var i = 0, j = 0, l = indices.length; i < l; i += 3, j ++ ) {\r\n\r\n\t\tvar v1 = p[ indices[ i ] ];\r\n\t\tvar v2 = p[ indices[ i + 1 ] ];\r\n\t\tvar v3 = p[ indices[ i + 2 ] ];\r\n\r\n\t\tfaces[ j ] = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ], undefined, j );\r\n\r\n\t}\r\n\r\n\tvar centroid = new THREE.Vector3();\r\n\r\n\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\tsubdivide( faces[ i ], detail );\r\n\r\n\t}\r\n\r\n\r\n\t// Handle case when face straddles the seam\r\n\r\n\tfor ( var i = 0, l = this.faceVertexUvs[ 0 ].length; i < l; i ++ ) {\r\n\r\n\t\tvar uvs = this.faceVertexUvs[ 0 ][ i ];\r\n\r\n\t\tvar x0 = uvs[ 0 ].x;\r\n\t\tvar x1 = uvs[ 1 ].x;\r\n\t\tvar x2 = uvs[ 2 ].x;\r\n\r\n\t\tvar max = Math.max( x0, x1, x2 );\r\n\t\tvar min = Math.min( x0, x1, x2 );\r\n\r\n\t\tif ( max > 0.9 && min < 0.1 ) {\r\n\r\n\t\t\t// 0.9 is somewhat arbitrary\r\n\r\n\t\t\tif ( x0 < 0.2 ) uvs[ 0 ].x += 1;\r\n\t\t\tif ( x1 < 0.2 ) uvs[ 1 ].x += 1;\r\n\t\t\tif ( x2 < 0.2 ) uvs[ 2 ].x += 1;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// Apply radius\r\n\r\n\tfor ( var i = 0, l = this.vertices.length; i < l; i ++ ) {\r\n\r\n\t\tthis.vertices[ i ].multiplyScalar( radius );\r\n\r\n\t}\r\n\r\n\r\n\t// Merge vertices\r\n\r\n\tthis.mergeVertices();\r\n\r\n\tthis.computeFaceNormals();\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n\r\n\t// Project vector onto sphere's surface\r\n\r\n\tfunction prepare( vector ) {\r\n\r\n\t\tvar vertex = vector.normalize().clone();\r\n\t\tvertex.index = that.vertices.push( vertex ) - 1;\r\n\r\n\t\t// Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle.\r\n\r\n\t\tvar u = azimuth( vector ) / 2 / Math.PI + 0.5;\r\n\t\tvar v = inclination( vector ) / Math.PI + 0.5;\r\n\t\tvertex.uv = new THREE.Vector2( u, 1 - v );\r\n\r\n\t\treturn vertex;\r\n\r\n\t}\r\n\r\n\r\n\t// Approximate a curved face with recursively sub-divided triangles.\r\n\r\n\tfunction make( v1, v2, v3, materialIndex ) {\r\n\r\n\t\tvar face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ], undefined, materialIndex );\r\n\t\tthat.faces.push( face );\r\n\r\n\t\tcentroid.copy( v1 ).add( v2 ).add( v3 ).divideScalar( 3 );\r\n\r\n\t\tvar azi = azimuth( centroid );\r\n\r\n\t\tthat.faceVertexUvs[ 0 ].push( [\r\n\t\t\tcorrectUV( v1.uv, v1, azi ),\r\n\t\t\tcorrectUV( v2.uv, v2, azi ),\r\n\t\t\tcorrectUV( v3.uv, v3, azi )\r\n\t\t] );\r\n\r\n\t}\r\n\r\n\r\n\t// Analytically subdivide a face to the required detail level.\r\n\r\n\tfunction subdivide( face, detail ) {\r\n\r\n\t\tvar cols = Math.pow( 2, detail );\r\n\t\tvar a = prepare( that.vertices[ face.a ] );\r\n\t\tvar b = prepare( that.vertices[ face.b ] );\r\n\t\tvar c = prepare( that.vertices[ face.c ] );\r\n\t\tvar v = [];\r\n\r\n\t\tvar materialIndex = face.materialIndex;\r\n\r\n\t\t// Construct all of the vertices for this subdivision.\r\n\r\n\t\tfor ( var i = 0 ; i <= cols; i ++ ) {\r\n\r\n\t\t\tv[ i ] = [];\r\n\r\n\t\t\tvar aj = prepare( a.clone().lerp( c, i / cols ) );\r\n\t\t\tvar bj = prepare( b.clone().lerp( c, i / cols ) );\r\n\t\t\tvar rows = cols - i;\r\n\r\n\t\t\tfor ( var j = 0; j <= rows; j ++ ) {\r\n\r\n\t\t\t\tif ( j === 0 && i === cols ) {\r\n\r\n\t\t\t\t\tv[ i ][ j ] = aj;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tv[ i ][ j ] = prepare( aj.clone().lerp( bj, j / rows ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Construct all of the faces.\r\n\r\n\t\tfor ( var i = 0; i < cols ; i ++ ) {\r\n\r\n\t\t\tfor ( var j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\r\n\r\n\t\t\t\tvar k = Math.floor( j / 2 );\r\n\r\n\t\t\t\tif ( j % 2 === 0 ) {\r\n\r\n\t\t\t\t\tmake(\r\n\t\t\t\t\t\tv[ i ][ k + 1 ],\r\n\t\t\t\t\t\tv[ i + 1 ][ k ],\r\n\t\t\t\t\t\tv[ i ][ k ],\r\n\t\t\t\t\t\tmaterialIndex\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tmake(\r\n\t\t\t\t\t\tv[ i ][ k + 1 ],\r\n\t\t\t\t\t\tv[ i + 1 ][ k + 1 ],\r\n\t\t\t\t\t\tv[ i + 1 ][ k ],\r\n\t\t\t\t\t\tmaterialIndex\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// Angle around the Y axis, counter-clockwise when looking from above.\r\n\r\n\tfunction azimuth( vector ) {\r\n\r\n\t\treturn Math.atan2( vector.z, - vector.x );\r\n\r\n\t}\r\n\r\n\r\n\t// Angle above the XZ plane.\r\n\r\n\tfunction inclination( vector ) {\r\n\r\n\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\r\n\r\n\t}\r\n\r\n\r\n\t// Texture fixing helper. Spheres have some odd behaviours.\r\n\r\n\tfunction correctUV( uv, vector, azimuth ) {\r\n\r\n\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) uv = new THREE.Vector2( uv.x - 1, uv.y );\r\n\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) uv = new THREE.Vector2( azimuth / 2 / Math.PI + 0.5, uv.y );\r\n\t\treturn uv.clone();\r\n\r\n\t}\r\n\r\n\r\n};\r\n\r\nTHREE.PolyhedronGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.PolyhedronGeometry.prototype.constructor = THREE.PolyhedronGeometry;\r\n\r\n// File:src/extras/geometries/DodecahedronGeometry.js\r\n\r\n/**\r\n * @author Abe Pazos / https://hamoid.com\r\n */\r\n\r\nTHREE.DodecahedronGeometry = function ( radius, detail ) {\r\n\r\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\r\n\tvar r = 1 / t;\r\n\r\n\tvar vertices = [\r\n\r\n\t\t// (±1, ±1, ±1)\r\n\t\t- 1, - 1, - 1, - 1, - 1, 1,\r\n\t\t- 1, 1, - 1, - 1, 1, 1,\r\n\t\t 1, - 1, - 1, 1, - 1, 1,\r\n\t\t 1, 1, - 1, 1, 1, 1,\r\n\r\n\t\t// (0, ±1/φ, ±φ)\r\n\t\t 0, - r, - t, 0, - r, t,\r\n\t\t 0, r, - t, 0, r, t,\r\n\r\n\t\t// (±1/φ, ±φ, 0)\r\n\t\t- r, - t, 0, - r, t, 0,\r\n\t\t r, - t, 0, r, t, 0,\r\n\r\n\t\t// (±φ, 0, ±1/φ)\r\n\t\t- t, 0, - r, t, 0, - r,\r\n\t\t- t, 0, r, t, 0, r\r\n\t];\r\n\r\n\tvar indices = [\r\n\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\r\n\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\r\n\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\r\n\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\r\n\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\r\n\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\r\n\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\r\n\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\r\n\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\r\n\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\r\n\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\r\n\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail );\r\n\r\n\tthis.type = 'DodecahedronGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\tdetail: detail\r\n\t};\r\n\r\n};\r\n\r\nTHREE.DodecahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype );\r\nTHREE.DodecahedronGeometry.prototype.constructor = THREE.DodecahedronGeometry;\r\n\r\n// File:src/extras/geometries/IcosahedronGeometry.js\r\n\r\n/**\r\n * @author timothypratley / https://github.com/timothypratley\r\n */\r\n\r\nTHREE.IcosahedronGeometry = function ( radius, detail ) {\r\n\r\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\r\n\r\n\tvar vertices = [\r\n\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\r\n\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\r\n\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\r\n\t];\r\n\r\n\tvar indices = [\r\n\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\r\n\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\r\n\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\r\n\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail );\r\n\r\n\tthis.type = 'IcosahedronGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\tdetail: detail\r\n\t};\r\n\r\n};\r\n\r\nTHREE.IcosahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype );\r\nTHREE.IcosahedronGeometry.prototype.constructor = THREE.IcosahedronGeometry;\r\n\r\n// File:src/extras/geometries/OctahedronGeometry.js\r\n\r\n/**\r\n * @author timothypratley / https://github.com/timothypratley\r\n */\r\n\r\nTHREE.OctahedronGeometry = function ( radius, detail ) {\r\n\r\n\tvar vertices = [\r\n\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\r\n\t];\r\n\r\n\tvar indices = [\r\n\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail );\r\n\r\n\tthis.type = 'OctahedronGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\tdetail: detail\r\n\t};\r\n\r\n};\r\n\r\nTHREE.OctahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype );\r\nTHREE.OctahedronGeometry.prototype.constructor = THREE.OctahedronGeometry;\r\n\r\n// File:src/extras/geometries/TetrahedronGeometry.js\r\n\r\n/**\r\n * @author timothypratley / https://github.com/timothypratley\r\n */\r\n\r\nTHREE.TetrahedronGeometry = function ( radius, detail ) {\r\n\r\n\tvar vertices = [\r\n\t\t 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\r\n\t];\r\n\r\n\tvar indices = [\r\n\t\t 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail );\r\n\r\n\tthis.type = 'TetrahedronGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tradius: radius,\r\n\t\tdetail: detail\r\n\t};\r\n\r\n};\r\n\r\nTHREE.TetrahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype );\r\nTHREE.TetrahedronGeometry.prototype.constructor = THREE.TetrahedronGeometry;\r\n\r\n// File:src/extras/geometries/ParametricGeometry.js\r\n\r\n/**\r\n * @author zz85 / https://github.com/zz85\r\n * Parametric Surfaces Geometry\r\n * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\r\n *\r\n * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements );\r\n *\r\n */\r\n\r\nTHREE.ParametricGeometry = function ( func, slices, stacks ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.type = 'ParametricGeometry';\r\n\r\n\tthis.parameters = {\r\n\t\tfunc: func,\r\n\t\tslices: slices,\r\n\t\tstacks: stacks\r\n\t};\r\n\r\n\tvar verts = this.vertices;\r\n\tvar faces = this.faces;\r\n\tvar uvs = this.faceVertexUvs[ 0 ];\r\n\r\n\tvar i, j, p;\r\n\tvar u, v;\r\n\r\n\tvar sliceCount = slices + 1;\r\n\r\n\tfor ( i = 0; i <= stacks; i ++ ) {\r\n\r\n\t\tv = i / stacks;\r\n\r\n\t\tfor ( j = 0; j <= slices; j ++ ) {\r\n\r\n\t\t\tu = j / slices;\r\n\r\n\t\t\tp = func( u, v );\r\n\t\t\tverts.push( p );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tvar a, b, c, d;\r\n\tvar uva, uvb, uvc, uvd;\r\n\r\n\tfor ( i = 0; i < stacks; i ++ ) {\r\n\r\n\t\tfor ( j = 0; j < slices; j ++ ) {\r\n\r\n\t\t\ta = i * sliceCount + j;\r\n\t\t\tb = i * sliceCount + j + 1;\r\n\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\r\n\t\t\td = ( i + 1 ) * sliceCount + j;\r\n\r\n\t\t\tuva = new THREE.Vector2( j / slices, i / stacks );\r\n\t\t\tuvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks );\r\n\t\t\tuvc = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks );\r\n\t\t\tuvd = new THREE.Vector2( j / slices, ( i + 1 ) / stacks );\r\n\r\n\t\t\tfaces.push( new THREE.Face3( a, b, d ) );\r\n\t\t\tuvs.push( [ uva, uvb, uvd ] );\r\n\r\n\t\t\tfaces.push( new THREE.Face3( b, c, d ) );\r\n\t\t\tuvs.push( [ uvb.clone(), uvc, uvd.clone() ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// console.log(this);\r\n\r\n\t// magic bullet\r\n\t// var diff = this.mergeVertices();\r\n\t// console.log('removed ', diff, ' vertices by merging');\r\n\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n};\r\n\r\nTHREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\nTHREE.ParametricGeometry.prototype.constructor = THREE.ParametricGeometry;\r\n\r\n// File:src/extras/geometries/WireframeGeometry.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.WireframeGeometry = function ( geometry ) {\r\n\r\n\tTHREE.BufferGeometry.call( this );\r\n\r\n\tvar edge = [ 0, 0 ], hash = {};\r\n\r\n\tfunction sortFunction( a, b ) {\r\n\r\n\t\treturn a - b;\r\n\r\n\t}\r\n\r\n\tvar keys = [ 'a', 'b', 'c' ];\r\n\r\n\tif ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\tvar vertices = geometry.vertices;\r\n\t\tvar faces = geometry.faces;\r\n\t\tvar numEdges = 0;\r\n\r\n\t\t// allocate maximal size\r\n\t\tvar edges = new Uint32Array( 6 * faces.length );\r\n\r\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar face = faces[ i ];\r\n\r\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\r\n\r\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\r\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\r\n\t\t\t\tedge.sort( sortFunction );\r\n\r\n\t\t\t\tvar key = edge.toString();\r\n\r\n\t\t\t\tif ( hash[ key ] === undefined ) {\r\n\r\n\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\r\n\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\r\n\t\t\t\t\thash[ key ] = true;\r\n\t\t\t\t\tnumEdges ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\r\n\r\n\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\r\n\r\n\t\t\tfor ( var j = 0; j < 2; j ++ ) {\r\n\r\n\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\r\n\r\n\t\t\t\tvar index = 6 * i + 3 * j;\r\n\t\t\t\tcoords[ index + 0 ] = vertex.x;\r\n\t\t\t\tcoords[ index + 1 ] = vertex.y;\r\n\t\t\t\tcoords[ index + 2 ] = vertex.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) );\r\n\r\n\t} else if ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\tif ( geometry.index !== null ) {\r\n\r\n\t\t\t// Indexed BufferGeometry\r\n\r\n\t\t\tvar indices = geometry.index.array;\r\n\t\t\tvar vertices = geometry.attributes.position;\r\n\t\t\tvar groups = geometry.groups;\r\n\t\t\tvar numEdges = 0;\r\n\r\n\t\t\tif ( groups.length === 0 ) {\r\n\r\n\t\t\t\tgeometry.addGroup( 0, indices.length );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// allocate maximal size\r\n\t\t\tvar edges = new Uint32Array( 2 * indices.length );\r\n\r\n\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\r\n\r\n\t\t\t\tvar group = groups[ o ];\r\n\r\n\t\t\t\tvar start = group.start;\r\n\t\t\t\tvar count = group.count;\r\n\r\n\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\r\n\r\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\r\n\r\n\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\r\n\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\r\n\t\t\t\t\t\tedge.sort( sortFunction );\r\n\r\n\t\t\t\t\t\tvar key = edge.toString();\r\n\r\n\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\r\n\r\n\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\r\n\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\r\n\t\t\t\t\t\t\thash[ key ] = true;\r\n\t\t\t\t\t\t\tnumEdges ++;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\r\n\r\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\r\n\r\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\r\n\r\n\t\t\t\t\tvar index = 6 * i + 3 * j;\r\n\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\r\n\r\n\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\r\n\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\r\n\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// non-indexed BufferGeometry\r\n\r\n\t\t\tvar vertices = geometry.attributes.position.array;\r\n\t\t\tvar numEdges = vertices.length / 3;\r\n\t\t\tvar numTris = numEdges / 3;\r\n\r\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\r\n\r\n\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\r\n\r\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\r\n\r\n\t\t\t\t\tvar index = 18 * i + 6 * j;\r\n\r\n\t\t\t\t\tvar index1 = 9 * i + 3 * j;\r\n\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\r\n\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\r\n\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\r\n\r\n\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\r\n\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\r\n\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\r\n\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.WireframeGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\r\nTHREE.WireframeGeometry.prototype.constructor = THREE.WireframeGeometry;\r\n\r\n// File:src/extras/helpers/AxisHelper.js\r\n\r\n/**\r\n * @author sroucheray / http://sroucheray.org/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.AxisHelper = function ( size ) {\r\n\r\n\tsize = size || 1;\r\n\r\n\tvar vertices = new Float32Array( [\r\n\t\t0, 0, 0, size, 0, 0,\r\n\t\t0, 0, 0, 0, size, 0,\r\n\t\t0, 0, 0, 0, 0, size\r\n\t] );\r\n\r\n\tvar colors = new Float32Array( [\r\n\t\t1, 0, 0, 1, 0.6, 0,\r\n\t\t0, 1, 0, 0.6, 1, 0,\r\n\t\t0, 0, 1, 0, 0.6, 1\r\n\t] );\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\r\n\tgeometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ) );\r\n\r\n\tvar material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } );\r\n\r\n\tTHREE.LineSegments.call( this, geometry, material );\r\n\r\n};\r\n\r\nTHREE.AxisHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.AxisHelper.prototype.constructor = THREE.AxisHelper;\r\n\r\n// File:src/extras/helpers/ArrowHelper.js\r\n\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author zz85 / http://github.com/zz85\r\n * @author bhouston / http://clara.io\r\n *\r\n * Creates an arrow for visualizing directions\r\n *\r\n * Parameters:\r\n * dir - Vector3\r\n * origin - Vector3\r\n * length - Number\r\n * color - color in hex value\r\n * headLength - Number\r\n * headWidth - Number\r\n */\r\n\r\nTHREE.ArrowHelper = ( function () {\r\n\r\n\tvar lineGeometry = new THREE.Geometry();\r\n\tlineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 1, 0 ) );\r\n\r\n\tvar coneGeometry = new THREE.CylinderGeometry( 0, 0.5, 1, 5, 1 );\r\n\tconeGeometry.translate( 0, - 0.5, 0 );\r\n\r\n\treturn function ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\r\n\r\n\t\t// dir is assumed to be normalized\r\n\r\n\t\tTHREE.Object3D.call( this );\r\n\r\n\t\tif ( color === undefined ) color = 0xffff00;\r\n\t\tif ( length === undefined ) length = 1;\r\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\r\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\r\n\r\n\t\tthis.position.copy( origin );\r\n\t\t\r\n\t\tthis.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: color } ) );\r\n\t\tthis.line.matrixAutoUpdate = false;\r\n\t\tthis.add( this.line );\r\n\r\n\t\tthis.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: color } ) );\r\n\t\tthis.cone.matrixAutoUpdate = false;\r\n\t\tthis.add( this.cone );\r\n\r\n\t\tthis.setDirection( dir );\r\n\t\tthis.setLength( length, headLength, headWidth );\r\n\r\n\t}\r\n\r\n}() );\r\n\r\nTHREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.ArrowHelper.prototype.constructor = THREE.ArrowHelper;\r\n\r\nTHREE.ArrowHelper.prototype.setDirection = ( function () {\r\n\r\n\tvar axis = new THREE.Vector3();\r\n\tvar radians;\r\n\r\n\treturn function setDirection( dir ) {\r\n\r\n\t\t// dir is assumed to be normalized\r\n\r\n\t\tif ( dir.y > 0.99999 ) {\r\n\r\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\r\n\r\n\t\t} else if ( dir.y < - 0.99999 ) {\r\n\r\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\r\n\r\n\t\t\tradians = Math.acos( dir.y );\r\n\r\n\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}() );\r\n\r\nTHREE.ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\r\n\r\n\tif ( headLength === undefined ) headLength = 0.2 * length;\r\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\r\n\r\n\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\r\n\tthis.line.updateMatrix();\r\n\r\n\tthis.cone.scale.set( headWidth, headLength, headWidth );\r\n\tthis.cone.position.y = length;\r\n\tthis.cone.updateMatrix();\r\n\r\n};\r\n\r\nTHREE.ArrowHelper.prototype.setColor = function ( color ) {\r\n\r\n\tthis.line.material.color.set( color );\r\n\tthis.cone.material.color.set( color );\r\n\r\n};\r\n\r\n// File:src/extras/helpers/BoxHelper.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.BoxHelper = function ( object ) {\r\n\r\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\r\n\tvar positions = new Float32Array( 8 * 3 );\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\r\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\r\n\r\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: 0xffff00 } ) );\r\n\r\n\tif ( object !== undefined ) {\r\n\r\n\t\tthis.update( object );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.BoxHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.BoxHelper.prototype.constructor = THREE.BoxHelper;\r\n\r\nTHREE.BoxHelper.prototype.update = ( function () {\r\n\r\n\tvar box = new THREE.Box3();\r\n\r\n\treturn function ( object ) {\r\n\r\n\t\tif ( object instanceof THREE.Box3 ) {\r\n\r\n\t\t\tbox.copy( object );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tbox.setFromObject( object );\r\n\r\n\t\t}\r\n\r\n\t\tif ( box.isEmpty() ) return;\r\n\r\n\t\tvar min = box.min;\r\n\t\tvar max = box.max;\r\n\r\n\t\t/*\r\n\t\t 5____4\r\n\t\t1/___0/|\r\n\t\t| 6__|_7\r\n\t\t2/___3/\r\n\r\n\t\t0: max.x, max.y, max.z\r\n\t\t1: min.x, max.y, max.z\r\n\t\t2: min.x, min.y, max.z\r\n\t\t3: max.x, min.y, max.z\r\n\t\t4: max.x, max.y, min.z\r\n\t\t5: min.x, max.y, min.z\r\n\t\t6: min.x, min.y, min.z\r\n\t\t7: max.x, min.y, min.z\r\n\t\t*/\r\n\r\n\t\tvar position = this.geometry.attributes.position;\r\n\t\tvar array = position.array;\r\n\r\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\r\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\r\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\r\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\r\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\r\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\r\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\r\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\r\n\r\n\t\tposition.needsUpdate = true;\r\n\r\n\t\tthis.geometry.computeBoundingSphere();\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n// File:src/extras/helpers/BoundingBoxHelper.js\r\n\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\n// a helper to show the world-axis-aligned bounding box for an object\r\n\r\nTHREE.BoundingBoxHelper = function ( object, hex ) {\r\n\r\n\tvar color = ( hex !== undefined ) ? hex : 0x888888;\r\n\r\n\tthis.object = object;\r\n\r\n\tthis.box = new THREE.Box3();\r\n\r\n\tTHREE.Mesh.call( this, new THREE.BoxGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: color, wireframe: true } ) );\r\n\r\n};\r\n\r\nTHREE.BoundingBoxHelper.prototype = Object.create( THREE.Mesh.prototype );\r\nTHREE.BoundingBoxHelper.prototype.constructor = THREE.BoundingBoxHelper;\r\n\r\nTHREE.BoundingBoxHelper.prototype.update = function () {\r\n\r\n\tthis.box.setFromObject( this.object );\r\n\r\n\tthis.box.size( this.scale );\r\n\r\n\tthis.box.center( this.position );\r\n\r\n};\r\n\r\n// File:src/extras/helpers/CameraHelper.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n *\t- shows frustum, line of sight and up of the camera\r\n *\t- suitable for fast updates\r\n * \t- based on frustum visualization in lightgl.js shadowmap example\r\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\r\n */\r\n\r\nTHREE.CameraHelper = function ( camera ) {\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\tvar material = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } );\r\n\r\n\tvar pointMap = {};\r\n\r\n\t// colors\r\n\r\n\tvar hexFrustum = 0xffaa00;\r\n\tvar hexCone = 0xff0000;\r\n\tvar hexUp = 0x00aaff;\r\n\tvar hexTarget = 0xffffff;\r\n\tvar hexCross = 0x333333;\r\n\r\n\t// near\r\n\r\n\taddLine( \"n1\", \"n2\", hexFrustum );\r\n\taddLine( \"n2\", \"n4\", hexFrustum );\r\n\taddLine( \"n4\", \"n3\", hexFrustum );\r\n\taddLine( \"n3\", \"n1\", hexFrustum );\r\n\r\n\t// far\r\n\r\n\taddLine( \"f1\", \"f2\", hexFrustum );\r\n\taddLine( \"f2\", \"f4\", hexFrustum );\r\n\taddLine( \"f4\", \"f3\", hexFrustum );\r\n\taddLine( \"f3\", \"f1\", hexFrustum );\r\n\r\n\t// sides\r\n\r\n\taddLine( \"n1\", \"f1\", hexFrustum );\r\n\taddLine( \"n2\", \"f2\", hexFrustum );\r\n\taddLine( \"n3\", \"f3\", hexFrustum );\r\n\taddLine( \"n4\", \"f4\", hexFrustum );\r\n\r\n\t// cone\r\n\r\n\taddLine( \"p\", \"n1\", hexCone );\r\n\taddLine( \"p\", \"n2\", hexCone );\r\n\taddLine( \"p\", \"n3\", hexCone );\r\n\taddLine( \"p\", \"n4\", hexCone );\r\n\r\n\t// up\r\n\r\n\taddLine( \"u1\", \"u2\", hexUp );\r\n\taddLine( \"u2\", \"u3\", hexUp );\r\n\taddLine( \"u3\", \"u1\", hexUp );\r\n\r\n\t// target\r\n\r\n\taddLine( \"c\", \"t\", hexTarget );\r\n\taddLine( \"p\", \"c\", hexCross );\r\n\r\n\t// cross\r\n\r\n\taddLine( \"cn1\", \"cn2\", hexCross );\r\n\taddLine( \"cn3\", \"cn4\", hexCross );\r\n\r\n\taddLine( \"cf1\", \"cf2\", hexCross );\r\n\taddLine( \"cf3\", \"cf4\", hexCross );\r\n\r\n\tfunction addLine( a, b, hex ) {\r\n\r\n\t\taddPoint( a, hex );\r\n\t\taddPoint( b, hex );\r\n\r\n\t}\r\n\r\n\tfunction addPoint( id, hex ) {\r\n\r\n\t\tgeometry.vertices.push( new THREE.Vector3() );\r\n\t\tgeometry.colors.push( new THREE.Color( hex ) );\r\n\r\n\t\tif ( pointMap[ id ] === undefined ) {\r\n\r\n\t\t\tpointMap[ id ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tpointMap[ id ].push( geometry.vertices.length - 1 );\r\n\r\n\t}\r\n\r\n\tTHREE.LineSegments.call( this, geometry, material );\r\n\r\n\tthis.camera = camera;\r\n\tthis.camera.updateProjectionMatrix();\r\n\r\n\tthis.matrix = camera.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.pointMap = pointMap;\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.CameraHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.CameraHelper.prototype.constructor = THREE.CameraHelper;\r\n\r\nTHREE.CameraHelper.prototype.update = function () {\r\n\r\n\tvar geometry, pointMap;\r\n\r\n\tvar vector = new THREE.Vector3();\r\n\tvar camera = new THREE.Camera();\r\n\r\n\tfunction setPoint( point, x, y, z ) {\r\n\r\n\t\tvector.set( x, y, z ).unproject( camera );\r\n\r\n\t\tvar points = pointMap[ point ];\r\n\r\n\t\tif ( points !== undefined ) {\r\n\r\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn function () {\r\n\r\n\t\tgeometry = this.geometry;\r\n\t\tpointMap = this.pointMap;\r\n\r\n\t\tvar w = 1, h = 1;\r\n\r\n\t\t// we need just camera projection matrix\r\n\t\t// world matrix must be identity\r\n\r\n\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\r\n\r\n\t\t// center / target\r\n\r\n\t\tsetPoint( \"c\", 0, 0, - 1 );\r\n\t\tsetPoint( \"t\", 0, 0, 1 );\r\n\r\n\t\t// near\r\n\r\n\t\tsetPoint( \"n1\", - w, - h, - 1 );\r\n\t\tsetPoint( \"n2\", w, - h, - 1 );\r\n\t\tsetPoint( \"n3\", - w, h, - 1 );\r\n\t\tsetPoint( \"n4\", w, h, - 1 );\r\n\r\n\t\t// far\r\n\r\n\t\tsetPoint( \"f1\", - w, - h, 1 );\r\n\t\tsetPoint( \"f2\", w, - h, 1 );\r\n\t\tsetPoint( \"f3\", - w, h, 1 );\r\n\t\tsetPoint( \"f4\", w, h, 1 );\r\n\r\n\t\t// up\r\n\r\n\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\r\n\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\r\n\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\r\n\r\n\t\t// cross\r\n\r\n\t\tsetPoint( \"cf1\", - w, 0, 1 );\r\n\t\tsetPoint( \"cf2\", w, 0, 1 );\r\n\t\tsetPoint( \"cf3\", 0, - h, 1 );\r\n\t\tsetPoint( \"cf4\", 0, h, 1 );\r\n\r\n\t\tsetPoint( \"cn1\", - w, 0, - 1 );\r\n\t\tsetPoint( \"cn2\", w, 0, - 1 );\r\n\t\tsetPoint( \"cn3\", 0, - h, - 1 );\r\n\t\tsetPoint( \"cn4\", 0, h, - 1 );\r\n\r\n\t\tgeometry.verticesNeedUpdate = true;\r\n\r\n\t};\r\n\r\n}();\r\n\r\n// File:src/extras/helpers/DirectionalLightHelper.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.DirectionalLightHelper = function ( light, size ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.light = light;\r\n\tthis.light.updateMatrixWorld();\r\n\r\n\tthis.matrix = light.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tsize = size || 1;\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\tgeometry.vertices.push(\r\n\t\tnew THREE.Vector3( - size, size, 0 ),\r\n\t\tnew THREE.Vector3( size, size, 0 ),\r\n\t\tnew THREE.Vector3( size, - size, 0 ),\r\n\t\tnew THREE.Vector3( - size, - size, 0 ),\r\n\t\tnew THREE.Vector3( - size, size, 0 )\r\n\t);\r\n\r\n\tvar material = new THREE.LineBasicMaterial( { fog: false } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.lightPlane = new THREE.Line( geometry, material );\r\n\tthis.add( this.lightPlane );\r\n\r\n\tgeometry = new THREE.Geometry();\r\n\tgeometry.vertices.push(\r\n\t\tnew THREE.Vector3(),\r\n\t\tnew THREE.Vector3()\r\n\t);\r\n\r\n\tmaterial = new THREE.LineBasicMaterial( { fog: false } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.targetLine = new THREE.Line( geometry, material );\r\n\tthis.add( this.targetLine );\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.DirectionalLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.DirectionalLightHelper.prototype.constructor = THREE.DirectionalLightHelper;\r\n\r\nTHREE.DirectionalLightHelper.prototype.dispose = function () {\r\n\r\n\tthis.lightPlane.geometry.dispose();\r\n\tthis.lightPlane.material.dispose();\r\n\tthis.targetLine.geometry.dispose();\r\n\tthis.targetLine.material.dispose();\r\n\r\n};\r\n\r\nTHREE.DirectionalLightHelper.prototype.update = function () {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\tvar v3 = new THREE.Vector3();\r\n\r\n\treturn function () {\r\n\r\n\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\r\n\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\r\n\t\tv3.subVectors( v2, v1 );\r\n\r\n\t\tthis.lightPlane.lookAt( v3 );\r\n\t\tthis.lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\t\tthis.targetLine.geometry.vertices[ 1 ].copy( v3 );\r\n\t\tthis.targetLine.geometry.verticesNeedUpdate = true;\r\n\t\tthis.targetLine.material.color.copy( this.lightPlane.material.color );\r\n\r\n\t};\r\n\r\n}();\r\n\r\n// File:src/extras/helpers/EdgesHelper.js\r\n\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @param object THREE.Mesh whose geometry will be used\r\n * @param hex line color\r\n * @param thresholdAngle the minimum angle (in degrees),\r\n * between the face normals of adjacent faces,\r\n * that is required to render an edge. A value of 10 means\r\n * an edge is only rendered if the angle is at least 10 degrees.\r\n */\r\n\r\nTHREE.EdgesHelper = function ( object, hex, thresholdAngle ) {\r\n\r\n\tvar color = ( hex !== undefined ) ? hex : 0xffffff;\r\n\r\n\tTHREE.LineSegments.call( this, new THREE.EdgesGeometry( object.geometry, thresholdAngle ), new THREE.LineBasicMaterial( { color: color } ) );\r\n\r\n\tthis.matrix = object.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.EdgesHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.EdgesHelper.prototype.constructor = THREE.EdgesHelper;\r\n\r\n// File:src/extras/helpers/FaceNormalsHelper.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.FaceNormalsHelper = function ( object, size, hex, linewidth ) {\r\n\r\n\t// FaceNormalsHelper only supports THREE.Geometry\r\n\r\n\tthis.object = object;\r\n\r\n\tthis.size = ( size !== undefined ) ? size : 1;\r\n\r\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\r\n\r\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\r\n\r\n\t//\r\n\r\n\tvar nNormals = 0;\r\n\r\n\tvar objGeometry = this.object.geometry;\r\n\r\n\tif ( objGeometry instanceof THREE.Geometry ) {\r\n\r\n\t\tnNormals = objGeometry.faces.length;\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\r\n\tvar positions = new THREE.Float32Attribute( nNormals * 2 * 3, 3 );\r\n\r\n\tgeometry.addAttribute( 'position', positions );\r\n\r\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ) );\r\n\r\n\t//\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.FaceNormalsHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.FaceNormalsHelper.prototype.constructor = THREE.FaceNormalsHelper;\r\n\r\nTHREE.FaceNormalsHelper.prototype.update = ( function () {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\tvar normalMatrix = new THREE.Matrix3();\r\n\r\n\treturn function update() {\r\n\r\n\t\tthis.object.updateMatrixWorld( true );\r\n\r\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\r\n\r\n\t\tvar matrixWorld = this.object.matrixWorld;\r\n\r\n\t\tvar position = this.geometry.attributes.position;\r\n\r\n\t\t//\r\n\r\n\t\tvar objGeometry = this.object.geometry;\r\n\r\n\t\tvar vertices = objGeometry.vertices;\r\n\r\n\t\tvar faces = objGeometry.faces;\r\n\r\n\t\tvar idx = 0;\r\n\r\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar face = faces[ i ];\r\n\r\n\t\t\tvar normal = face.normal;\r\n\r\n\t\t\tv1.copy( vertices[ face.a ] )\r\n\t\t\t\t.add( vertices[ face.b ] )\r\n\t\t\t\t.add( vertices[ face.c ] )\r\n\t\t\t\t.divideScalar( 3 )\r\n\t\t\t\t.applyMatrix4( matrixWorld );\r\n\r\n\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\r\n\r\n\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\r\n\r\n\t\t\tidx = idx + 1;\r\n\r\n\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\r\n\r\n\t\t\tidx = idx + 1;\r\n\r\n\t\t}\r\n\r\n\t\tposition.needsUpdate = true;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n}() );\r\n\r\n// File:src/extras/helpers/GridHelper.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.GridHelper = function ( size, step ) {\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\tvar material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } );\r\n\r\n\tthis.color1 = new THREE.Color( 0x444444 );\r\n\tthis.color2 = new THREE.Color( 0x888888 );\r\n\r\n\tfor ( var i = - size; i <= size; i += step ) {\r\n\r\n\t\tgeometry.vertices.push(\r\n\t\t\tnew THREE.Vector3( - size, 0, i ), new THREE.Vector3( size, 0, i ),\r\n\t\t\tnew THREE.Vector3( i, 0, - size ), new THREE.Vector3( i, 0, size )\r\n\t\t);\r\n\r\n\t\tvar color = i === 0 ? this.color1 : this.color2;\r\n\r\n\t\tgeometry.colors.push( color, color, color, color );\r\n\r\n\t}\r\n\r\n\tTHREE.LineSegments.call( this, geometry, material );\r\n\r\n};\r\n\r\nTHREE.GridHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.GridHelper.prototype.constructor = THREE.GridHelper;\r\n\r\nTHREE.GridHelper.prototype.setColors = function( colorCenterLine, colorGrid ) {\r\n\r\n\tthis.color1.set( colorCenterLine );\r\n\tthis.color2.set( colorGrid );\r\n\r\n\tthis.geometry.colorsNeedUpdate = true;\r\n\r\n};\r\n\r\n// File:src/extras/helpers/HemisphereLightHelper.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.HemisphereLightHelper = function ( light, sphereSize ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.light = light;\r\n\tthis.light.updateMatrixWorld();\r\n\r\n\tthis.matrix = light.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.colors = [ new THREE.Color(), new THREE.Color() ];\r\n\r\n\tvar geometry = new THREE.SphereGeometry( sphereSize, 4, 2 );\r\n\tgeometry.rotateX( - Math.PI / 2 );\r\n\r\n\tfor ( var i = 0, il = 8; i < il; i ++ ) {\r\n\r\n\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\r\n\r\n\t}\r\n\r\n\tvar material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors, wireframe: true } );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( geometry, material );\r\n\tthis.add( this.lightSphere );\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.HemisphereLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.HemisphereLightHelper.prototype.constructor = THREE.HemisphereLightHelper;\r\n\r\nTHREE.HemisphereLightHelper.prototype.dispose = function () {\r\n\r\n\tthis.lightSphere.geometry.dispose();\r\n\tthis.lightSphere.material.dispose();\r\n\r\n};\r\n\r\nTHREE.HemisphereLightHelper.prototype.update = function () {\r\n\r\n\tvar vector = new THREE.Vector3();\r\n\r\n\treturn function () {\r\n\r\n\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\r\n\r\n\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\r\n\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\r\n\r\n\t}\r\n\r\n}();\r\n\r\n// File:src/extras/helpers/PointLightHelper.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.PointLightHelper = function ( light, sphereSize ) {\r\n\r\n\tthis.light = light;\r\n\tthis.light.updateMatrixWorld();\r\n\r\n\tvar geometry = new THREE.SphereGeometry( sphereSize, 4, 2 );\r\n\tvar material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tTHREE.Mesh.call( this, geometry, material );\r\n\r\n\tthis.matrix = this.light.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\t/*\r\n\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\r\n\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\r\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\r\n\r\n\tvar d = light.distance;\r\n\r\n\tif ( d === 0.0 ) {\r\n\r\n\t\tthis.lightDistance.visible = false;\r\n\r\n\t} else {\r\n\r\n\t\tthis.lightDistance.scale.set( d, d, d );\r\n\r\n\t}\r\n\r\n\tthis.add( this.lightDistance );\r\n\t*/\r\n\r\n};\r\n\r\nTHREE.PointLightHelper.prototype = Object.create( THREE.Mesh.prototype );\r\nTHREE.PointLightHelper.prototype.constructor = THREE.PointLightHelper;\r\n\r\nTHREE.PointLightHelper.prototype.dispose = function () {\r\n\r\n\tthis.geometry.dispose();\r\n\tthis.material.dispose();\r\n\r\n};\r\n\r\nTHREE.PointLightHelper.prototype.update = function () {\r\n\r\n\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\t/*\r\n\tvar d = this.light.distance;\r\n\r\n\tif ( d === 0.0 ) {\r\n\r\n\t\tthis.lightDistance.visible = false;\r\n\r\n\t} else {\r\n\r\n\t\tthis.lightDistance.visible = true;\r\n\t\tthis.lightDistance.scale.set( d, d, d );\r\n\r\n\t}\r\n\t*/\r\n\r\n};\r\n\r\n// File:src/extras/helpers/SkeletonHelper.js\r\n\r\n/**\r\n * @author Sean Griffin / http://twitter.com/sgrif\r\n * @author Michael Guerrero / http://realitymeltdown.com\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author ikerr / http://verold.com\r\n */\r\n\r\nTHREE.SkeletonHelper = function ( object ) {\r\n\r\n\tthis.bones = this.getBoneList( object );\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\r\n\tfor ( var i = 0; i < this.bones.length; i ++ ) {\r\n\r\n\t\tvar bone = this.bones[ i ];\r\n\r\n\t\tif ( bone.parent instanceof THREE.Bone ) {\r\n\r\n\t\t\tgeometry.vertices.push( new THREE.Vector3() );\r\n\t\t\tgeometry.vertices.push( new THREE.Vector3() );\r\n\t\t\tgeometry.colors.push( new THREE.Color( 0, 0, 1 ) );\r\n\t\t\tgeometry.colors.push( new THREE.Color( 0, 1, 0 ) );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgeometry.dynamic = true;\r\n\r\n\tvar material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } );\r\n\r\n\tTHREE.LineSegments.call( this, geometry, material );\r\n\r\n\tthis.root = object;\r\n\r\n\tthis.matrix = object.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\n\r\nTHREE.SkeletonHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.SkeletonHelper.prototype.constructor = THREE.SkeletonHelper;\r\n\r\nTHREE.SkeletonHelper.prototype.getBoneList = function( object ) {\r\n\r\n\tvar boneList = [];\r\n\r\n\tif ( object instanceof THREE.Bone ) {\r\n\r\n\t\tboneList.push( object );\r\n\r\n\t}\r\n\r\n\tfor ( var i = 0; i < object.children.length; i ++ ) {\r\n\r\n\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\r\n\r\n\t}\r\n\r\n\treturn boneList;\r\n\r\n};\r\n\r\nTHREE.SkeletonHelper.prototype.update = function () {\r\n\r\n\tvar geometry = this.geometry;\r\n\r\n\tvar matrixWorldInv = new THREE.Matrix4().getInverse( this.root.matrixWorld );\r\n\r\n\tvar boneMatrix = new THREE.Matrix4();\r\n\r\n\tvar j = 0;\r\n\r\n\tfor ( var i = 0; i < this.bones.length; i ++ ) {\r\n\r\n\t\tvar bone = this.bones[ i ];\r\n\r\n\t\tif ( bone.parent instanceof THREE.Bone ) {\r\n\r\n\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\r\n\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\r\n\r\n\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\r\n\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\r\n\r\n\t\t\tj += 2;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgeometry.verticesNeedUpdate = true;\r\n\r\n\tgeometry.computeBoundingSphere();\r\n\r\n};\r\n\r\n// File:src/extras/helpers/SpotLightHelper.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.SpotLightHelper = function ( light ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.light = light;\r\n\tthis.light.updateMatrixWorld();\r\n\r\n\tthis.matrix = light.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\r\n\tvar positions = [\r\n\t\t0, 0, 0, 0, 0, 1,\r\n\t\t0, 0, 0, 1, 0, 1,\r\n\t\t0, 0, 0, - 1, 0, 1,\r\n\t\t0, 0, 0, 0, 1, 1,\r\n\t\t0, 0, 0, 0, - 1, 1\r\n\t];\r\n\r\n\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\r\n\r\n\t\tvar p1 = ( i / l ) * Math.PI * 2;\r\n\t\tvar p2 = ( j / l ) * Math.PI * 2;\r\n\r\n\t\tpositions.push(\r\n\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\r\n\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tgeometry.addAttribute( 'position', new THREE.Float32Attribute( positions, 3 ) );\r\n\r\n\tvar material = new THREE.LineBasicMaterial( { fog: false } );\r\n\r\n\tthis.cone = new THREE.LineSegments( geometry, material );\r\n\tthis.add( this.cone );\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.SpotLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.SpotLightHelper.prototype.constructor = THREE.SpotLightHelper;\r\n\r\nTHREE.SpotLightHelper.prototype.dispose = function () {\r\n\r\n\tthis.cone.geometry.dispose();\r\n\tthis.cone.material.dispose();\r\n\r\n};\r\n\r\nTHREE.SpotLightHelper.prototype.update = function () {\r\n\r\n\tvar vector = new THREE.Vector3();\r\n\tvar vector2 = new THREE.Vector3();\r\n\r\n\treturn function () {\r\n\r\n\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\r\n\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\r\n\r\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\r\n\r\n\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\r\n\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\r\n\r\n\t\tthis.cone.lookAt( vector2.sub( vector ) );\r\n\r\n\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\t};\r\n\r\n}();\r\n\r\n// File:src/extras/helpers/VertexNormalsHelper.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.VertexNormalsHelper = function ( object, size, hex, linewidth ) {\r\n\r\n\tthis.object = object;\r\n\r\n\tthis.size = ( size !== undefined ) ? size : 1;\r\n\r\n\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\r\n\r\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\r\n\r\n\t//\r\n\r\n\tvar nNormals = 0;\r\n\r\n\tvar objGeometry = this.object.geometry;\r\n\r\n\tif ( objGeometry instanceof THREE.Geometry ) {\r\n\r\n\t\tnNormals = objGeometry.faces.length * 3;\r\n\r\n\t} else if ( objGeometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\tnNormals = objGeometry.attributes.normal.count\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\r\n\tvar positions = new THREE.Float32Attribute( nNormals * 2 * 3, 3 );\r\n\r\n\tgeometry.addAttribute( 'position', positions );\r\n\r\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ) );\r\n\r\n\t//\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.VertexNormalsHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.VertexNormalsHelper.prototype.constructor = THREE.VertexNormalsHelper;\r\n\r\nTHREE.VertexNormalsHelper.prototype.update = ( function () {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\tvar normalMatrix = new THREE.Matrix3();\r\n\r\n\treturn function update() {\r\n\r\n\t\tvar keys = [ 'a', 'b', 'c' ];\r\n\r\n\t\tthis.object.updateMatrixWorld( true );\r\n\r\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\r\n\r\n\t\tvar matrixWorld = this.object.matrixWorld;\r\n\r\n\t\tvar position = this.geometry.attributes.position;\r\n\r\n\t\t//\r\n\r\n\t\tvar objGeometry = this.object.geometry;\r\n\r\n\t\tif ( objGeometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\tvar vertices = objGeometry.vertices;\r\n\r\n\t\t\tvar faces = objGeometry.faces;\r\n\r\n\t\t\tvar idx = 0;\r\n\r\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tvar face = faces[ i ];\r\n\r\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\r\n\r\n\t\t\t\t\tvar normal = face.vertexNormals[ j ];\r\n\r\n\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\r\n\r\n\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\r\n\r\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\r\n\r\n\t\t\t\t\tidx = idx + 1;\r\n\r\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\r\n\r\n\t\t\t\t\tidx = idx + 1;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( objGeometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\tvar objPos = objGeometry.attributes.position;\r\n\r\n\t\t\tvar objNorm = objGeometry.attributes.normal;\r\n\r\n\t\t\tvar idx = 0;\r\n\r\n\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\r\n\r\n\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\r\n\r\n\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\r\n\r\n\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\r\n\r\n\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\r\n\r\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\r\n\r\n\t\t\t\tidx = idx + 1;\r\n\r\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\r\n\r\n\t\t\t\tidx = idx + 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tposition.needsUpdate = true;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n}() );\r\n\r\n// File:src/extras/helpers/WireframeHelper.js\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.WireframeHelper = function ( object, hex ) {\r\n\r\n\tvar color = ( hex !== undefined ) ? hex : 0xffffff;\r\n\r\n\tTHREE.LineSegments.call( this, new THREE.WireframeGeometry( object.geometry ), new THREE.LineBasicMaterial( { color: color } ) );\r\n\r\n\tthis.matrix = object.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.WireframeHelper.prototype = Object.create( THREE.LineSegments.prototype );\r\nTHREE.WireframeHelper.prototype.constructor = THREE.WireframeHelper;\r\n\r\n// File:src/extras/objects/ImmediateRenderObject.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.ImmediateRenderObject = function ( material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.material = material;\r\n\tthis.render = function ( renderCallback ) {};\r\n\r\n};\r\n\r\nTHREE.ImmediateRenderObject.prototype = Object.create( THREE.Object3D.prototype );\r\nTHREE.ImmediateRenderObject.prototype.constructor = THREE.ImmediateRenderObject;\r\n\r\n// File:src/extras/objects/MorphBlendMesh.js\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.MorphBlendMesh = function( geometry, material ) {\r\n\r\n\tTHREE.Mesh.call( this, geometry, material );\r\n\r\n\tthis.animationsMap = {};\r\n\tthis.animationsList = [];\r\n\r\n\t// prepare default animation\r\n\t// (all frames played together in 1 second)\r\n\r\n\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\tvar name = \"__default\";\r\n\r\n\tvar startFrame = 0;\r\n\tvar endFrame = numFrames - 1;\r\n\r\n\tvar fps = numFrames / 1;\r\n\r\n\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\tthis.setAnimationWeight( name, 1 );\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype = Object.create( THREE.Mesh.prototype );\r\nTHREE.MorphBlendMesh.prototype.constructor = THREE.MorphBlendMesh;\r\n\r\nTHREE.MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\tvar animation = {\r\n\r\n\t\tstart: start,\r\n\t\tend: end,\r\n\r\n\t\tlength: end - start + 1,\r\n\r\n\t\tfps: fps,\r\n\t\tduration: ( end - start ) / fps,\r\n\r\n\t\tlastFrame: 0,\r\n\t\tcurrentFrame: 0,\r\n\r\n\t\tactive: false,\r\n\r\n\t\ttime: 0,\r\n\t\tdirection: 1,\r\n\t\tweight: 1,\r\n\r\n\t\tdirectionBackwards: false,\r\n\t\tmirroredLoop: false\r\n\r\n\t};\r\n\r\n\tthis.animationsMap[ name ] = animation;\r\n\tthis.animationsList.push( animation );\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\tvar firstAnimation, frameRanges = {};\r\n\r\n\tvar geometry = this.geometry;\r\n\r\n\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfor ( var name in frameRanges ) {\r\n\r\n\t\tvar range = frameRanges[ name ];\r\n\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t}\r\n\r\n\tthis.firstAnimation = firstAnimation;\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.direction = 1;\r\n\t\tanimation.directionBackwards = false;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.direction = - 1;\r\n\t\tanimation.directionBackwards = true;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.fps = fps;\r\n\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.duration = duration;\r\n\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.weight = weight;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.time = time;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\tvar time = 0;\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\ttime = animation.time;\r\n\r\n\t}\r\n\r\n\treturn time;\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\tvar duration = - 1;\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tduration = animation.duration;\r\n\r\n\t}\r\n\r\n\treturn duration;\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.time = 0;\r\n\t\tanimation.active = true;\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.active = false;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\tif ( ! animation.active ) continue;\r\n\r\n\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\tvar keyframe = animation.start + THREE.Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\tvar weight = animation.weight;\r\n\r\n\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t}\r\n\r\n\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n// Export the THREE object for **Node.js**, with\r\n// backwards-compatibility for the old `require()` API. If we're in\r\n// the browser, add `_` as a global object via a string identifier,\r\n// for Closure Compiler \"advanced\" mode.\r\nif (typeof exports !== 'undefined') {\r\n if (typeof module !== 'undefined' && module.exports) {\r\n exports = module.exports = THREE;\r\n }\r\n exports.THREE = THREE;\r\n} else {\r\n this['THREE'] = THREE;\r\n}\r\n", "/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/sole/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/sole/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\n\n// performance.now polyfill\n( function ( root ) {\n\n\tif ( 'performance' in root === false ) {\n\t\troot.performance = {};\n\t}\n\n\t// IE 8\n\tDate.now = ( Date.now || function () {\n\t\treturn new Date().getTime();\n\t} );\n\n\tif ( 'now' in root.performance === false ) {\n\t\tvar offset = root.performance.timing && root.performance.timing.navigationStart ? performance.timing.navigationStart\n\t\t : Date.now();\n\n\t\troot.performance.now = function () {\n\t\t\treturn Date.now() - offset;\n\t\t};\n\t}\n\n} )( this );\n\nvar TWEEN = TWEEN || ( function () {\n\n\tvar _tweens = [];\n\n\treturn {\n\n\t\tREVISION: '14',\n\n\t\tgetAll: function () {\n\n\t\t\treturn _tweens;\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\t_tweens = [];\n\n\t\t},\n\n\t\tadd: function ( tween ) {\n\n\t\t\t_tweens.push( tween );\n\n\t\t},\n\n\t\tremove: function ( tween ) {\n\n\t\t\tvar i = _tweens.indexOf( tween );\n\n\t\t\tif ( i !== -1 ) {\n\n\t\t\t\t_tweens.splice( i, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: function ( time ) {\n\n\t\t\tif ( _tweens.length === 0 ) return false;\n\n\t\t\tvar i = 0;\n\n\t\t\ttime = time !== undefined ? time : window.performance.now();\n\n\t\t\twhile ( i < _tweens.length ) {\n\n\t\t\t\tif ( _tweens[ i ].update( time ) ) {\n\n\t\t\t\t\ti++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_tweens.splice( i, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\t};\n\n} )();\n\nTWEEN.Tween = function ( object ) {\n\n\tvar _object = object;\n\tvar _valuesStart = {};\n\tvar _valuesEnd = {};\n\tvar _valuesStartRepeat = {};\n\tvar _duration = 1000;\n\tvar _repeat = 0;\n\tvar _yoyo = false;\n\tvar _isPlaying = false;\n\tvar _reversed = false;\n\tvar _delayTime = 0;\n\tvar _startTime = null;\n\tvar _easingFunction = TWEEN.Easing.Linear.None;\n\tvar _interpolationFunction = TWEEN.Interpolation.Linear;\n\tvar _chainedTweens = [];\n\tvar _onStartCallback = null;\n\tvar _onStartCallbackFired = false;\n\tvar _onUpdateCallback = null;\n\tvar _onCompleteCallback = null;\n\tvar _onStopCallback = null;\n\n\t// Set all starting values present on the target object\n\tfor ( var field in object ) {\n\n\t\t_valuesStart[ field ] = parseFloat(object[field], 10);\n\n\t}\n\n\tthis.to = function ( properties, duration ) {\n\n\t\tif ( duration !== undefined ) {\n\n\t\t\t_duration = duration;\n\n\t\t}\n\n\t\t_valuesEnd = properties;\n\n\t\treturn this;\n\n\t};\n\n\tthis.start = function ( time ) {\n\n\t\tTWEEN.add( this );\n\n\t\t_isPlaying = true;\n\n\t\t_onStartCallbackFired = false;\n\n\t\t_startTime = time !== undefined ? time : window.performance.now();\n\t\t_startTime += _delayTime;\n\n\t\tfor ( var property in _valuesEnd ) {\n\n\t\t\t// check if an Array was provided as property value\n\t\t\tif ( _valuesEnd[ property ] instanceof Array ) {\n\n\t\t\t\tif ( _valuesEnd[ property ].length === 0 ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// create a local copy of the Array with the start value at the front\n\t\t\t\t_valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );\n\n\t\t\t}\n\n\t\t\t_valuesStart[ property ] = _object[ property ];\n\n\t\t\tif( ( _valuesStart[ property ] instanceof Array ) === false ) {\n\t\t\t\t_valuesStart[ property ] *= 1.0; // Ensures we're using numbers, not strings\n\t\t\t}\n\n\t\t\t_valuesStartRepeat[ property ] = _valuesStart[ property ] || 0;\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tthis.stop = function () {\n\n\t\tif ( !_isPlaying ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tTWEEN.remove( this );\n\t\t_isPlaying = false;\n\n\t\tif ( _onStopCallback !== null ) {\n\n\t\t\t_onStopCallback.call( _object );\n\n\t\t}\n\n\t\tthis.stopChainedTweens();\n\t\treturn this;\n\n\t};\n\n\tthis.stopChainedTweens = function () {\n\n\t\tfor ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {\n\n\t\t\t_chainedTweens[ i ].stop();\n\n\t\t}\n\n\t};\n\n\tthis.delay = function ( amount ) {\n\n\t\t_delayTime = amount;\n\t\treturn this;\n\n\t};\n\n\tthis.repeat = function ( times ) {\n\n\t\t_repeat = times;\n\t\treturn this;\n\n\t};\n\n\tthis.yoyo = function( yoyo ) {\n\n\t\t_yoyo = yoyo;\n\t\treturn this;\n\n\t};\n\n\n\tthis.easing = function ( easing ) {\n\n\t\t_easingFunction = easing;\n\t\treturn this;\n\n\t};\n\n\tthis.interpolation = function ( interpolation ) {\n\n\t\t_interpolationFunction = interpolation;\n\t\treturn this;\n\n\t};\n\n\tthis.chain = function () {\n\n\t\t_chainedTweens = arguments;\n\t\treturn this;\n\n\t};\n\n\tthis.onStart = function ( callback ) {\n\n\t\t_onStartCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.onUpdate = function ( callback ) {\n\n\t\t_onUpdateCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.onComplete = function ( callback ) {\n\n\t\t_onCompleteCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.onStop = function ( callback ) {\n\n\t\t_onStopCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.update = function ( time ) {\n\n\t\tvar property;\n\n\t\tif ( time < _startTime ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tif ( _onStartCallbackFired === false ) {\n\n\t\t\tif ( _onStartCallback !== null ) {\n\n\t\t\t\t_onStartCallback.call( _object );\n\n\t\t\t}\n\n\t\t\t_onStartCallbackFired = true;\n\n\t\t}\n\n\t\tvar elapsed = ( time - _startTime ) / _duration;\n\t\telapsed = elapsed > 1 ? 1 : elapsed;\n\n\t\tvar value = _easingFunction( elapsed );\n\n\t\tfor ( property in _valuesEnd ) {\n\n\t\t\tvar start = _valuesStart[ property ] || 0;\n\t\t\tvar end = _valuesEnd[ property ];\n\n\t\t\tif ( end instanceof Array ) {\n\n\t\t\t\t_object[ property ] = _interpolationFunction( end, value );\n\n\t\t\t} else {\n\n\t\t\t\t// Parses relative end values with start as base (e.g.: +10, -3)\n\t\t\t\tif ( typeof(end) === \"string\" ) {\n\t\t\t\t\tend = start + parseFloat(end, 10);\n\t\t\t\t}\n\n\t\t\t\t// protect against non numeric properties.\n\t\t\t\tif ( typeof(end) === \"number\" ) {\n\t\t\t\t\t_object[ property ] = start + ( end - start ) * value;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( _onUpdateCallback !== null ) {\n\n\t\t\t_onUpdateCallback.call( _object, value );\n\n\t\t}\n\n\t\tif ( elapsed == 1 ) {\n\n\t\t\tif ( _repeat > 0 ) {\n\n\t\t\t\tif( isFinite( _repeat ) ) {\n\t\t\t\t\t_repeat--;\n\t\t\t\t}\n\n\t\t\t\t// reassign starting values, restart by making startTime = now\n\t\t\t\tfor( property in _valuesStartRepeat ) {\n\n\t\t\t\t\tif ( typeof( _valuesEnd[ property ] ) === \"string\" ) {\n\t\t\t\t\t\t_valuesStartRepeat[ property ] = _valuesStartRepeat[ property ] + parseFloat(_valuesEnd[ property ], 10);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_yoyo) {\n\t\t\t\t\t\tvar tmp = _valuesStartRepeat[ property ];\n\t\t\t\t\t\t_valuesStartRepeat[ property ] = _valuesEnd[ property ];\n\t\t\t\t\t\t_valuesEnd[ property ] = tmp;\n\t\t\t\t\t}\n\n\t\t\t\t\t_valuesStart[ property ] = _valuesStartRepeat[ property ];\n\n\t\t\t\t}\n\n\t\t\t\tif (_yoyo) {\n\t\t\t\t\t_reversed = !_reversed;\n\t\t\t\t}\n\n\t\t\t\t_startTime = time + _delayTime;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\tif ( _onCompleteCallback !== null ) {\n\n\t\t\t\t\t_onCompleteCallback.call( _object );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {\n\n\t\t\t\t\t_chainedTweens[ i ].start( time );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n};\n\n\nTWEEN.Easing = {\n\n\tLinear: {\n\n\t\tNone: function ( k ) {\n\n\t\t\treturn k;\n\n\t\t}\n\n\t},\n\n\tQuadratic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn k * ( 2 - k );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * k * k;\n\t\t\treturn - 0.5 * ( --k * ( k - 2 ) - 1 );\n\n\t\t}\n\n\t},\n\n\tCubic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn --k * k * k + 1;\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;\n\t\t\treturn 0.5 * ( ( k -= 2 ) * k * k + 2 );\n\n\t\t}\n\n\t},\n\n\tQuartic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k * k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn 1 - ( --k * k * k * k );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;\n\t\t\treturn - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );\n\n\t\t}\n\n\t},\n\n\tQuintic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k * k * k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn --k * k * k * k * k + 1;\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;\n\t\t\treturn 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );\n\n\t\t}\n\n\t},\n\n\tSinusoidal: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn 1 - Math.cos( k * Math.PI / 2 );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn Math.sin( k * Math.PI / 2 );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\treturn 0.5 * ( 1 - Math.cos( Math.PI * k ) );\n\n\t\t}\n\n\t},\n\n\tExponential: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k === 0 ? 0 : Math.pow( 1024, k - 1 );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );\n\t\t\treturn 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );\n\n\t\t}\n\n\t},\n\n\tCircular: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn 1 - Math.sqrt( 1 - k * k );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn Math.sqrt( 1 - ( --k * k ) );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);\n\t\t\treturn 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);\n\n\t\t}\n\n\t},\n\n\tElastic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\treturn - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\tif ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n\t\t\treturn a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;\n\n\t\t}\n\n\t},\n\n\tBack: {\n\n\t\tIn: function ( k ) {\n\n\t\t\tvar s = 1.70158;\n\t\t\treturn k * k * ( ( s + 1 ) * k - s );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\tvar s = 1.70158;\n\t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tvar s = 1.70158 * 1.525;\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );\n\t\t\treturn 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );\n\n\t\t}\n\n\t},\n\n\tBounce: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn 1 - TWEEN.Easing.Bounce.Out( 1 - k );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\tif ( k < ( 1 / 2.75 ) ) {\n\n\t\t\t\treturn 7.5625 * k * k;\n\n\t\t\t} else if ( k < ( 2 / 2.75 ) ) {\n\n\t\t\t\treturn 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;\n\n\t\t\t} else if ( k < ( 2.5 / 2.75 ) ) {\n\n\t\t\t\treturn 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;\n\n\t\t\t} else {\n\n\t\t\t\treturn 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;\n\n\t\t\t}\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;\n\t\t\treturn TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;\n\n\t\t}\n\n\t}\n\n};\n\nTWEEN.Interpolation = {\n\n\tLinear: function ( v, k ) {\n\n\t\tvar m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;\n\n\t\tif ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );\n\t\tif ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );\n\n\t\treturn fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );\n\n\t},\n\n\tBezier: function ( v, k ) {\n\n\t\tvar b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;\n\n\t\tfor ( i = 0; i <= n; i++ ) {\n\t\t\tb += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );\n\t\t}\n\n\t\treturn b;\n\n\t},\n\n\tCatmullRom: function ( v, k ) {\n\n\t\tvar m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;\n\n\t\tif ( v[ 0 ] === v[ m ] ) {\n\n\t\t\tif ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );\n\n\t\t\treturn fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );\n\n\t\t} else {\n\n\t\t\tif ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );\n\t\t\tif ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );\n\n\t\t\treturn fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );\n\n\t\t}\n\n\t},\n\n\tUtils: {\n\n\t\tLinear: function ( p0, p1, t ) {\n\n\t\t\treturn ( p1 - p0 ) * t + p0;\n\n\t\t},\n\n\t\tBernstein: function ( n , i ) {\n\n\t\t\tvar fc = TWEEN.Interpolation.Utils.Factorial;\n\t\t\treturn fc( n ) / fc( i ) / fc( n - i );\n\n\t\t},\n\n\t\tFactorial: ( function () {\n\n\t\t\tvar a = [ 1 ];\n\n\t\t\treturn function ( n ) {\n\n\t\t\t\tvar s = 1, i;\n\t\t\t\tif ( a[ n ] ) return a[ n ];\n\t\t\t\tfor ( i = n; i > 1; i-- ) s *= i;\n\t\t\t\treturn a[ n ] = s;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tCatmullRom: function ( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n};\n\n// UMD (Universal Module Definition)\n( function ( root ) {\n\n\tif ( typeof define === 'function' && define.amd ) {\n\n\t\t// AMD\n\t\tdefine( [], function () {\n\t\t\treturn TWEEN;\n\t\t} );\n\n\t} else if ( typeof exports === 'object' ) {\n\n\t\t// Node.js\n\t\tmodule.exports = TWEEN;\n\n\t} else {\n\n\t\t// Global variable\n\t\troot.TWEEN = TWEEN;\n\n\t}\n\n} )( this );\n", "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n typeof resolver !== 'function' && lib$es6$promise$promise$$needsResolver();\n this instanceof lib$es6$promise$promise$$Promise ? lib$es6$promise$$internal$$initializePromise(this, resolver) : lib$es6$promise$promise$$needsNew();\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n\n Chaining\n --------\n\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n\n Assimilation\n ------------\n\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n\n If the assimliated promise rejects, then the downstream promise will also reject.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n\n Simple Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var result;\n\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n\n Advanced Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var author, books;\n\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n\n function foundBooks(books) {\n\n }\n\n function failure(reason) {\n\n }\n\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n then: lib$es6$promise$then$$default,\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (Array.isArray(input)) {\n this._input = input;\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n lib$es6$promise$$internal$$fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate();\n if (this._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(this.promise, this._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(this.promise, this._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var length = this.length;\n var input = this._input;\n\n for (var i = 0; this._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var c = this._instanceConstructor;\n var resolve = c.resolve;\n\n if (resolve === lib$es6$promise$promise$resolve$$default) {\n var then = lib$es6$promise$$internal$$getThen(entry);\n\n if (then === lib$es6$promise$then$$default &&\n entry._state !== lib$es6$promise$$internal$$PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === lib$es6$promise$promise$$default) {\n var promise = new c(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$handleMaybeThenable(promise, entry, then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function(resolve) { resolve(entry); }), i);\n }\n } else {\n this._willSettleAt(resolve(entry), i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var promise = this.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n this._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, this._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n}).call(this,_dereq_('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"_process\":3}],2:[function(_dereq_,module,exports){\n/* eslint-disable no-unused-vars */\n'use strict';\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (Object.getOwnPropertySymbols) {\n\t\t\tsymbols = Object.getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n},{}],3:[function(_dereq_,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],4:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = _dereq_('./util.js');\nvar WakeLock = _dereq_('./wakelock.js');\n\n// Start at a higher number to reduce chance of conflict.\nvar nextDisplayId = 1000;\nvar hasShowDeprecationWarning = false;\n\n/**\n * The base class for all VR displays.\n */\nfunction VRDisplay() {\n this.isPolyfilled = true;\n this.displayId = nextDisplayId++;\n this.displayName = 'webvr-polyfill displayName';\n\n this.isConnected = true;\n this.isPresenting = false;\n this.capabilities = {\n hasPosition: false,\n hasOrientation: false,\n hasExternalDisplay: false,\n canPresent: false,\n maxLayers: 1\n };\n this.stageParameters = null;\n\n // \"Private\" members.\n this.waitingForPresent_ = false;\n this.layer_ = null;\n\n this.fullscreenElement_ = null;\n this.fullscreenWrapper_ = null;\n this.fullscreenElementCachedStyle_ = null;\n\n this.fullscreenEventTarget_ = null;\n this.fullscreenChangeHandler_ = null;\n this.fullscreenErrorHandler_ = null;\n\n this.wakelock_ = new WakeLock();\n}\n\nVRDisplay.prototype.getPose = function() {\n // TODO: Technically this should retain it's value for the duration of a frame\n // but I doubt that's practical to do in javascript.\n return this.getImmediatePose();\n};\n\nVRDisplay.prototype.requestAnimationFrame = function(callback) {\n return window.requestAnimationFrame(callback);\n};\n\nVRDisplay.prototype.cancelAnimationFrame = function(id) {\n return window.cancelAnimationFrame(id);\n};\n\nVRDisplay.prototype.wrapForFullscreen = function(element) {\n // Don't wrap in iOS.\n if (Util.isIOS()) {\n return element;\n }\n if (!this.fullscreenWrapper_) {\n this.fullscreenWrapper_ = document.createElement('div');\n var cssProperties = [\n 'height: ' + Math.min(screen.height, screen.width) + 'px !important',\n 'top: 0 !important',\n 'left: 0 !important',\n 'right: 0 !important',\n 'border: 0',\n 'margin: 0',\n 'padding: 0',\n 'z-index: 999999 !important',\n 'position: fixed',\n ];\n this.fullscreenWrapper_.setAttribute('style', cssProperties.join('; ') + ';');\n this.fullscreenWrapper_.classList.add('webvr-polyfill-fullscreen-wrapper');\n }\n\n if (this.fullscreenElement_ == element) {\n return this.fullscreenWrapper_;\n }\n\n // Remove any previously applied wrappers\n this.removeFullscreenWrapper();\n\n this.fullscreenElement_ = element;\n var parent = this.fullscreenElement_.parentElement;\n parent.insertBefore(this.fullscreenWrapper_, this.fullscreenElement_);\n parent.removeChild(this.fullscreenElement_);\n this.fullscreenWrapper_.insertBefore(this.fullscreenElement_, this.fullscreenWrapper_.firstChild);\n this.fullscreenElementCachedStyle_ = this.fullscreenElement_.getAttribute('style');\n\n var self = this;\n function applyFullscreenElementStyle() {\n if (!self.fullscreenElement_) {\n return;\n }\n\n var cssProperties = [\n 'position: absolute',\n 'top: 0',\n 'left: 0',\n 'width: ' + Math.max(screen.width, screen.height) + 'px',\n 'height: ' + Math.min(screen.height, screen.width) + 'px',\n 'border: 0',\n 'margin: 0',\n 'padding: 0',\n ];\n self.fullscreenElement_.setAttribute('style', cssProperties.join('; ') + ';');\n }\n\n applyFullscreenElementStyle();\n\n return this.fullscreenWrapper_;\n};\n\nVRDisplay.prototype.removeFullscreenWrapper = function() {\n if (!this.fullscreenElement_) {\n return;\n }\n\n var element = this.fullscreenElement_;\n if (this.fullscreenElementCachedStyle_) {\n element.setAttribute('style', this.fullscreenElementCachedStyle_);\n } else {\n element.removeAttribute('style');\n }\n this.fullscreenElement_ = null;\n this.fullscreenElementCachedStyle_ = null;\n\n var parent = this.fullscreenWrapper_.parentElement;\n this.fullscreenWrapper_.removeChild(element);\n parent.insertBefore(element, this.fullscreenWrapper_);\n parent.removeChild(this.fullscreenWrapper_);\n\n return element;\n};\n\nVRDisplay.prototype.requestPresent = function(layers) {\n if (this.isPresenting) {\n console.error('Already presenting!');\n return;\n }\n var self = this;\n\n if (!(layers instanceof Array)) {\n if (!hasShowDeprecationWarning) {\n console.warn(\"Using a deprecated form of requestPresent. Should pass in an array of VRLayers.\");\n hasShowDeprecationWarning = true;\n }\n layers = [layers];\n }\n\n return new Promise(function(resolve, reject) {\n if (!self.capabilities.canPresent) {\n reject(new Error('VRDisplay is not capable of presenting.'));\n return;\n }\n\n if (layers.length == 0 || layers.length > self.capabilities.maxLayers) {\n reject(new Error('Invalid number of layers.'));\n return;\n }\n\n self.layer_ = layers[0];\n\n self.waitingForPresent_ = false;\n if (self.layer_ && self.layer_.source) {\n var fullscreenElement = self.wrapForFullscreen(self.layer_.source);\n\n function onFullscreenChange() {\n var actualFullscreenElement = Util.getFullscreenElement();\n\n self.isPresenting = (fullscreenElement === actualFullscreenElement);\n if (self.isPresenting) {\n if (screen.orientation && screen.orientation.lock) {\n screen.orientation.lock('landscape-primary');\n }\n self.waitingForPresent_ = false;\n self.beginPresent_();\n resolve();\n } else {\n if (screen.orientation && screen.orientation.unlock) {\n screen.orientation.unlock();\n }\n self.removeFullscreenWrapper();\n self.wakelock_.release();\n self.endPresent_();\n self.removeFullscreenListeners_();\n }\n self.fireVRDisplayPresentChange_();\n }\n function onFullscreenError() {\n if (!self.waitingForPresent_) {\n return;\n }\n\n self.removeFullscreenWrapper();\n self.removeFullscreenListeners_();\n\n self.wakelock_.release();\n self.waitingForPresent_ = false;\n self.isPresenting = false;\n\n reject(new Error('Unable to present.'));\n }\n\n self.addFullscreenListeners_(fullscreenElement,\n onFullscreenChange, onFullscreenError);\n\n if (Util.requestFullscreen(fullscreenElement)) {\n self.wakelock_.request();\n self.waitingForPresent_ = true;\n } else if (Util.isIOS()) {\n // *sigh* Just fake it.\n self.wakelock_.request();\n self.isPresenting = true;\n self.beginPresent_();\n self.fireVRDisplayPresentChange_();\n resolve();\n }\n }\n\n if (!self.waitingForPresent_ && !Util.isIOS()) {\n Util.exitFullscreen();\n reject(new Error('Unable to present.'));\n }\n });\n};\n\nVRDisplay.prototype.exitPresent = function() {\n var wasPresenting = this.isPresenting;\n var self = this;\n this.isPresenting = false;\n this.layer_ = null;\n this.wakelock_.release();\n\n return new Promise(function(resolve, reject) {\n if (wasPresenting) {\n if (!Util.exitFullscreen() && Util.isIOS()) {\n self.endPresent_();\n self.fireVRDisplayPresentChange_();\n }\n\n resolve();\n } else {\n reject(new Error('Was not presenting to VRDisplay.'));\n }\n });\n};\n\nVRDisplay.prototype.getLayers = function() {\n if (this.layer_) {\n return [this.layer_];\n }\n return [];\n};\n\nVRDisplay.prototype.fireVRDisplayPresentChange_ = function() {\n var event = new CustomEvent('vrdisplaypresentchange', {detail: {vrdisplay: this}});\n window.dispatchEvent(event);\n};\n\nVRDisplay.prototype.addFullscreenListeners_ = function(element, changeHandler, errorHandler) {\n this.removeFullscreenListeners_();\n\n this.fullscreenEventTarget_ = element;\n this.fullscreenChangeHandler_ = changeHandler;\n this.fullscreenErrorHandler_ = errorHandler;\n\n if (changeHandler) {\n element.addEventListener('fullscreenchange', changeHandler, false);\n element.addEventListener('webkitfullscreenchange', changeHandler, false);\n document.addEventListener('mozfullscreenchange', changeHandler, false);\n element.addEventListener('msfullscreenchange', changeHandler, false);\n }\n\n if (errorHandler) {\n element.addEventListener('fullscreenerror', errorHandler, false);\n element.addEventListener('webkitfullscreenerror', errorHandler, false);\n document.addEventListener('mozfullscreenerror', errorHandler, false);\n element.addEventListener('msfullscreenerror', errorHandler, false);\n }\n};\n\nVRDisplay.prototype.removeFullscreenListeners_ = function() {\n if (!this.fullscreenEventTarget_)\n return;\n\n var element = this.fullscreenEventTarget_;\n\n if (this.fullscreenChangeHandler_) {\n var changeHandler = this.fullscreenChangeHandler_;\n element.removeEventListener('fullscreenchange', changeHandler, false);\n element.removeEventListener('webkitfullscreenchange', changeHandler, false);\n document.removeEventListener('mozfullscreenchange', changeHandler, false);\n element.removeEventListener('msfullscreenchange', changeHandler, false);\n }\n\n if (this.fullscreenErrorHandler_) {\n var errorHandler = this.fullscreenErrorHandler_;\n element.removeEventListener('fullscreenerror', errorHandler, false);\n element.removeEventListener('webkitfullscreenerror', errorHandler, false);\n document.removeEventListener('mozfullscreenerror', errorHandler, false);\n element.removeEventListener('msfullscreenerror', errorHandler, false);\n }\n\n this.fullscreenEventTarget_ = null;\n this.fullscreenChangeHandler_ = null;\n this.fullscreenErrorHandler_ = null;\n};\n\nVRDisplay.prototype.beginPresent_ = function() {\n // Override to add custom behavior when presentation begins.\n};\n\nVRDisplay.prototype.endPresent_ = function() {\n // Override to add custom behavior when presentation ends.\n};\n\nVRDisplay.prototype.submitFrame = function(pose) {\n // Override to add custom behavior for frame submission.\n};\n\nVRDisplay.prototype.getEyeParameters = function(whichEye) {\n // Override to return accurate eye parameters if canPresent is true.\n return null;\n};\n\n/*\n * Deprecated classes\n */\n\n/**\n * The base class for all VR devices. (Deprecated)\n */\nfunction VRDevice() {\n this.isPolyfilled = true;\n this.hardwareUnitId = 'webvr-polyfill hardwareUnitId';\n this.deviceId = 'webvr-polyfill deviceId';\n this.deviceName = 'webvr-polyfill deviceName';\n}\n\n/**\n * The base class for all VR HMD devices. (Deprecated)\n */\nfunction HMDVRDevice() {\n}\nHMDVRDevice.prototype = new VRDevice();\n\n/**\n * The base class for all VR position sensor devices. (Deprecated)\n */\nfunction PositionSensorVRDevice() {\n}\nPositionSensorVRDevice.prototype = new VRDevice();\n\nmodule.exports.VRDisplay = VRDisplay;\nmodule.exports.VRDevice = VRDevice;\nmodule.exports.HMDVRDevice = HMDVRDevice;\nmodule.exports.PositionSensorVRDevice = PositionSensorVRDevice;\n\n},{\"./util.js\":24,\"./wakelock.js\":26}],5:[function(_dereq_,module,exports){\n/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar CardboardUI = _dereq_('./cardboard-ui.js');\nvar Util = _dereq_('./util.js');\nvar WGLUPreserveGLState = _dereq_('./deps/wglu-preserve-state.js');\n\nvar distortionVS = [\n 'attribute vec2 position;',\n 'attribute vec3 texCoord;',\n\n 'varying vec2 vTexCoord;',\n\n 'uniform vec4 viewportOffsetScale[2];',\n\n 'void main() {',\n ' vec4 viewport = viewportOffsetScale[int(texCoord.z)];',\n ' vTexCoord = (texCoord.xy * viewport.zw) + viewport.xy;',\n ' gl_Position = vec4( position, 1.0, 1.0 );',\n '}',\n].join('\\n');\n\nvar distortionFS = [\n 'precision mediump float;',\n 'uniform sampler2D diffuse;',\n\n 'varying vec2 vTexCoord;',\n\n 'void main() {',\n ' gl_FragColor = texture2D(diffuse, vTexCoord);',\n '}',\n].join('\\n');\n\n/**\n * A mesh-based distorter.\n */\nfunction CardboardDistorter(gl) {\n this.gl = gl;\n this.ctxAttribs = gl.getContextAttributes();\n\n this.meshWidth = 20;\n this.meshHeight = 20;\n\n this.bufferScale = WebVRConfig.BUFFER_SCALE;\n\n this.bufferWidth = gl.drawingBufferWidth;\n this.bufferHeight = gl.drawingBufferHeight;\n\n // Patching support\n this.realBindFramebuffer = gl.bindFramebuffer;\n this.realEnable = gl.enable;\n this.realDisable = gl.disable;\n this.realColorMask = gl.colorMask;\n this.realClearColor = gl.clearColor;\n this.realViewport = gl.viewport;\n\n if (!Util.isIOS()) {\n this.realCanvasWidth = Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'width');\n this.realCanvasHeight = Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'height');\n }\n\n this.isPatched = false;\n\n // State tracking\n this.lastBoundFramebuffer = null;\n this.cullFace = false;\n this.depthTest = false;\n this.blend = false;\n this.scissorTest = false;\n this.stencilTest = false;\n this.viewport = [0, 0, 0, 0];\n this.colorMask = [true, true, true, true];\n this.clearColor = [0, 0, 0, 0];\n\n this.attribs = {\n position: 0,\n texCoord: 1\n };\n this.program = Util.linkProgram(gl, distortionVS, distortionFS, this.attribs);\n this.uniforms = Util.getProgramUniforms(gl, this.program);\n\n this.viewportOffsetScale = new Float32Array(8);\n this.setTextureBounds();\n\n this.vertexBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n this.indexCount = 0;\n\n this.renderTarget = gl.createTexture();\n this.framebuffer = gl.createFramebuffer();\n\n this.depthStencilBuffer = null;\n this.depthBuffer = null;\n this.stencilBuffer = null;\n\n if (this.ctxAttribs.depth && this.ctxAttribs.stencil) {\n this.depthStencilBuffer = gl.createRenderbuffer();\n } else if (this.ctxAttribs.depth) {\n this.depthBuffer = gl.createRenderbuffer();\n } else if (this.ctxAttribs.stencil) {\n this.stencilBuffer = gl.createRenderbuffer();\n }\n\n this.patch();\n\n this.onResize();\n\n if (!WebVRConfig.CARDBOARD_UI_DISABLED) {\n this.cardboardUI = new CardboardUI(gl);\n }\n};\n\n/**\n * Tears down all the resources created by the distorter and removes any\n * patches.\n */\nCardboardDistorter.prototype.destroy = function() {\n var gl = this.gl;\n\n this.unpatch();\n\n gl.deleteProgram(this.program);\n gl.deleteBuffer(this.vertexBuffer);\n gl.deleteBuffer(this.indexBuffer);\n gl.deleteTexture(this.renderTarget);\n gl.deleteFramebuffer(this.framebuffer);\n if (this.depthStencilBuffer) {\n gl.deleteRenderbuffer(this.depthStencilBuffer);\n }\n if (this.depthBuffer) {\n gl.deleteRenderbuffer(this.depthBuffer);\n }\n if (this.stencilBuffer) {\n gl.deleteRenderbuffer(this.stencilBuffer);\n }\n\n if (this.cardboardUI) {\n this.cardboardUI.destroy();\n }\n};\n\n\n/**\n * Resizes the backbuffer to match the canvas width and height.\n */\nCardboardDistorter.prototype.onResize = function() {\n var gl = this.gl;\n var self = this;\n\n var glState = [\n gl.RENDERBUFFER_BINDING,\n gl.TEXTURE_BINDING_2D, gl.TEXTURE0\n ];\n\n WGLUPreserveGLState(gl, glState, function(gl) {\n // Bind real backbuffer and clear it once. We don't need to clear it again\n // after that because we're overwriting the same area every frame.\n self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);\n\n // Put things in a good state\n if (self.scissorTest) { self.realDisable.call(gl, gl.SCISSOR_TEST); }\n self.realColorMask.call(gl, true, true, true, true);\n self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n self.realClearColor.call(gl, 0, 0, 0, 1);\n\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Now bind and resize the fake backbuffer\n self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.framebuffer);\n\n gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);\n gl.texImage2D(gl.TEXTURE_2D, 0, self.ctxAttribs.alpha ? gl.RGBA : gl.RGB,\n self.bufferWidth, self.bufferHeight, 0,\n self.ctxAttribs.alpha ? gl.RGBA : gl.RGB, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, self.renderTarget, 0);\n\n if (self.ctxAttribs.depth && self.ctxAttribs.stencil) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthStencilBuffer);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL,\n self.bufferWidth, self.bufferHeight);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT,\n gl.RENDERBUFFER, self.depthStencilBuffer);\n } else if (self.ctxAttribs.depth) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthBuffer);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16,\n self.bufferWidth, self.bufferHeight);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER, self.depthBuffer);\n } else if (self.ctxAttribs.stencil) {\n gl.bindRenderbuffer(gl.RENDERBUFFER, self.stencilBuffer);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8,\n self.bufferWidth, self.bufferHeight);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT,\n gl.RENDERBUFFER, self.stencilBuffer);\n }\n\n if (!gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {\n console.error('Framebuffer incomplete!');\n }\n\n self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);\n\n if (self.scissorTest) { self.realEnable.call(gl, gl.SCISSOR_TEST); }\n\n self.realColorMask.apply(gl, self.colorMask);\n self.realViewport.apply(gl, self.viewport);\n self.realClearColor.apply(gl, self.clearColor);\n });\n\n if (this.cardboardUI) {\n this.cardboardUI.onResize();\n }\n};\n\nCardboardDistorter.prototype.patch = function() {\n if (this.isPatched) {\n return;\n }\n\n var self = this;\n var canvas = this.gl.canvas;\n var gl = this.gl;\n\n if (!Util.isIOS()) {\n canvas.width = Util.getScreenWidth() * this.bufferScale;\n canvas.height = Util.getScreenHeight() * this.bufferScale;\n\n Object.defineProperty(canvas, 'width', {\n configurable: true,\n enumerable: true,\n get: function() {\n return self.bufferWidth;\n },\n set: function(value) {\n self.bufferWidth = value;\n self.onResize();\n }\n });\n\n Object.defineProperty(canvas, 'height', {\n configurable: true,\n enumerable: true,\n get: function() {\n return self.bufferHeight;\n },\n set: function(value) {\n self.bufferHeight = value;\n self.onResize();\n }\n });\n }\n\n this.lastBoundFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);\n\n if (this.lastBoundFramebuffer == null) {\n this.lastBoundFramebuffer = this.framebuffer;\n this.gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n }\n\n this.gl.bindFramebuffer = function(target, framebuffer) {\n self.lastBoundFramebuffer = framebuffer ? framebuffer : self.framebuffer;\n // Silently make calls to bind the default framebuffer bind ours instead.\n self.realBindFramebuffer.call(gl, target, self.lastBoundFramebuffer);\n };\n\n this.cullFace = gl.getParameter(gl.CULL_FACE);\n this.depthTest = gl.getParameter(gl.DEPTH_TEST);\n this.blend = gl.getParameter(gl.BLEND);\n this.scissorTest = gl.getParameter(gl.SCISSOR_TEST);\n this.stencilTest = gl.getParameter(gl.STENCIL_TEST);\n\n gl.enable = function(pname) {\n switch (pname) {\n case gl.CULL_FACE: self.cullFace = true; break;\n case gl.DEPTH_TEST: self.depthTest = true; break;\n case gl.BLEND: self.blend = true; break;\n case gl.SCISSOR_TEST: self.scissorTest = true; break;\n case gl.STENCIL_TEST: self.stencilTest = true; break;\n }\n self.realEnable.call(gl, pname);\n };\n\n gl.disable = function(pname) {\n switch (pname) {\n case gl.CULL_FACE: self.cullFace = false; break;\n case gl.DEPTH_TEST: self.depthTest = false; break;\n case gl.BLEND: self.blend = false; break;\n case gl.SCISSOR_TEST: self.scissorTest = false; break;\n case gl.STENCIL_TEST: self.stencilTest = false; break;\n }\n self.realDisable.call(gl, pname);\n };\n\n this.colorMask = gl.getParameter(gl.COLOR_WRITEMASK);\n gl.colorMask = function(r, g, b, a) {\n self.colorMask[0] = r;\n self.colorMask[1] = g;\n self.colorMask[2] = b;\n self.colorMask[3] = a;\n self.realColorMask.call(gl, r, g, b, a);\n };\n\n this.clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);\n gl.clearColor = function(r, g, b, a) {\n self.clearColor[0] = r;\n self.clearColor[1] = g;\n self.clearColor[2] = b;\n self.clearColor[3] = a;\n self.realClearColor.call(gl, r, g, b, a);\n };\n\n this.viewport = gl.getParameter(gl.VIEWPORT);\n gl.viewport = function(x, y, w, h) {\n self.viewport[0] = x;\n self.viewport[1] = y;\n self.viewport[2] = w;\n self.viewport[3] = h;\n self.realViewport.call(gl, x, y, w, h);\n };\n\n this.isPatched = true;\n Util.safariCssSizeWorkaround(canvas);\n};\n\nCardboardDistorter.prototype.unpatch = function() {\n if (!this.isPatched) {\n return;\n }\n\n var gl = this.gl;\n var canvas = this.gl.canvas;\n\n if (!Util.isIOS()) {\n Object.defineProperty(canvas, 'width', this.realCanvasWidth);\n Object.defineProperty(canvas, 'height', this.realCanvasHeight);\n }\n canvas.width = this.bufferWidth;\n canvas.height = this.bufferHeight;\n\n gl.bindFramebuffer = this.realBindFramebuffer;\n gl.enable = this.realEnable;\n gl.disable = this.realDisable;\n gl.colorMask = this.realColorMask;\n gl.clearColor = this.realClearColor;\n gl.viewport = this.realViewport;\n\n // Check to see if our fake backbuffer is bound and bind the real backbuffer\n // if that's the case.\n if (this.lastBoundFramebuffer == this.framebuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n this.isPatched = false;\n\n setTimeout(function() {\n Util.safariCssSizeWorkaround(canvas);\n }, 1);\n};\n\nCardboardDistorter.prototype.setTextureBounds = function(leftBounds, rightBounds) {\n if (!leftBounds) {\n leftBounds = [0, 0, 0.5, 1];\n }\n\n if (!rightBounds) {\n rightBounds = [0.5, 0, 0.5, 1];\n }\n\n // Left eye\n this.viewportOffsetScale[0] = leftBounds[0]; // X\n this.viewportOffsetScale[1] = leftBounds[1]; // Y\n this.viewportOffsetScale[2] = leftBounds[2]; // Width\n this.viewportOffsetScale[3] = leftBounds[3]; // Height\n\n // Right eye\n this.viewportOffsetScale[4] = rightBounds[0]; // X\n this.viewportOffsetScale[5] = rightBounds[1]; // Y\n this.viewportOffsetScale[6] = rightBounds[2]; // Width\n this.viewportOffsetScale[7] = rightBounds[3]; // Height\n};\n\n/**\n * Performs distortion pass on the injected backbuffer, rendering it to the real\n * backbuffer.\n */\nCardboardDistorter.prototype.submitFrame = function() {\n var gl = this.gl;\n var self = this;\n\n var glState = [];\n\n if (!WebVRConfig.DIRTY_SUBMIT_FRAME_BINDINGS) {\n glState.push(\n gl.CURRENT_PROGRAM,\n gl.ARRAY_BUFFER_BINDING,\n gl.ELEMENT_ARRAY_BUFFER_BINDING,\n gl.TEXTURE_BINDING_2D, gl.TEXTURE0\n );\n }\n\n WGLUPreserveGLState(gl, glState, function(gl) {\n // Bind the real default framebuffer\n self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);\n\n // Make sure the GL state is in a good place\n if (self.cullFace) { self.realDisable.call(gl, gl.CULL_FACE); }\n if (self.depthTest) { self.realDisable.call(gl, gl.DEPTH_TEST); }\n if (self.blend) { self.realDisable.call(gl, gl.BLEND); }\n if (self.scissorTest) { self.realDisable.call(gl, gl.SCISSOR_TEST); }\n if (self.stencilTest) { self.realDisable.call(gl, gl.STENCIL_TEST); }\n self.realColorMask.call(gl, true, true, true, true);\n self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n // If the backbuffer has an alpha channel clear every frame so the page\n // doesn't show through.\n if (self.ctxAttribs.alpha || Util.isIOS()) {\n self.realClearColor.call(gl, 0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n // Bind distortion program and mesh\n gl.useProgram(self.program);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n gl.enableVertexAttribArray(self.attribs.position);\n gl.enableVertexAttribArray(self.attribs.texCoord);\n gl.vertexAttribPointer(self.attribs.position, 2, gl.FLOAT, false, 20, 0);\n gl.vertexAttribPointer(self.attribs.texCoord, 3, gl.FLOAT, false, 20, 8);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.uniform1i(self.uniforms.diffuse, 0);\n gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);\n\n gl.uniform4fv(self.uniforms.viewportOffsetScale, self.viewportOffsetScale);\n\n // Draws both eyes\n gl.drawElements(gl.TRIANGLES, self.indexCount, gl.UNSIGNED_SHORT, 0);\n\n if (self.cardboardUI) {\n self.cardboardUI.renderNoState();\n }\n\n // Bind the fake default framebuffer again\n self.realBindFramebuffer.call(self.gl, gl.FRAMEBUFFER, self.framebuffer);\n\n // If preserveDrawingBuffer == false clear the framebuffer\n if (!self.ctxAttribs.preserveDrawingBuffer) {\n self.realClearColor.call(gl, 0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n if (!WebVRConfig.DIRTY_SUBMIT_FRAME_BINDINGS) {\n self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);\n }\n\n // Restore state\n if (self.cullFace) { self.realEnable.call(gl, gl.CULL_FACE); }\n if (self.depthTest) { self.realEnable.call(gl, gl.DEPTH_TEST); }\n if (self.blend) { self.realEnable.call(gl, gl.BLEND); }\n if (self.scissorTest) { self.realEnable.call(gl, gl.SCISSOR_TEST); }\n if (self.stencilTest) { self.realEnable.call(gl, gl.STENCIL_TEST); }\n\n self.realColorMask.apply(gl, self.colorMask);\n self.realViewport.apply(gl, self.viewport);\n if (self.ctxAttribs.alpha || !self.ctxAttribs.preserveDrawingBuffer) {\n self.realClearColor.apply(gl, self.clearColor);\n }\n });\n\n // Workaround for the fact that Safari doesn't allow us to patch the canvas\n // width and height correctly. After each submit frame check to see what the\n // real backbuffer size has been set to and resize the fake backbuffer size\n // to match.\n if (Util.isIOS()) {\n var canvas = gl.canvas;\n if (canvas.width != self.bufferWidth || canvas.height != self.bufferHeight) {\n self.bufferWidth = canvas.width;\n self.bufferHeight = canvas.height;\n self.onResize();\n }\n }\n};\n\n/**\n * Call when the deviceInfo has changed. At this point we need\n * to re-calculate the distortion mesh.\n */\nCardboardDistorter.prototype.updateDeviceInfo = function(deviceInfo) {\n var gl = this.gl;\n var self = this;\n\n var glState = [gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING];\n WGLUPreserveGLState(gl, glState, function(gl) {\n var vertices = self.computeMeshVertices_(self.meshWidth, self.meshHeight, deviceInfo);\n gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n // Indices don't change based on device parameters, so only compute once.\n if (!self.indexCount) {\n var indices = self.computeMeshIndices_(self.meshWidth, self.meshHeight);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n self.indexCount = indices.length;\n }\n });\n};\n\n/**\n * Build the distortion mesh vertices.\n * Based on code from the Unity cardboard plugin.\n */\nCardboardDistorter.prototype.computeMeshVertices_ = function(width, height, deviceInfo) {\n var vertices = new Float32Array(2 * width * height * 5);\n\n var lensFrustum = deviceInfo.getLeftEyeVisibleTanAngles();\n var noLensFrustum = deviceInfo.getLeftEyeNoLensTanAngles();\n var viewport = deviceInfo.getLeftEyeVisibleScreenRect(noLensFrustum);\n var vidx = 0;\n var iidx = 0;\n for (var e = 0; e < 2; e++) {\n for (var j = 0; j < height; j++) {\n for (var i = 0; i < width; i++, vidx++) {\n var u = i / (width - 1);\n var v = j / (height - 1);\n\n // Grid points regularly spaced in StreoScreen, and barrel distorted in\n // the mesh.\n var s = u;\n var t = v;\n var x = Util.lerp(lensFrustum[0], lensFrustum[2], u);\n var y = Util.lerp(lensFrustum[3], lensFrustum[1], v);\n var d = Math.sqrt(x * x + y * y);\n var r = deviceInfo.distortion.distortInverse(d);\n var p = x * r / d;\n var q = y * r / d;\n u = (p - noLensFrustum[0]) / (noLensFrustum[2] - noLensFrustum[0]);\n v = (q - noLensFrustum[3]) / (noLensFrustum[1] - noLensFrustum[3]);\n\n // Convert u,v to mesh screen coordinates.\n var aspect = deviceInfo.device.widthMeters / deviceInfo.device.heightMeters;\n\n // FIXME: The original Unity plugin multiplied U by the aspect ratio\n // and didn't multiply either value by 2, but that seems to get it\n // really close to correct looking for me. I hate this kind of \"Don't\n // know why it works\" code though, and wold love a more logical\n // explanation of what needs to happen here.\n u = (viewport.x + u * viewport.width - 0.5) * 2.0; //* aspect;\n v = (viewport.y + v * viewport.height - 0.5) * 2.0;\n\n vertices[(vidx * 5) + 0] = u; // position.x\n vertices[(vidx * 5) + 1] = v; // position.y\n vertices[(vidx * 5) + 2] = s; // texCoord.x\n vertices[(vidx * 5) + 3] = t; // texCoord.y\n vertices[(vidx * 5) + 4] = e; // texCoord.z (viewport index)\n }\n }\n var w = lensFrustum[2] - lensFrustum[0];\n lensFrustum[0] = -(w + lensFrustum[0]);\n lensFrustum[2] = w - lensFrustum[2];\n w = noLensFrustum[2] - noLensFrustum[0];\n noLensFrustum[0] = -(w + noLensFrustum[0]);\n noLensFrustum[2] = w - noLensFrustum[2];\n viewport.x = 1 - (viewport.x + viewport.width);\n }\n return vertices;\n}\n\n/**\n * Build the distortion mesh indices.\n * Based on code from the Unity cardboard plugin.\n */\nCardboardDistorter.prototype.computeMeshIndices_ = function(width, height) {\n var indices = new Uint16Array(2 * (width - 1) * (height - 1) * 6);\n var halfwidth = width / 2;\n var halfheight = height / 2;\n var vidx = 0;\n var iidx = 0;\n for (var e = 0; e < 2; e++) {\n for (var j = 0; j < height; j++) {\n for (var i = 0; i < width; i++, vidx++) {\n if (i == 0 || j == 0)\n continue;\n // Build a quad. Lower right and upper left quadrants have quads with\n // the triangle diagonal flipped to get the vignette to interpolate\n // correctly.\n if ((i <= halfwidth) == (j <= halfheight)) {\n // Quad diagonal lower left to upper right.\n indices[iidx++] = vidx;\n indices[iidx++] = vidx - width - 1;\n indices[iidx++] = vidx - width;\n indices[iidx++] = vidx - width - 1;\n indices[iidx++] = vidx;\n indices[iidx++] = vidx - 1;\n } else {\n // Quad diagonal upper left to lower right.\n indices[iidx++] = vidx - 1;\n indices[iidx++] = vidx - width;\n indices[iidx++] = vidx;\n indices[iidx++] = vidx - width;\n indices[iidx++] = vidx - 1;\n indices[iidx++] = vidx - width - 1;\n }\n }\n }\n }\n return indices;\n};\n\nCardboardDistorter.prototype.getOwnPropertyDescriptor_ = function(proto, attrName) {\n var descriptor = Object.getOwnPropertyDescriptor(proto, attrName);\n // In some cases (ahem... Safari), the descriptor returns undefined get and\n // set fields. In this case, we need to create a synthetic property\n // descriptor. This works around some of the issues in\n // https://github.com/borismus/webvr-polyfill/issues/46\n if (descriptor.get === undefined || descriptor.set === undefined) {\n descriptor.configurable = true;\n descriptor.enumerable = true;\n descriptor.get = function() {\n return this.getAttribute(attrName);\n };\n descriptor.set = function(val) {\n this.setAttribute(attrName, val);\n };\n }\n return descriptor;\n};\n\nmodule.exports = CardboardDistorter;\n\n},{\"./cardboard-ui.js\":6,\"./deps/wglu-preserve-state.js\":8,\"./util.js\":24}],6:[function(_dereq_,module,exports){\n/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = _dereq_('./util.js');\nvar WGLUPreserveGLState = _dereq_('./deps/wglu-preserve-state.js');\n\nvar uiVS = [\n 'attribute vec2 position;',\n\n 'uniform mat4 projectionMat;',\n\n 'void main() {',\n ' gl_Position = projectionMat * vec4( position, -1.0, 1.0 );',\n '}',\n].join('\\n');\n\nvar uiFS = [\n 'precision mediump float;',\n\n 'uniform vec4 color;',\n\n 'void main() {',\n ' gl_FragColor = color;',\n '}',\n].join('\\n');\n\nvar DEG2RAD = Math.PI/180.0;\n\n// The gear has 6 identical sections, each spanning 60 degrees.\nvar kAnglePerGearSection = 60;\n\n// Half-angle of the span of the outer rim.\nvar kOuterRimEndAngle = 12;\n\n// Angle between the middle of the outer rim and the start of the inner rim.\nvar kInnerRimBeginAngle = 20;\n\n// Distance from center to outer rim, normalized so that the entire model\n// fits in a [-1, 1] x [-1, 1] square.\nvar kOuterRadius = 1;\n\n// Distance from center to depressed rim, in model units.\nvar kMiddleRadius = 0.75;\n\n// Radius of the inner hollow circle, in model units.\nvar kInnerRadius = 0.3125;\n\n// Center line thickness in DP.\nvar kCenterLineThicknessDp = 4;\n\n// Button width in DP.\nvar kButtonWidthDp = 28;\n\n// Factor to scale the touch area that responds to the touch.\nvar kTouchSlopFactor = 1.5;\n\nvar Angles = [\n 0, kOuterRimEndAngle, kInnerRimBeginAngle,\n kAnglePerGearSection - kInnerRimBeginAngle,\n kAnglePerGearSection - kOuterRimEndAngle\n];\n\n/**\n * Renders the alignment line and \"options\" gear. It is assumed that the canvas\n * this is rendered into covers the entire screen (or close to it.)\n */\nfunction CardboardUI(gl) {\n this.gl = gl;\n\n this.attribs = {\n position: 0\n };\n this.program = Util.linkProgram(gl, uiVS, uiFS, this.attribs);\n this.uniforms = Util.getProgramUniforms(gl, this.program);\n\n this.vertexBuffer = gl.createBuffer();\n this.gearOffset = 0;\n this.gearVertexCount = 0;\n this.arrowOffset = 0;\n this.arrowVertexCount = 0;\n\n this.projMat = new Float32Array(16);\n\n this.listener = null;\n\n this.onResize();\n};\n\n/**\n * Tears down all the resources created by the UI renderer.\n */\nCardboardUI.prototype.destroy = function() {\n var gl = this.gl;\n\n if (this.listener) {\n gl.canvas.removeEventListener('click', this.listener, false);\n }\n\n gl.deleteProgram(this.program);\n gl.deleteBuffer(this.vertexBuffer);\n};\n\n/**\n * Adds a listener to clicks on the gear and back icons\n */\nCardboardUI.prototype.listen = function(optionsCallback, backCallback) {\n var canvas = this.gl.canvas;\n this.listener = function(event) {\n var midline = canvas.clientWidth / 2;\n var buttonSize = kButtonWidthDp * kTouchSlopFactor;\n // Check to see if the user clicked on (or around) the gear icon\n if (event.clientX > midline - buttonSize &&\n event.clientX < midline + buttonSize &&\n event.clientY > canvas.clientHeight - buttonSize) {\n optionsCallback(event);\n }\n // Check to see if the user clicked on (or around) the back icon\n else if (event.clientX < buttonSize && event.clientY < buttonSize) {\n backCallback(event);\n }\n };\n canvas.addEventListener('click', this.listener, false);\n};\n\n/**\n * Builds the UI mesh.\n */\nCardboardUI.prototype.onResize = function() {\n var gl = this.gl;\n var self = this;\n\n var glState = [\n gl.ARRAY_BUFFER_BINDING\n ];\n\n WGLUPreserveGLState(gl, glState, function(gl) {\n var vertices = [];\n\n var midline = gl.drawingBufferWidth / 2;\n\n // Assumes your canvas width and height is scaled proportionately.\n // TODO(smus): The following causes buttons to become huge on iOS, but seems\n // like the right thing to do. For now, added a hack. But really, investigate why.\n var dps = (gl.drawingBufferWidth / (screen.width * window.devicePixelRatio));\n if (!Util.isIOS()) {\n dps *= window.devicePixelRatio;\n }\n\n var lineWidth = kCenterLineThicknessDp * dps / 2;\n var buttonSize = kButtonWidthDp * kTouchSlopFactor * dps;\n var buttonScale = kButtonWidthDp * dps / 2;\n var buttonBorder = ((kButtonWidthDp * kTouchSlopFactor) - kButtonWidthDp) * dps;\n\n // Build centerline\n vertices.push(midline - lineWidth, buttonSize);\n vertices.push(midline - lineWidth, gl.drawingBufferHeight);\n vertices.push(midline + lineWidth, buttonSize);\n vertices.push(midline + lineWidth, gl.drawingBufferHeight);\n\n // Build gear\n self.gearOffset = (vertices.length / 2);\n\n function addGearSegment(theta, r) {\n var angle = (90 - theta) * DEG2RAD;\n var x = Math.cos(angle);\n var y = Math.sin(angle);\n vertices.push(kInnerRadius * x * buttonScale + midline, kInnerRadius * y * buttonScale + buttonScale);\n vertices.push(r * x * buttonScale + midline, r * y * buttonScale + buttonScale);\n }\n\n for (var i = 0; i <= 6; i++) {\n var segmentTheta = i * kAnglePerGearSection;\n\n addGearSegment(segmentTheta, kOuterRadius);\n addGearSegment(segmentTheta + kOuterRimEndAngle, kOuterRadius);\n addGearSegment(segmentTheta + kInnerRimBeginAngle, kMiddleRadius);\n addGearSegment(segmentTheta + (kAnglePerGearSection - kInnerRimBeginAngle), kMiddleRadius);\n addGearSegment(segmentTheta + (kAnglePerGearSection - kOuterRimEndAngle), kOuterRadius);\n }\n\n self.gearVertexCount = (vertices.length / 2) - self.gearOffset;\n\n // Build back arrow\n self.arrowOffset = (vertices.length / 2);\n\n function addArrowVertex(x, y) {\n vertices.push(buttonBorder + x, gl.drawingBufferHeight - buttonBorder - y);\n }\n\n var angledLineWidth = lineWidth / Math.sin(45 * DEG2RAD);\n\n addArrowVertex(0, buttonScale);\n addArrowVertex(buttonScale, 0);\n addArrowVertex(buttonScale + angledLineWidth, angledLineWidth);\n addArrowVertex(angledLineWidth, buttonScale + angledLineWidth);\n\n addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);\n addArrowVertex(0, buttonScale);\n addArrowVertex(buttonScale, buttonScale * 2);\n addArrowVertex(buttonScale + angledLineWidth, (buttonScale * 2) - angledLineWidth);\n\n addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);\n addArrowVertex(0, buttonScale);\n\n addArrowVertex(angledLineWidth, buttonScale - lineWidth);\n addArrowVertex(kButtonWidthDp * dps, buttonScale - lineWidth);\n addArrowVertex(angledLineWidth, buttonScale + lineWidth);\n addArrowVertex(kButtonWidthDp * dps, buttonScale + lineWidth);\n\n self.arrowVertexCount = (vertices.length / 2) - self.arrowOffset;\n\n // Buffer data\n gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n });\n};\n\n/**\n * Performs distortion pass on the injected backbuffer, rendering it to the real\n * backbuffer.\n */\nCardboardUI.prototype.render = function() {\n var gl = this.gl;\n var self = this;\n\n var glState = [\n gl.CULL_FACE,\n gl.DEPTH_TEST,\n gl.BLEND,\n gl.SCISSOR_TEST,\n gl.STENCIL_TEST,\n gl.COLOR_WRITEMASK,\n gl.VIEWPORT,\n\n gl.CURRENT_PROGRAM,\n gl.ARRAY_BUFFER_BINDING\n ];\n\n WGLUPreserveGLState(gl, glState, function(gl) {\n // Make sure the GL state is in a good place\n gl.disable(gl.CULL_FACE);\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.BLEND);\n gl.disable(gl.SCISSOR_TEST);\n gl.disable(gl.STENCIL_TEST);\n gl.colorMask(true, true, true, true);\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n self.renderNoState();\n });\n};\n\nCardboardUI.prototype.renderNoState = function() {\n var gl = this.gl;\n\n // Bind distortion program and mesh\n gl.useProgram(this.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);\n gl.enableVertexAttribArray(this.attribs.position);\n gl.vertexAttribPointer(this.attribs.position, 2, gl.FLOAT, false, 8, 0);\n\n gl.uniform4f(this.uniforms.color, 1.0, 1.0, 1.0, 1.0);\n\n Util.orthoMatrix(this.projMat, 0, gl.drawingBufferWidth, 0, gl.drawingBufferHeight, 0.1, 1024.0);\n gl.uniformMatrix4fv(this.uniforms.projectionMat, false, this.projMat);\n\n // Draws UI element\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n gl.drawArrays(gl.TRIANGLE_STRIP, this.gearOffset, this.gearVertexCount);\n gl.drawArrays(gl.TRIANGLE_STRIP, this.arrowOffset, this.arrowVertexCount);\n};\n\nmodule.exports = CardboardUI;\n\n},{\"./deps/wglu-preserve-state.js\":8,\"./util.js\":24}],7:[function(_dereq_,module,exports){\n/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar CardboardDistorter = _dereq_('./cardboard-distorter.js');\nvar CardboardUI = _dereq_('./cardboard-ui.js');\nvar DeviceInfo = _dereq_('./device-info.js');\nvar Dpdb = _dereq_('./dpdb/dpdb.js');\nvar FusionPoseSensor = _dereq_('./sensor-fusion/fusion-pose-sensor.js');\nvar RotateInstructions = _dereq_('./rotate-instructions.js');\nvar ViewerSelector = _dereq_('./viewer-selector.js');\nvar VRDisplay = _dereq_('./base.js').VRDisplay;\nvar Util = _dereq_('./util.js');\n\nvar Eye = {\n LEFT: 'left',\n RIGHT: 'right'\n};\n\n/**\n * VRDisplay based on mobile device parameters and DeviceMotion APIs.\n */\nfunction CardboardVRDisplay() {\n this.displayName = 'Cardboard VRDisplay (webvr-polyfill)';\n\n this.capabilities.hasOrientation = true;\n this.capabilities.canPresent = true;\n\n // \"Private\" members.\n this.bufferScale_ = WebVRConfig.BUFFER_SCALE;\n this.poseSensor_ = new FusionPoseSensor();\n this.distorter_ = null;\n this.cardboardUI_ = null;\n\n this.dpdb_ = new Dpdb(true, this.onDeviceParamsUpdated_.bind(this));\n this.deviceInfo_ = new DeviceInfo(this.dpdb_.getDeviceParams());\n\n this.viewerSelector_ = new ViewerSelector();\n this.viewerSelector_.on('change', this.onViewerChanged_.bind(this));\n\n // Set the correct initial viewer.\n this.deviceInfo_.setViewer(this.viewerSelector_.getCurrentViewer());\n\n if (!WebVRConfig.ROTATE_INSTRUCTIONS_DISABLED) {\n this.rotateInstructions_ = new RotateInstructions();\n }\n\n if (Util.isIOS()) {\n // Listen for resize events to workaround this awful Safari bug.\n window.addEventListener('resize', this.onResize_.bind(this));\n }\n}\nCardboardVRDisplay.prototype = new VRDisplay();\n\nCardboardVRDisplay.prototype.getImmediatePose = function() {\n return {\n position: this.poseSensor_.getPosition(),\n orientation: this.poseSensor_.getOrientation(),\n linearVelocity: null,\n linearAcceleration: null,\n angularVelocity: null,\n angularAcceleration: null\n };\n};\n\nCardboardVRDisplay.prototype.resetPose = function() {\n this.poseSensor_.resetPose();\n};\n\nCardboardVRDisplay.prototype.getEyeParameters = function(whichEye) {\n var offset = [this.deviceInfo_.viewer.interLensDistance * 0.5, 0.0, 0.0];\n var fieldOfView;\n\n // TODO: FoV can be a little expensive to compute. Cache when device params change.\n if (whichEye == Eye.LEFT) {\n offset[0] *= -1.0;\n fieldOfView = this.deviceInfo_.getFieldOfViewLeftEye();\n } else if (whichEye == Eye.RIGHT) {\n fieldOfView = this.deviceInfo_.getFieldOfViewRightEye();\n } else {\n console.error('Invalid eye provided: %s', whichEye);\n return null;\n }\n\n return {\n fieldOfView: fieldOfView,\n offset: offset,\n // TODO: Should be able to provide better values than these.\n renderWidth: this.deviceInfo_.device.width * 0.5 * this.bufferScale_,\n renderHeight: this.deviceInfo_.device.height * this.bufferScale_,\n };\n};\n\nCardboardVRDisplay.prototype.onDeviceParamsUpdated_ = function(newParams) {\n console.log('DPDB reported that device params were updated.');\n this.deviceInfo_.updateDeviceParams(newParams);\n\n if (this.distorter_) {\n this.distorter.updateDeviceInfo(this.deviceInfo_);\n }\n};\n\nCardboardVRDisplay.prototype.beginPresent_ = function() {\n var gl = this.layer_.source.getContext('webgl');\n if (!gl)\n gl = this.layer_.source.getContext('experimental-webgl');\n if (!gl)\n gl = this.layer_.source.getContext('webgl2');\n\n if (!gl)\n return; // Can't do distortion without a WebGL context.\n\n // Provides a way to opt out of distortion\n if (this.layer_.predistorted) {\n if (!WebVRConfig.CARDBOARD_UI_DISABLED) {\n gl.canvas.width = Util.getScreenWidth() * this.bufferScale_;\n gl.canvas.height = Util.getScreenHeight() * this.bufferScale_;\n this.cardboardUI_ = new CardboardUI(gl);\n }\n } else {\n // Create a new distorter for the target context\n this.distorter_ = new CardboardDistorter(gl);\n this.distorter_.updateDeviceInfo(this.deviceInfo_);\n this.cardboardUI_ = this.distorter_.cardboardUI;\n\n if (this.layer_.leftBounds || this.layer_.rightBounds) {\n this.distorter_.setTextureBounds(this.layer_.leftBounds, this.layer_.rightBounds);\n }\n }\n\n if (this.cardboardUI_) {\n this.cardboardUI_.listen(function(e) {\n // Options clicked.\n this.viewerSelector_.show(this.layer_.source.parentElement);\n e.stopPropagation();\n e.preventDefault();\n }.bind(this), function(e) {\n // Back clicked.\n this.exitPresent();\n e.stopPropagation();\n e.preventDefault();\n }.bind(this));\n }\n\n if (this.rotateInstructions_) {\n if (Util.isLandscapeMode() && Util.isMobile()) {\n // In landscape mode, temporarily show the \"put into Cardboard\"\n // interstitial. Otherwise, do the default thing.\n this.rotateInstructions_.showTemporarily(3000, this.layer_.source.parentElement);\n } else {\n this.rotateInstructions_.update();\n }\n }\n\n // Listen for orientation change events in order to show interstitial.\n this.orientationHandler = this.onOrientationChange_.bind(this);\n window.addEventListener('orientationchange', this.orientationHandler);\n\n // Fire this event initially, to give geometry-distortion clients the chance\n // to do something custom.\n this.fireVRDisplayDeviceParamsChange_();\n};\n\nCardboardVRDisplay.prototype.endPresent_ = function() {\n if (this.distorter_) {\n this.distorter_.destroy();\n this.distorter_ = null;\n }\n if (this.cardboardUI_) {\n this.cardboardUI_.destroy();\n this.cardboardUI_ = null;\n }\n\n if (this.rotateInstructions_) {\n this.rotateInstructions_.hide();\n }\n this.viewerSelector_.hide();\n\n window.removeEventListener('orientationchange', this.orientationHandler);\n};\n\nCardboardVRDisplay.prototype.submitFrame = function(pose) {\n if (this.distorter_) {\n this.distorter_.submitFrame();\n } else if (this.cardboardUI_ && this.layer_) {\n // Hack for predistorted: true.\n var canvas = this.layer_.source.getContext('webgl').canvas;\n if (canvas.width != this.lastWidth || canvas.height != this.lastHeight) {\n this.cardboardUI_.onResize();\n }\n this.lastWidth = canvas.width;\n this.lastHeight = canvas.height;\n\n // Render the Cardboard UI.\n this.cardboardUI_.render();\n }\n};\n\nCardboardVRDisplay.prototype.onOrientationChange_ = function(e) {\n console.log('onOrientationChange_');\n\n // Hide the viewer selector.\n this.viewerSelector_.hide();\n\n // Update the rotate instructions.\n if (this.rotateInstructions_) {\n this.rotateInstructions_.update();\n }\n\n this.onResize_();\n};\n\nCardboardVRDisplay.prototype.onResize_ = function(e) {\n if (this.layer_) {\n var gl = this.layer_.source.getContext('webgl');\n // Size the CSS canvas.\n // Added padding on right and bottom because iPhone 5 will not\n // hide the URL bar unless content is bigger than the screen.\n // This will not be visible as long as the container element (e.g. body)\n // is set to 'overflow: hidden'.\n var cssProperties = [\n 'position: absolute',\n 'top: 0',\n 'left: 0',\n 'width: ' + Math.max(screen.width, screen.height) + 'px',\n 'height: ' + Math.min(screen.height, screen.width) + 'px',\n 'border: 0',\n 'margin: 0',\n 'padding: 0 10px 10px 0',\n ];\n gl.canvas.setAttribute('style', cssProperties.join('; ') + ';');\n\n Util.safariCssSizeWorkaround(gl.canvas);\n }\n};\n\nCardboardVRDisplay.prototype.onViewerChanged_ = function(viewer) {\n this.deviceInfo_.setViewer(viewer);\n\n if (this.distorter_) {\n // Update the distortion appropriately.\n this.distorter_.updateDeviceInfo(this.deviceInfo_);\n }\n\n // Fire a new event containing viewer and device parameters for clients that\n // want to implement their own geometry-based distortion.\n this.fireVRDisplayDeviceParamsChange_();\n};\n\nCardboardVRDisplay.prototype.fireVRDisplayDeviceParamsChange_ = function() {\n var event = new CustomEvent('vrdisplaydeviceparamschange', {\n detail: {\n vrdisplay: this,\n deviceInfo: this.deviceInfo_,\n }\n });\n window.dispatchEvent(event);\n};\n\nmodule.exports = CardboardVRDisplay;\n\n},{\"./base.js\":4,\"./cardboard-distorter.js\":5,\"./cardboard-ui.js\":6,\"./device-info.js\":9,\"./dpdb/dpdb.js\":13,\"./rotate-instructions.js\":18,\"./sensor-fusion/fusion-pose-sensor.js\":20,\"./util.js\":24,\"./viewer-selector.js\":25}],8:[function(_dereq_,module,exports){\n/*\nCopyright (c) 2016, Brandon Jones.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n/*\nCaches specified GL state, runs a callback, and restores the cached state when\ndone.\n\nExample usage:\n\nvar savedState = [\n gl.ARRAY_BUFFER_BINDING,\n\n // TEXTURE_BINDING_2D or _CUBE_MAP must always be followed by the texure unit.\n gl.TEXTURE_BINDING_2D, gl.TEXTURE0,\n\n gl.CLEAR_COLOR,\n];\n// After this call the array buffer, texture unit 0, active texture, and clear\n// color will be restored. The viewport will remain changed, however, because\n// gl.VIEWPORT was not included in the savedState list.\nWGLUPreserveGLState(gl, savedState, function(gl) {\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, ....);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, ...);\n\n gl.clearColor(1, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n});\n\nNote that this is not intended to be fast. Managing state in your own code to\navoid redundant state setting and querying will always be faster. This function\nis most useful for cases where you may not have full control over the WebGL\ncalls being made, such as tooling or effect injectors.\n*/\n\nfunction WGLUPreserveGLState(gl, bindings, callback) {\n if (!bindings) {\n callback(gl);\n return;\n }\n\n var boundValues = [];\n\n var activeTexture = null;\n for (var i = 0; i < bindings.length; ++i) {\n var binding = bindings[i];\n switch (binding) {\n case gl.TEXTURE_BINDING_2D:\n case gl.TEXTURE_BINDING_CUBE_MAP:\n var textureUnit = bindings[++i];\n if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31) {\n console.error(\"TEXTURE_BINDING_2D or TEXTURE_BINDING_CUBE_MAP must be followed by a valid texture unit\");\n boundValues.push(null, null);\n break;\n }\n if (!activeTexture) {\n activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n }\n gl.activeTexture(textureUnit);\n boundValues.push(gl.getParameter(binding), null);\n break;\n case gl.ACTIVE_TEXTURE:\n activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n boundValues.push(null);\n break;\n default:\n boundValues.push(gl.getParameter(binding));\n break;\n }\n }\n\n callback(gl);\n\n for (var i = 0; i < bindings.length; ++i) {\n var binding = bindings[i];\n var boundValue = boundValues[i];\n switch (binding) {\n case gl.ACTIVE_TEXTURE:\n break; // Ignore this binding, since we special-case it to happen last.\n case gl.ARRAY_BUFFER_BINDING:\n gl.bindBuffer(gl.ARRAY_BUFFER, boundValue);\n break;\n case gl.COLOR_CLEAR_VALUE:\n gl.clearColor(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n break;\n case gl.COLOR_WRITEMASK:\n gl.colorMask(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n break;\n case gl.CURRENT_PROGRAM:\n gl.useProgram(boundValue);\n break;\n case gl.ELEMENT_ARRAY_BUFFER_BINDING:\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, boundValue);\n break;\n case gl.FRAMEBUFFER_BINDING:\n gl.bindFramebuffer(gl.FRAMEBUFFER, boundValue);\n break;\n case gl.RENDERBUFFER_BINDING:\n gl.bindRenderbuffer(gl.RENDERBUFFER, boundValue);\n break;\n case gl.TEXTURE_BINDING_2D:\n var textureUnit = bindings[++i];\n if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)\n break;\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, boundValue);\n break;\n case gl.TEXTURE_BINDING_CUBE_MAP:\n var textureUnit = bindings[++i];\n if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)\n break;\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, boundValue);\n break;\n case gl.VIEWPORT:\n gl.viewport(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n break;\n case gl.BLEND:\n case gl.CULL_FACE:\n case gl.DEPTH_TEST:\n case gl.SCISSOR_TEST:\n case gl.STENCIL_TEST:\n if (boundValue) {\n gl.enable(binding);\n } else {\n gl.disable(binding);\n }\n break;\n default:\n console.log(\"No GL restore behavior for 0x\" + binding.toString(16));\n break;\n }\n\n if (activeTexture) {\n gl.activeTexture(activeTexture);\n }\n }\n}\n\nmodule.exports = WGLUPreserveGLState;\n},{}],9:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Distortion = _dereq_('./distortion/distortion.js');\nvar MathUtil = _dereq_('./math-util.js');\nvar Util = _dereq_('./util.js');\n\nfunction Device(params) {\n this.width = params.width || Util.getScreenWidth();\n this.height = params.height || Util.getScreenHeight();\n this.widthMeters = params.widthMeters;\n this.heightMeters = params.heightMeters;\n this.bevelMeters = params.bevelMeters;\n}\n\n\n// Fallback Android device (based on Nexus 5 measurements) for use when\n// we can't recognize an Android device.\nvar DEFAULT_ANDROID = new Device({\n widthMeters: 0.110,\n heightMeters: 0.062,\n bevelMeters: 0.004\n});\n\n// Fallback iOS device (based on iPhone6) for use when\n// we can't recognize an Android device.\nvar DEFAULT_IOS = new Device({\n widthMeters: 0.1038,\n heightMeters: 0.0584,\n bevelMeters: 0.004\n});\n\n\nvar Viewers = {\n CardboardV1: new CardboardViewer({\n id: 'CardboardV1',\n label: 'Cardboard I/O 2014',\n fov: 40,\n interLensDistance: 0.060,\n baselineLensDistance: 0.035,\n screenLensDistance: 0.042,\n distortionCoefficients: [0.441, 0.156],\n inverseCoefficients: [-0.4410035, 0.42756155, -0.4804439, 0.5460139,\n -0.58821183, 0.5733938, -0.48303202, 0.33299083, -0.17573841,\n 0.0651772, -0.01488963, 0.001559834]\n }),\n CardboardV2: new CardboardViewer({\n id: 'CardboardV2',\n label: 'Cardboard I/O 2015',\n fov: 60,\n interLensDistance: 0.064,\n baselineLensDistance: 0.035,\n screenLensDistance: 0.039,\n distortionCoefficients: [0.34, 0.55],\n inverseCoefficients: [-0.33836704, -0.18162185, 0.862655, -1.2462051,\n 1.0560602, -0.58208317, 0.21609078, -0.05444823, 0.009177956,\n -9.904169E-4, 6.183535E-5, -1.6981803E-6]\n })\n};\n\n\nvar DEFAULT_LEFT_CENTER = {x: 0.5, y: 0.5};\nvar DEFAULT_RIGHT_CENTER = {x: 0.5, y: 0.5};\n\n/**\n * Manages information about the device and the viewer.\n *\n * deviceParams indicates the parameters of the device to use (generally\n * obtained from dpdb.getDeviceParams()). Can be null to mean no device\n * params were found.\n */\nfunction DeviceInfo(deviceParams) {\n this.viewer = Viewers.CardboardV2;\n this.updateDeviceParams(deviceParams);\n this.distortion = new Distortion(this.viewer.distortionCoefficients);\n}\n\nDeviceInfo.prototype.updateDeviceParams = function(deviceParams) {\n this.device = this.determineDevice_(deviceParams) || this.device;\n};\n\nDeviceInfo.prototype.getDevice = function() {\n return this.device;\n};\n\nDeviceInfo.prototype.setViewer = function(viewer) {\n this.viewer = viewer;\n this.distortion = new Distortion(this.viewer.distortionCoefficients);\n};\n\nDeviceInfo.prototype.determineDevice_ = function(deviceParams) {\n if (!deviceParams) {\n // No parameters, so use a default.\n if (Util.isIOS()) {\n console.warn('Using fallback iOS device measurements.');\n return DEFAULT_IOS;\n } else {\n console.warn('Using fallback Android device measurements.');\n return DEFAULT_ANDROID;\n }\n }\n\n // Compute device screen dimensions based on deviceParams.\n var METERS_PER_INCH = 0.0254;\n var metersPerPixelX = METERS_PER_INCH / deviceParams.xdpi;\n var metersPerPixelY = METERS_PER_INCH / deviceParams.ydpi;\n var width = Util.getScreenWidth();\n var height = Util.getScreenHeight();\n return new Device({\n widthMeters: metersPerPixelX * width,\n heightMeters: metersPerPixelY * height,\n bevelMeters: deviceParams.bevelMm * 0.001,\n });\n};\n\n/**\n * Calculates field of view for the left eye.\n */\nDeviceInfo.prototype.getDistortedFieldOfViewLeftEye = function() {\n var viewer = this.viewer;\n var device = this.device;\n var distortion = this.distortion;\n\n // Device.height and device.width for device in portrait mode, so transpose.\n var eyeToScreenDistance = viewer.screenLensDistance;\n\n var outerDist = (device.widthMeters - viewer.interLensDistance) / 2;\n var innerDist = viewer.interLensDistance / 2;\n var bottomDist = viewer.baselineLensDistance - device.bevelMeters;\n var topDist = device.heightMeters - bottomDist;\n\n var outerAngle = MathUtil.radToDeg * Math.atan(\n distortion.distort(outerDist / eyeToScreenDistance));\n var innerAngle = MathUtil.radToDeg * Math.atan(\n distortion.distort(innerDist / eyeToScreenDistance));\n var bottomAngle = MathUtil.radToDeg * Math.atan(\n distortion.distort(bottomDist / eyeToScreenDistance));\n var topAngle = MathUtil.radToDeg * Math.atan(\n distortion.distort(topDist / eyeToScreenDistance));\n\n return {\n leftDegrees: Math.min(outerAngle, viewer.fov),\n rightDegrees: Math.min(innerAngle, viewer.fov),\n downDegrees: Math.min(bottomAngle, viewer.fov),\n upDegrees: Math.min(topAngle, viewer.fov)\n };\n};\n\n/**\n * Calculates the tan-angles from the maximum FOV for the left eye for the\n * current device and screen parameters.\n */\nDeviceInfo.prototype.getLeftEyeVisibleTanAngles = function() {\n var viewer = this.viewer;\n var device = this.device;\n var distortion = this.distortion;\n\n // Tan-angles from the max FOV.\n var fovLeft = Math.tan(-MathUtil.degToRad * viewer.fov);\n var fovTop = Math.tan(MathUtil.degToRad * viewer.fov);\n var fovRight = Math.tan(MathUtil.degToRad * viewer.fov);\n var fovBottom = Math.tan(-MathUtil.degToRad * viewer.fov);\n // Viewport size.\n var halfWidth = device.widthMeters / 4;\n var halfHeight = device.heightMeters / 2;\n // Viewport center, measured from left lens position.\n var verticalLensOffset = (viewer.baselineLensDistance - device.bevelMeters - halfHeight);\n var centerX = viewer.interLensDistance / 2 - halfWidth;\n var centerY = -verticalLensOffset;\n var centerZ = viewer.screenLensDistance;\n // Tan-angles of the viewport edges, as seen through the lens.\n var screenLeft = distortion.distort((centerX - halfWidth) / centerZ);\n var screenTop = distortion.distort((centerY + halfHeight) / centerZ);\n var screenRight = distortion.distort((centerX + halfWidth) / centerZ);\n var screenBottom = distortion.distort((centerY - halfHeight) / centerZ);\n // Compare the two sets of tan-angles and take the value closer to zero on each side.\n var result = new Float32Array(4);\n result[0] = Math.max(fovLeft, screenLeft);\n result[1] = Math.min(fovTop, screenTop);\n result[2] = Math.min(fovRight, screenRight);\n result[3] = Math.max(fovBottom, screenBottom);\n return result;\n};\n\n/**\n * Calculates the tan-angles from the maximum FOV for the left eye for the\n * current device and screen parameters, assuming no lenses.\n */\nDeviceInfo.prototype.getLeftEyeNoLensTanAngles = function() {\n var viewer = this.viewer;\n var device = this.device;\n var distortion = this.distortion;\n\n var result = new Float32Array(4);\n // Tan-angles from the max FOV.\n var fovLeft = distortion.distortInverse(Math.tan(-MathUtil.degToRad * viewer.fov));\n var fovTop = distortion.distortInverse(Math.tan(MathUtil.degToRad * viewer.fov));\n var fovRight = distortion.distortInverse(Math.tan(MathUtil.degToRad * viewer.fov));\n var fovBottom = distortion.distortInverse(Math.tan(-MathUtil.degToRad * viewer.fov));\n // Viewport size.\n var halfWidth = device.widthMeters / 4;\n var halfHeight = device.heightMeters / 2;\n // Viewport center, measured from left lens position.\n var verticalLensOffset = (viewer.baselineLensDistance - device.bevelMeters - halfHeight);\n var centerX = viewer.interLensDistance / 2 - halfWidth;\n var centerY = -verticalLensOffset;\n var centerZ = viewer.screenLensDistance;\n // Tan-angles of the viewport edges, as seen through the lens.\n var screenLeft = (centerX - halfWidth) / centerZ;\n var screenTop = (centerY + halfHeight) / centerZ;\n var screenRight = (centerX + halfWidth) / centerZ;\n var screenBottom = (centerY - halfHeight) / centerZ;\n // Compare the two sets of tan-angles and take the value closer to zero on each side.\n result[0] = Math.max(fovLeft, screenLeft);\n result[1] = Math.min(fovTop, screenTop);\n result[2] = Math.min(fovRight, screenRight);\n result[3] = Math.max(fovBottom, screenBottom);\n return result;\n};\n\n/**\n * Calculates the screen rectangle visible from the left eye for the\n * current device and screen parameters.\n */\nDeviceInfo.prototype.getLeftEyeVisibleScreenRect = function(undistortedFrustum) {\n var viewer = this.viewer;\n var device = this.device;\n\n var dist = viewer.screenLensDistance;\n var eyeX = (device.widthMeters - viewer.interLensDistance) / 2;\n var eyeY = viewer.baselineLensDistance - device.bevelMeters;\n var left = (undistortedFrustum[0] * dist + eyeX) / device.widthMeters;\n var top = (undistortedFrustum[1] * dist + eyeY) / device.heightMeters;\n var right = (undistortedFrustum[2] * dist + eyeX) / device.widthMeters;\n var bottom = (undistortedFrustum[3] * dist + eyeY) / device.heightMeters;\n return {\n x: left,\n y: bottom,\n width: right - left,\n height: top - bottom\n };\n};\n\nDeviceInfo.prototype.getFieldOfViewLeftEye = function(opt_isUndistorted) {\n return opt_isUndistorted ? this.getUndistortedFieldOfViewLeftEye() :\n this.getDistortedFieldOfViewLeftEye();\n};\n\nDeviceInfo.prototype.getFieldOfViewRightEye = function(opt_isUndistorted) {\n var fov = this.getFieldOfViewLeftEye(opt_isUndistorted);\n return {\n leftDegrees: fov.rightDegrees,\n rightDegrees: fov.leftDegrees,\n upDegrees: fov.upDegrees,\n downDegrees: fov.downDegrees\n };\n};\n\n/**\n * Calculates undistorted field of view for the left eye.\n */\nDeviceInfo.prototype.getUndistortedFieldOfViewLeftEye = function() {\n var p = this.getUndistortedParams_();\n\n return {\n leftDegrees: MathUtil.radToDeg * Math.atan(p.outerDist),\n rightDegrees: MathUtil.radToDeg * Math.atan(p.innerDist),\n downDegrees: MathUtil.radToDeg * Math.atan(p.bottomDist),\n upDegrees: MathUtil.radToDeg * Math.atan(p.topDist)\n };\n};\n\nDeviceInfo.prototype.getUndistortedViewportLeftEye = function() {\n var p = this.getUndistortedParams_();\n var viewer = this.viewer;\n var device = this.device;\n\n // Distances stored in local variables are in tan-angle units unless otherwise\n // noted.\n var eyeToScreenDistance = viewer.screenLensDistance;\n var screenWidth = device.widthMeters / eyeToScreenDistance;\n var screenHeight = device.heightMeters / eyeToScreenDistance;\n var xPxPerTanAngle = device.width / screenWidth;\n var yPxPerTanAngle = device.height / screenHeight;\n\n var x = Math.round((p.eyePosX - p.outerDist) * xPxPerTanAngle);\n var y = Math.round((p.eyePosY - p.bottomDist) * yPxPerTanAngle);\n return {\n x: x,\n y: y,\n width: Math.round((p.eyePosX + p.innerDist) * xPxPerTanAngle) - x,\n height: Math.round((p.eyePosY + p.topDist) * yPxPerTanAngle) - y\n };\n};\n\nDeviceInfo.prototype.getUndistortedParams_ = function() {\n var viewer = this.viewer;\n var device = this.device;\n var distortion = this.distortion;\n\n // Most of these variables in tan-angle units.\n var eyeToScreenDistance = viewer.screenLensDistance;\n var halfLensDistance = viewer.interLensDistance / 2 / eyeToScreenDistance;\n var screenWidth = device.widthMeters / eyeToScreenDistance;\n var screenHeight = device.heightMeters / eyeToScreenDistance;\n\n var eyePosX = screenWidth / 2 - halfLensDistance;\n var eyePosY = (viewer.baselineLensDistance - device.bevelMeters) / eyeToScreenDistance;\n\n var maxFov = viewer.fov;\n var viewerMax = distortion.distortInverse(Math.tan(MathUtil.degToRad * maxFov));\n var outerDist = Math.min(eyePosX, viewerMax);\n var innerDist = Math.min(halfLensDistance, viewerMax);\n var bottomDist = Math.min(eyePosY, viewerMax);\n var topDist = Math.min(screenHeight - eyePosY, viewerMax);\n\n return {\n outerDist: outerDist,\n innerDist: innerDist,\n topDist: topDist,\n bottomDist: bottomDist,\n eyePosX: eyePosX,\n eyePosY: eyePosY\n };\n};\n\n\nfunction CardboardViewer(params) {\n // A machine readable ID.\n this.id = params.id;\n // A human readable label.\n this.label = params.label;\n\n // Field of view in degrees (per side).\n this.fov = params.fov;\n\n // Distance between lens centers in meters.\n this.interLensDistance = params.interLensDistance;\n // Distance between viewer baseline and lens center in meters.\n this.baselineLensDistance = params.baselineLensDistance;\n // Screen-to-lens distance in meters.\n this.screenLensDistance = params.screenLensDistance;\n\n // Distortion coefficients.\n this.distortionCoefficients = params.distortionCoefficients;\n // Inverse distortion coefficients.\n // TODO: Calculate these from distortionCoefficients in the future.\n this.inverseCoefficients = params.inverseCoefficients;\n}\n\n// Export viewer information.\nDeviceInfo.Viewers = Viewers;\nmodule.exports = DeviceInfo;\n\n},{\"./distortion/distortion.js\":11,\"./math-util.js\":16,\"./util.js\":24}],10:[function(_dereq_,module,exports){\n/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar VRDisplay = _dereq_('./base.js').VRDisplay;\nvar HMDVRDevice = _dereq_('./base.js').HMDVRDevice;\nvar PositionSensorVRDevice = _dereq_('./base.js').PositionSensorVRDevice;\n\n/**\n * Wraps a VRDisplay and exposes it as a HMDVRDevice\n */\nfunction VRDisplayHMDDevice(display) {\n this.display = display;\n\n this.hardwareUnitId = display.displayId;\n this.deviceId = 'webvr-polyfill:HMD:' + display.displayId;\n this.deviceName = display.displayName + ' (HMD)';\n}\nVRDisplayHMDDevice.prototype = new HMDVRDevice();\n\nVRDisplayHMDDevice.prototype.getEyeParameters = function(whichEye) {\n var eyeParameters = this.display.getEyeParameters(whichEye);\n\n return {\n currentFieldOfView: eyeParameters.fieldOfView,\n maximumFieldOfView: eyeParameters.fieldOfView,\n minimumFieldOfView: eyeParameters.fieldOfView,\n recommendedFieldOfView: eyeParameters.fieldOfView,\n eyeTranslation: { x: eyeParameters.offset[0], y: eyeParameters.offset[1], z: eyeParameters.offset[2] },\n renderRect: {\n x: (whichEye == 'right') ? eyeParameters.renderWidth : 0,\n y: 0,\n width: eyeParameters.renderWidth,\n height: eyeParameters.renderHeight\n }\n };\n};\n\nVRDisplayHMDDevice.prototype.setFieldOfView =\n function(opt_fovLeft, opt_fovRight, opt_zNear, opt_zFar) {\n // Not supported. getEyeParameters reports that the min, max, and recommended\n // FoV is all the same, so no adjustment can be made.\n};\n\n// TODO: Need to hook requestFullscreen to see if a wrapped VRDisplay was passed\n// in as an option. If so we should prevent the default fullscreen behavior and\n// call VRDisplay.requestPresent instead.\n\n/**\n * Wraps a VRDisplay and exposes it as a PositionSensorVRDevice\n */\nfunction VRDisplayPositionSensorDevice(display) {\n this.display = display;\n\n this.hardwareUnitId = display.displayId;\n this.deviceId = 'webvr-polyfill:PositionSensor: ' + display.displayId;\n this.deviceName = display.displayName + ' (PositionSensor)';\n}\nVRDisplayPositionSensorDevice.prototype = new PositionSensorVRDevice();\n\nVRDisplayPositionSensorDevice.prototype.getState = function() {\n var pose = this.display.getPose();\n return {\n position: pose.position ? { x: pose.position[0], y: pose.position[1], z: pose.position[2] } : null,\n orientation: pose.orientation ? { x: pose.orientation[0], y: pose.orientation[1], z: pose.orientation[2], w: pose.orientation[3] } : null,\n linearVelocity: null,\n linearAcceleration: null,\n angularVelocity: null,\n angularAcceleration: null\n };\n};\n\nVRDisplayPositionSensorDevice.prototype.resetState = function() {\n return this.positionDevice.resetPose();\n};\n\n\nmodule.exports.VRDisplayHMDDevice = VRDisplayHMDDevice;\nmodule.exports.VRDisplayPositionSensorDevice = VRDisplayPositionSensorDevice;\n\n\n},{\"./base.js\":4}],11:[function(_dereq_,module,exports){\n/**\n * TODO(smus): Implement coefficient inversion.\n */\nfunction Distortion(coefficients) {\n this.coefficients = coefficients;\n}\n\n/**\n * Calculates the inverse distortion for a radius.\n *

\n * Allows to compute the original undistorted radius from a distorted one.\n * See also getApproximateInverseDistortion() for a faster but potentially\n * less accurate method.\n *\n * @param {Number} radius Distorted radius from the lens center in tan-angle units.\n * @return {Number} The undistorted radius in tan-angle units.\n */\nDistortion.prototype.distortInverse = function(radius) {\n // Secant method.\n var r0 = 0;\n var r1 = 1;\n var dr0 = radius - this.distort(r0);\n while (Math.abs(r1 - r0) > 0.0001 /** 0.1mm */) {\n var dr1 = radius - this.distort(r1);\n var r2 = r1 - dr1 * ((r1 - r0) / (dr1 - dr0));\n r0 = r1;\n r1 = r2;\n dr0 = dr1;\n }\n return r1;\n};\n\n/**\n * Distorts a radius by its distortion factor from the center of the lenses.\n *\n * @param {Number} radius Radius from the lens center in tan-angle units.\n * @return {Number} The distorted radius in tan-angle units.\n */\nDistortion.prototype.distort = function(radius) {\n var r2 = radius * radius;\n var ret = 0;\n for (var i = 0; i < this.coefficients.length; i++) {\n ret = r2 * (ret + this.coefficients[i]);\n }\n return (ret + 1) * radius;\n};\n\n// Functions below roughly ported from\n// https://github.com/googlesamples/cardboard-unity/blob/master/Cardboard/Scripts/CardboardProfile.cs#L412\n\n// Solves a small linear equation via destructive gaussian\n// elimination and back substitution. This isn't generic numeric\n// code, it's just a quick hack to work with the generally\n// well-behaved symmetric matrices for least-squares fitting.\n// Not intended for reuse.\n//\n// @param a Input positive definite symmetrical matrix. Destroyed\n// during calculation.\n// @param y Input right-hand-side values. Destroyed during calculation.\n// @return Resulting x value vector.\n//\nDistortion.prototype.solveLinear_ = function(a, y) {\n var n = a.length;\n\n // Gaussian elimination (no row exchange) to triangular matrix.\n // The input matrix is a A^T A product which should be a positive\n // definite symmetrical matrix, and if I remember my linear\n // algebra right this implies that the pivots will be nonzero and\n // calculations sufficiently accurate without needing row\n // exchange.\n for (var j = 0; j < n - 1; ++j) {\n for (var k = j + 1; k < n; ++k) {\n var p = a[j][k] / a[j][j];\n for (var i = j + 1; i < n; ++i) {\n a[i][k] -= p * a[i][j];\n }\n y[k] -= p * y[j];\n }\n }\n // From this point on, only the matrix elements a[j][i] with i>=j are\n // valid. The elimination doesn't fill in eliminated 0 values.\n\n var x = new Array(n);\n\n // Back substitution.\n for (var j = n - 1; j >= 0; --j) {\n var v = y[j];\n for (var i = j + 1; i < n; ++i) {\n v -= a[i][j] * x[i];\n }\n x[j] = v / a[j][j];\n }\n\n return x;\n};\n\n// Solves a least-squares matrix equation. Given the equation A * x = y, calculate the\n// least-square fit x = inverse(A * transpose(A)) * transpose(A) * y. The way this works\n// is that, while A is typically not a square matrix (and hence not invertible), A * transpose(A)\n// is always square. That is:\n// A * x = y\n// transpose(A) * (A * x) = transpose(A) * y <- multiply both sides by transpose(A)\n// (transpose(A) * A) * x = transpose(A) * y <- associativity\n// x = inverse(transpose(A) * A) * transpose(A) * y <- solve for x\n// Matrix A's row count (first index) must match y's value count. A's column count (second index)\n// determines the length of the result vector x.\nDistortion.prototype.solveLeastSquares_ = function(matA, vecY) {\n var i, j, k, sum;\n var numSamples = matA.length;\n var numCoefficients = matA[0].length;\n if (numSamples != vecY.Length) {\n throw new Error(\"Matrix / vector dimension mismatch\");\n }\n\n // Calculate transpose(A) * A\n var matATA = new Array(numCoefficients);\n for (k = 0; k < numCoefficients; ++k) {\n matATA[k] = new Array(numCoefficients);\n for (j = 0; j < numCoefficients; ++j) {\n sum = 0;\n for (i = 0; i < numSamples; ++i) {\n sum += matA[j][i] * matA[k][i];\n }\n matATA[k][j] = sum;\n }\n }\n\n // Calculate transpose(A) * y\n var vecATY = new Array(numCoefficients);\n for (j = 0; j < numCoefficients; ++j) {\n sum = 0;\n for (i = 0; i < numSamples; ++i) {\n sum += matA[j][i] * vecY[i];\n }\n vecATY[j] = sum;\n }\n\n // Now solve (A * transpose(A)) * x = transpose(A) * y.\n return this.solveLinear_(matATA, vecATY);\n};\n\n/// Calculates an approximate inverse to the given radial distortion parameters.\nDistortion.prototype.approximateInverse = function(maxRadius, numSamples) {\n maxRadius = maxRadius || 1;\n numSamples = numSamples || 100;\n var numCoefficients = 6;\n var i, j;\n\n // R + K1*R^3 + K2*R^5 = r, with R = rp = distort(r)\n // Repeating for numSamples:\n // [ R0^3, R0^5 ] * [ K1 ] = [ r0 - R0 ]\n // [ R1^3, R1^5 ] [ K2 ] [ r1 - R1 ]\n // [ R2^3, R2^5 ] [ r2 - R2 ]\n // [ etc... ] [ etc... ]\n // That is:\n // matA * [K1, K2] = y\n // Solve:\n // [K1, K2] = inverse(transpose(matA) * matA) * transpose(matA) * y\n var matA = new Array(numCoefficients);\n for (j = 0; j < numCoefficients; ++j) {\n matA[j] = new Array(numSamples);\n }\n var vecY = new Array(numSamples);\n\n for (i = 0; i < numSamples; ++i) {\n var r = maxRadius * (i + 1) / numSamples;\n var rp = this.distort(r);\n var v = rp;\n for (j = 0; j < numCoefficients; ++j) {\n v *= rp * rp;\n matA[j][i] = v;\n }\n vecY[i] = r - rp;\n }\n\n var inverseCoefficients = this.solveLeastSquares_(matA, vecY);\n\n return new Distortion(inverseCoefficients);\n};\n\nmodule.exports = Distortion;\n\n},{}],12:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * DPDB cache.\n */\nvar DPDB_CACHE = {\n \"format\": 1,\n \"last_updated\": \"2016-01-20T00:18:35Z\",\n \"devices\": [\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"asus/*/Nexus 7/*\" },\n { \"ua\": \"Nexus 7\" }\n ],\n \"dpi\": [ 320.8, 323.0 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"asus/*/ASUS_Z00AD/*\" },\n { \"ua\": \"ASUS_Z00AD\" }\n ],\n \"dpi\": [ 403.0, 404.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"HTC/*/HTC6435LVW/*\" },\n { \"ua\": \"HTC6435LVW\" }\n ],\n \"dpi\": [ 449.7, 443.3 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"HTC/*/HTC One XL/*\" },\n { \"ua\": \"HTC One XL\" }\n ],\n \"dpi\": [ 315.3, 314.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"htc/*/Nexus 9/*\" },\n { \"ua\": \"Nexus 9\" }\n ],\n \"dpi\": 289.0,\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"HTC/*/HTC One M9/*\" },\n { \"ua\": \"HTC One M9\" }\n ],\n \"dpi\": [ 442.5, 443.3 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"HTC/*/HTC One_M8/*\" },\n { \"ua\": \"HTC One_M8\" }\n ],\n \"dpi\": [ 449.7, 447.4 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"HTC/*/HTC One/*\" },\n { \"ua\": \"HTC One\" }\n ],\n \"dpi\": 472.8,\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Huawei/*/Nexus 6P/*\" },\n { \"ua\": \"Nexus 6P\" }\n ],\n \"dpi\": [ 515.1, 518.0 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/Nexus 5X/*\" },\n { \"ua\": \"Nexus 5X\" }\n ],\n \"dpi\": [ 422.0, 419.9 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/LGMS345/*\" },\n { \"ua\": \"LGMS345\" }\n ],\n \"dpi\": [ 221.7, 219.1 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/LG-D800/*\" },\n { \"ua\": \"LG-D800\" }\n ],\n \"dpi\": [ 422.0, 424.1 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/LG-D850/*\" },\n { \"ua\": \"LG-D850\" }\n ],\n \"dpi\": [ 537.9, 541.9 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/VS985 4G/*\" },\n { \"ua\": \"VS985 4G\" }\n ],\n \"dpi\": [ 537.9, 535.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/Nexus 5/*\" },\n { \"ua\": \"Nexus 5 \" }\n ],\n \"dpi\": [ 442.4, 444.8 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/Nexus 4/*\" },\n { \"ua\": \"Nexus 4\" }\n ],\n \"dpi\": [ 319.8, 318.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/LG-P769/*\" },\n { \"ua\": \"LG-P769\" }\n ],\n \"dpi\": [ 240.6, 247.5 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/LGMS323/*\" },\n { \"ua\": \"LGMS323\" }\n ],\n \"dpi\": [ 206.6, 204.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"LGE/*/LGLS996/*\" },\n { \"ua\": \"LGLS996\" }\n ],\n \"dpi\": [ 403.4, 401.5 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Micromax/*/4560MMX/*\" },\n { \"ua\": \"4560MMX\" }\n ],\n \"dpi\": [ 240.0, 219.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Micromax/*/A250/*\" },\n { \"ua\": \"Micromax A250\" }\n ],\n \"dpi\": [ 480.0, 446.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Micromax/*/Micromax AQ4501/*\" },\n { \"ua\": \"Micromax AQ4501\" }\n ],\n \"dpi\": 240.0,\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/DROID RAZR/*\" },\n { \"ua\": \"DROID RAZR\" }\n ],\n \"dpi\": [ 368.1, 256.7 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT830C/*\" },\n { \"ua\": \"XT830C\" }\n ],\n \"dpi\": [ 254.0, 255.9 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1021/*\" },\n { \"ua\": \"XT1021\" }\n ],\n \"dpi\": [ 254.0, 256.7 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1023/*\" },\n { \"ua\": \"XT1023\" }\n ],\n \"dpi\": [ 254.0, 256.7 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1028/*\" },\n { \"ua\": \"XT1028\" }\n ],\n \"dpi\": [ 326.6, 327.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1034/*\" },\n { \"ua\": \"XT1034\" }\n ],\n \"dpi\": [ 326.6, 328.4 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1053/*\" },\n { \"ua\": \"XT1053\" }\n ],\n \"dpi\": [ 315.3, 316.1 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1562/*\" },\n { \"ua\": \"XT1562\" }\n ],\n \"dpi\": [ 403.4, 402.7 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/Nexus 6/*\" },\n { \"ua\": \"Nexus 6 \" }\n ],\n \"dpi\": [ 494.3, 489.7 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1063/*\" },\n { \"ua\": \"XT1063\" }\n ],\n \"dpi\": [ 295.0, 296.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1064/*\" },\n { \"ua\": \"XT1064\" }\n ],\n \"dpi\": [ 295.0, 295.6 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1092/*\" },\n { \"ua\": \"XT1092\" }\n ],\n \"dpi\": [ 422.0, 424.1 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"motorola/*/XT1095/*\" },\n { \"ua\": \"XT1095\" }\n ],\n \"dpi\": [ 422.0, 423.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"OnePlus/*/A0001/*\" },\n { \"ua\": \"A0001\" }\n ],\n \"dpi\": [ 403.4, 401.0 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"OnePlus/*/ONE E1005/*\" },\n { \"ua\": \"ONE E1005\" }\n ],\n \"dpi\": [ 442.4, 441.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"OnePlus/*/ONE A2005/*\" },\n { \"ua\": \"ONE A2005\" }\n ],\n \"dpi\": [ 391.9, 405.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"OPPO/*/X909/*\" },\n { \"ua\": \"X909\" }\n ],\n \"dpi\": [ 442.4, 444.1 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9082/*\" },\n { \"ua\": \"GT-I9082\" }\n ],\n \"dpi\": [ 184.7, 185.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G360P/*\" },\n { \"ua\": \"SM-G360P\" }\n ],\n \"dpi\": [ 196.7, 205.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/Nexus S/*\" },\n { \"ua\": \"Nexus S\" }\n ],\n \"dpi\": [ 234.5, 229.8 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9300/*\" },\n { \"ua\": \"GT-I9300\" }\n ],\n \"dpi\": [ 304.8, 303.9 ],\n \"bw\": 5,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-T230NU/*\" },\n { \"ua\": \"SM-T230NU\" }\n ],\n \"dpi\": 216.0,\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SGH-T399/*\" },\n { \"ua\": \"SGH-T399\" }\n ],\n \"dpi\": [ 217.7, 231.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-N9005/*\" },\n { \"ua\": \"SM-N9005\" }\n ],\n \"dpi\": [ 386.4, 387.0 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SAMSUNG-SM-N900A/*\" },\n { \"ua\": \"SAMSUNG-SM-N900A\" }\n ],\n \"dpi\": [ 386.4, 387.7 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9500/*\" },\n { \"ua\": \"GT-I9500\" }\n ],\n \"dpi\": [ 442.5, 443.3 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9505/*\" },\n { \"ua\": \"GT-I9505\" }\n ],\n \"dpi\": 439.4,\n \"bw\": 4,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G900F/*\" },\n { \"ua\": \"SM-G900F\" }\n ],\n \"dpi\": [ 415.6, 431.6 ],\n \"bw\": 5,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G900M/*\" },\n { \"ua\": \"SM-G900M\" }\n ],\n \"dpi\": [ 415.6, 431.6 ],\n \"bw\": 5,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G800F/*\" },\n { \"ua\": \"SM-G800F\" }\n ],\n \"dpi\": 326.8,\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G906S/*\" },\n { \"ua\": \"SM-G906S\" }\n ],\n \"dpi\": [ 562.7, 572.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9300/*\" },\n { \"ua\": \"GT-I9300\" }\n ],\n \"dpi\": [ 306.7, 304.8 ],\n \"bw\": 5,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-T535/*\" },\n { \"ua\": \"SM-T535\" }\n ],\n \"dpi\": [ 142.6, 136.4 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-N920C/*\" },\n { \"ua\": \"SM-N920C\" }\n ],\n \"dpi\": [ 515.1, 518.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9300I/*\" },\n { \"ua\": \"GT-I9300I\" }\n ],\n \"dpi\": [ 304.8, 305.8 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-I9195/*\" },\n { \"ua\": \"GT-I9195\" }\n ],\n \"dpi\": [ 249.4, 256.7 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SPH-L520/*\" },\n { \"ua\": \"SPH-L520\" }\n ],\n \"dpi\": [ 249.4, 255.9 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SAMSUNG-SGH-I717/*\" },\n { \"ua\": \"SAMSUNG-SGH-I717\" }\n ],\n \"dpi\": 285.8,\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SPH-D710/*\" },\n { \"ua\": \"SPH-D710\" }\n ],\n \"dpi\": [ 217.7, 204.2 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/GT-N7100/*\" },\n { \"ua\": \"GT-N7100\" }\n ],\n \"dpi\": 265.1,\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SCH-I605/*\" },\n { \"ua\": \"SCH-I605\" }\n ],\n \"dpi\": 265.1,\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/Galaxy Nexus/*\" },\n { \"ua\": \"Galaxy Nexus\" }\n ],\n \"dpi\": [ 315.3, 314.2 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-N910H/*\" },\n { \"ua\": \"SM-N910H\" }\n ],\n \"dpi\": [ 515.1, 518.0 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-N910C/*\" },\n { \"ua\": \"SM-N910C\" }\n ],\n \"dpi\": [ 515.2, 520.2 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G130M/*\" },\n { \"ua\": \"SM-G130M\" }\n ],\n \"dpi\": [ 165.9, 164.8 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G928I/*\" },\n { \"ua\": \"SM-G928I\" }\n ],\n \"dpi\": [ 515.1, 518.4 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G920F/*\" },\n { \"ua\": \"SM-G920F\" }\n ],\n \"dpi\": 580.6,\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G920P/*\" },\n { \"ua\": \"SM-G920P\" }\n ],\n \"dpi\": [ 522.5, 577.0 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G925F/*\" },\n { \"ua\": \"SM-G925F\" }\n ],\n \"dpi\": 580.6,\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"samsung/*/SM-G925V/*\" },\n { \"ua\": \"SM-G925V\" }\n ],\n \"dpi\": [ 522.5, 576.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Sony/*/C6903/*\" },\n { \"ua\": \"C6903\" }\n ],\n \"dpi\": [ 442.5, 443.3 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Sony/*/D6653/*\" },\n { \"ua\": \"D6653\" }\n ],\n \"dpi\": [ 428.6, 427.6 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Sony/*/E6653/*\" },\n { \"ua\": \"E6653\" }\n ],\n \"dpi\": [ 428.6, 425.7 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Sony/*/E6853/*\" },\n { \"ua\": \"E6853\" }\n ],\n \"dpi\": [ 403.4, 401.9 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"Sony/*/SGP321/*\" },\n { \"ua\": \"SGP321\" }\n ],\n \"dpi\": [ 224.7, 224.1 ],\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"TCT/*/ALCATEL ONE TOUCH Fierce/*\" },\n { \"ua\": \"ALCATEL ONE TOUCH Fierce\" }\n ],\n \"dpi\": [ 240.0, 247.5 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"THL/*/thl 5000/*\" },\n { \"ua\": \"thl 5000\" }\n ],\n \"dpi\": [ 480.0, 443.3 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"android\",\n \"rules\": [\n { \"mdmh\": \"ZTE/*/ZTE Blade L2/*\" },\n { \"ua\": \"ZTE Blade L2\" }\n ],\n \"dpi\": 240.0,\n \"bw\": 3,\n \"ac\": 500\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 640, 960 ] } ],\n \"dpi\": [ 325.1, 328.4 ],\n \"bw\": 4,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 640, 960 ] } ],\n \"dpi\": [ 325.1, 328.4 ],\n \"bw\": 4,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 640, 1136 ] } ],\n \"dpi\": [ 317.1, 320.2 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 640, 1136 ] } ],\n \"dpi\": [ 317.1, 320.2 ],\n \"bw\": 3,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 750, 1334 ] } ],\n \"dpi\": 326.4,\n \"bw\": 4,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 750, 1334 ] } ],\n \"dpi\": 326.4,\n \"bw\": 4,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 1242, 2208 ] } ],\n \"dpi\": [ 453.6, 458.4 ],\n \"bw\": 4,\n \"ac\": 1000\n },\n\n {\n \"type\": \"ios\",\n \"rules\": [ { \"res\": [ 1242, 2208 ] } ],\n \"dpi\": [ 453.6, 458.4 ],\n \"bw\": 4,\n \"ac\": 1000\n }\n]};\n\nmodule.exports = DPDB_CACHE;\n\n},{}],13:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Offline cache of the DPDB, to be used until we load the online one (and\n// as a fallback in case we can't load the online one).\nvar DPDB_CACHE = _dereq_('./dpdb-cache.js');\nvar Util = _dereq_('../util.js');\n\n// Online DPDB URL.\nvar ONLINE_DPDB_URL = 'https://storage.googleapis.com/cardboard-dpdb/dpdb.json';\n\n/**\n * Calculates device parameters based on the DPDB (Device Parameter Database).\n * Initially, uses the cached DPDB values.\n *\n * If fetchOnline == true, then this object tries to fetch the online version\n * of the DPDB and updates the device info if a better match is found.\n * Calls the onDeviceParamsUpdated callback when there is an update to the\n * device information.\n */\nfunction Dpdb(fetchOnline, onDeviceParamsUpdated) {\n // Start with the offline DPDB cache while we are loading the real one.\n this.dpdb = DPDB_CACHE;\n\n // Calculate device params based on the offline version of the DPDB.\n this.recalculateDeviceParams_();\n\n // XHR to fetch online DPDB file, if requested.\n if (fetchOnline) {\n // Set the callback.\n this.onDeviceParamsUpdated = onDeviceParamsUpdated;\n\n console.log('Fetching DPDB...');\n var xhr = new XMLHttpRequest();\n var obj = this;\n xhr.open('GET', ONLINE_DPDB_URL, true);\n xhr.addEventListener('load', function() {\n obj.loading = false;\n if (xhr.status >= 200 && xhr.status <= 299) {\n // Success.\n console.log('Successfully loaded online DPDB.');\n obj.dpdb = JSON.parse(xhr.response);\n obj.recalculateDeviceParams_();\n } else {\n // Error loading the DPDB.\n console.error('Error loading online DPDB!');\n }\n });\n xhr.send();\n }\n}\n\n// Returns the current device parameters.\nDpdb.prototype.getDeviceParams = function() {\n return this.deviceParams;\n};\n\n// Recalculates this device's parameters based on the DPDB.\nDpdb.prototype.recalculateDeviceParams_ = function() {\n console.log('Recalculating device params.');\n var newDeviceParams = this.calcDeviceParams_();\n console.log('New device parameters:');\n console.log(newDeviceParams);\n if (newDeviceParams) {\n this.deviceParams = newDeviceParams;\n // Invoke callback, if it is set.\n if (this.onDeviceParamsUpdated) {\n this.onDeviceParamsUpdated(this.deviceParams);\n }\n } else {\n console.error('Failed to recalculate device parameters.');\n }\n};\n\n// Returns a DeviceParams object that represents the best guess as to this\n// device's parameters. Can return null if the device does not match any\n// known devices.\nDpdb.prototype.calcDeviceParams_ = function() {\n var db = this.dpdb; // shorthand\n if (!db) {\n console.error('DPDB not available.');\n return null;\n }\n if (db.format != 1) {\n console.error('DPDB has unexpected format version.');\n return null;\n }\n if (!db.devices || !db.devices.length) {\n console.error('DPDB does not have a devices section.');\n return null;\n }\n\n // Get the actual user agent and screen dimensions in pixels.\n var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n var width = Util.getScreenWidth();\n var height = Util.getScreenHeight();\n console.log('User agent: ' + userAgent);\n console.log('Pixel width: ' + width);\n console.log('Pixel height: ' + height);\n\n if (!db.devices) {\n console.error('DPDB has no devices section.');\n return null;\n }\n\n for (var i = 0; i < db.devices.length; i++) {\n var device = db.devices[i];\n if (!device.rules) {\n console.warn('Device[' + i + '] has no rules section.');\n continue;\n }\n\n if (device.type != 'ios' && device.type != 'android') {\n console.warn('Device[' + i + '] has invalid type.');\n continue;\n }\n\n // See if this device is of the appropriate type.\n if (Util.isIOS() != (device.type == 'ios')) continue;\n\n // See if this device matches any of the rules:\n var matched = false;\n for (var j = 0; j < device.rules.length; j++) {\n var rule = device.rules[j];\n if (this.matchRule_(rule, userAgent, width, height)) {\n console.log('Rule matched:');\n console.log(rule);\n matched = true;\n break;\n }\n }\n if (!matched) continue;\n\n // device.dpi might be an array of [ xdpi, ydpi] or just a scalar.\n var xdpi = device.dpi[0] || device.dpi;\n var ydpi = device.dpi[1] || device.dpi;\n\n return new DeviceParams({ xdpi: xdpi, ydpi: ydpi, bevelMm: device.bw });\n }\n\n console.warn('No DPDB device match.');\n return null;\n};\n\nDpdb.prototype.matchRule_ = function(rule, ua, screenWidth, screenHeight) {\n // We can only match 'ua' and 'res' rules, not other types like 'mdmh'\n // (which are meant for native platforms).\n if (!rule.ua && !rule.res) return false;\n\n // If our user agent string doesn't contain the indicated user agent string,\n // the match fails.\n if (rule.ua && ua.indexOf(rule.ua) < 0) return false;\n\n // If the rule specifies screen dimensions that don't correspond to ours,\n // the match fails.\n if (rule.res) {\n if (!rule.res[0] || !rule.res[1]) return false;\n var resX = rule.res[0];\n var resY = rule.res[1];\n // Compare min and max so as to make the order not matter, i.e., it should\n // be true that 640x480 == 480x640.\n if (Math.min(screenWidth, screenHeight) != Math.min(resX, resY) ||\n (Math.max(screenWidth, screenHeight) != Math.max(resX, resY))) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction DeviceParams(params) {\n this.xdpi = params.xdpi;\n this.ydpi = params.ydpi;\n this.bevelMm = params.bevelMm;\n}\n\nmodule.exports = Dpdb;\n},{\"../util.js\":24,\"./dpdb-cache.js\":12}],14:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction Emitter() {\n this.callbacks = {};\n}\n\nEmitter.prototype.emit = function(eventName) {\n var callbacks = this.callbacks[eventName];\n if (!callbacks) {\n //console.log('No valid callback specified.');\n return;\n }\n var args = [].slice.call(arguments);\n // Eliminate the first param (the callback).\n args.shift();\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].apply(this, args);\n }\n};\n\nEmitter.prototype.on = function(eventName, callback) {\n if (eventName in this.callbacks) {\n this.callbacks[eventName].push(callback);\n } else {\n this.callbacks[eventName] = [callback];\n }\n};\n\nmodule.exports = Emitter;\n\n},{}],15:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar Util = _dereq_('./util.js');\nvar WebVRPolyfill = _dereq_('./webvr-polyfill.js');\n\n// Initialize a WebVRConfig just in case.\nwindow.WebVRConfig = Util.extend({\n // Forces availability of VR mode, even for non-mobile devices.\n FORCE_ENABLE_VR: false,\n\n // Complementary filter coefficient. 0 for accelerometer, 1 for gyro.\n K_FILTER: 0.98,\n\n // How far into the future to predict during fast motion (in seconds).\n PREDICTION_TIME_S: 0.040,\n\n // Flag to disable touch panner. In case you have your own touch controls.\n TOUCH_PANNER_DISABLED: false,\n\n // Flag to disabled the UI in VR Mode.\n CARDBOARD_UI_DISABLED: false, // Default: false\n\n // Flag to disable the instructions to rotate your device.\n ROTATE_INSTRUCTIONS_DISABLED: false, // Default: false.\n\n // Enable yaw panning only, disabling roll and pitch. This can be useful\n // for panoramas with nothing interesting above or below.\n YAW_ONLY: false,\n\n // To disable keyboard and mouse controls, if you want to use your own\n // implementation.\n MOUSE_KEYBOARD_CONTROLS_DISABLED: false,\n\n // Prevent the polyfill from initializing immediately. Requires the app\n // to call InitializeWebVRPolyfill() before it can be used.\n DEFER_INITIALIZATION: false,\n\n // Enable the deprecated version of the API (navigator.getVRDevices).\n ENABLE_DEPRECATED_API: false,\n\n // Scales the recommended buffer size reported by WebVR, which can improve\n // performance.\n // UPDATE(2016-05-03): Setting this to 0.5 by default since 1.0 does not\n // perform well on many mobile devices.\n BUFFER_SCALE: 0.5,\n\n // Allow VRDisplay.submitFrame to change gl bindings, which is more\n // efficient if the application code will re-bind its resources on the\n // next frame anyway. This has been seen to cause rendering glitches with\n // THREE.js.\n // Dirty bindings include: gl.FRAMEBUFFER_BINDING, gl.CURRENT_PROGRAM,\n // gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING,\n // and gl.TEXTURE_BINDING_2D for texture unit 0.\n DIRTY_SUBMIT_FRAME_BINDINGS: false\n}, window.WebVRConfig);\n\nif (!window.WebVRConfig.DEFER_INITIALIZATION) {\n new WebVRPolyfill();\n} else {\n window.InitializeWebVRPolyfill = function() {\n new WebVRPolyfill();\n }\n}\n\n},{\"./util.js\":24,\"./webvr-polyfill.js\":27}],16:[function(_dereq_,module,exports){\n/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n},{}],17:[function(_dereq_,module,exports){\n/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar VRDisplay = _dereq_('./base.js').VRDisplay;\nvar MathUtil = _dereq_('./math-util.js');\nvar Util = _dereq_('./util.js');\n\n// How much to rotate per key stroke.\nvar KEY_SPEED = 0.15;\nvar KEY_ANIMATION_DURATION = 80;\n\n// How much to rotate for mouse events.\nvar MOUSE_SPEED_X = 0.5;\nvar MOUSE_SPEED_Y = 0.3;\n\n/**\n * VRDisplay based on mouse and keyboard input. Designed for desktops/laptops\n * where orientation events aren't supported. Cannot present.\n */\nfunction MouseKeyboardVRDisplay() {\n this.displayName = 'Mouse and Keyboard VRDisplay (webvr-polyfill)';\n\n this.capabilities.hasOrientation = true;\n\n // Attach to mouse and keyboard events.\n window.addEventListener('keydown', this.onKeyDown_.bind(this));\n window.addEventListener('mousemove', this.onMouseMove_.bind(this));\n window.addEventListener('mousedown', this.onMouseDown_.bind(this));\n window.addEventListener('mouseup', this.onMouseUp_.bind(this));\n\n // \"Private\" members.\n this.phi_ = 0;\n this.theta_ = 0;\n\n // Variables for keyboard-based rotation animation.\n this.targetAngle_ = null;\n this.angleAnimation_ = null;\n\n // State variables for calculations.\n this.orientation_ = new MathUtil.Quaternion();\n\n // Variables for mouse-based rotation.\n this.rotateStart_ = new MathUtil.Vector2();\n this.rotateEnd_ = new MathUtil.Vector2();\n this.rotateDelta_ = new MathUtil.Vector2();\n this.isDragging_ = false;\n\n this.orientationOut_ = new Float32Array(4);\n}\nMouseKeyboardVRDisplay.prototype = new VRDisplay();\n\nMouseKeyboardVRDisplay.prototype.getImmediatePose = function() {\n this.orientation_.setFromEulerYXZ(this.phi_, this.theta_, 0);\n\n this.orientationOut_[0] = this.orientation_.x;\n this.orientationOut_[1] = this.orientation_.y;\n this.orientationOut_[2] = this.orientation_.z;\n this.orientationOut_[3] = this.orientation_.w;\n\n return {\n position: null,\n orientation: this.orientationOut_,\n linearVelocity: null,\n linearAcceleration: null,\n angularVelocity: null,\n angularAcceleration: null\n };\n};\n\nMouseKeyboardVRDisplay.prototype.onKeyDown_ = function(e) {\n // Track WASD and arrow keys.\n if (e.keyCode == 38) { // Up key.\n this.animatePhi_(this.phi_ + KEY_SPEED);\n } else if (e.keyCode == 39) { // Right key.\n this.animateTheta_(this.theta_ - KEY_SPEED);\n } else if (e.keyCode == 40) { // Down key.\n this.animatePhi_(this.phi_ - KEY_SPEED);\n } else if (e.keyCode == 37) { // Left key.\n this.animateTheta_(this.theta_ + KEY_SPEED);\n }\n};\n\nMouseKeyboardVRDisplay.prototype.animateTheta_ = function(targetAngle) {\n this.animateKeyTransitions_('theta_', targetAngle);\n};\n\nMouseKeyboardVRDisplay.prototype.animatePhi_ = function(targetAngle) {\n // Prevent looking too far up or down.\n targetAngle = Util.clamp(targetAngle, -Math.PI/2, Math.PI/2);\n this.animateKeyTransitions_('phi_', targetAngle);\n};\n\n/**\n * Start an animation to transition an angle from one value to another.\n */\nMouseKeyboardVRDisplay.prototype.animateKeyTransitions_ = function(angleName, targetAngle) {\n // If an animation is currently running, cancel it.\n if (this.angleAnimation_) {\n cancelAnimationFrame(this.angleAnimation_);\n }\n var startAngle = this[angleName];\n var startTime = new Date();\n // Set up an interval timer to perform the animation.\n this.angleAnimation_ = requestAnimationFrame(function animate() {\n // Once we're finished the animation, we're done.\n var elapsed = new Date() - startTime;\n if (elapsed >= KEY_ANIMATION_DURATION) {\n this[angleName] = targetAngle;\n cancelAnimationFrame(this.angleAnimation_);\n return;\n }\n // loop with requestAnimationFrame\n this.angleAnimation_ = requestAnimationFrame(animate.bind(this))\n // Linearly interpolate the angle some amount.\n var percent = elapsed / KEY_ANIMATION_DURATION;\n this[angleName] = startAngle + (targetAngle - startAngle) * percent;\n }.bind(this));\n};\n\nMouseKeyboardVRDisplay.prototype.onMouseDown_ = function(e) {\n this.rotateStart_.set(e.clientX, e.clientY);\n this.isDragging_ = true;\n};\n\n// Very similar to https://gist.github.com/mrflix/8351020\nMouseKeyboardVRDisplay.prototype.onMouseMove_ = function(e) {\n if (!this.isDragging_ && !this.isPointerLocked_()) {\n return;\n }\n // Support pointer lock API.\n if (this.isPointerLocked_()) {\n var movementX = e.movementX || e.mozMovementX || 0;\n var movementY = e.movementY || e.mozMovementY || 0;\n this.rotateEnd_.set(this.rotateStart_.x - movementX, this.rotateStart_.y - movementY);\n } else {\n this.rotateEnd_.set(e.clientX, e.clientY);\n }\n // Calculate how much we moved in mouse space.\n this.rotateDelta_.subVectors(this.rotateEnd_, this.rotateStart_);\n this.rotateStart_.copy(this.rotateEnd_);\n\n // Keep track of the cumulative euler angles.\n this.phi_ += 2 * Math.PI * this.rotateDelta_.y / screen.height * MOUSE_SPEED_Y;\n this.theta_ += 2 * Math.PI * this.rotateDelta_.x / screen.width * MOUSE_SPEED_X;\n\n // Prevent looking too far up or down.\n this.phi_ = Util.clamp(this.phi_, -Math.PI/2, Math.PI/2);\n};\n\nMouseKeyboardVRDisplay.prototype.onMouseUp_ = function(e) {\n this.isDragging_ = false;\n};\n\nMouseKeyboardVRDisplay.prototype.isPointerLocked_ = function() {\n var el = document.pointerLockElement || document.mozPointerLockElement ||\n document.webkitPointerLockElement;\n return el !== undefined;\n};\n\nMouseKeyboardVRDisplay.prototype.resetPose = function() {\n this.phi_ = 0;\n this.theta_ = 0;\n};\n\nmodule.exports = MouseKeyboardVRDisplay;\n\n},{\"./base.js\":4,\"./math-util.js\":16,\"./util.js\":24}],18:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = _dereq_('./util.js');\n\nfunction RotateInstructions() {\n this.loadIcon_();\n\n var overlay = document.createElement('div');\n var s = overlay.style;\n s.position = 'fixed';\n s.top = 0;\n s.right = 0;\n s.bottom = 0;\n s.left = 0;\n s.backgroundColor = 'gray';\n s.fontFamily = 'sans-serif';\n // Force this to be above the fullscreen canvas, which is at zIndex: 999999.\n s.zIndex = 1000000;\n\n var img = document.createElement('img');\n img.src = this.icon;\n var s = img.style;\n s.marginLeft = '25%';\n s.marginTop = '25%';\n s.width = '50%';\n overlay.appendChild(img);\n\n var text = document.createElement('div');\n var s = text.style;\n s.textAlign = 'center';\n s.fontSize = '16px';\n s.lineHeight = '24px';\n s.margin = '24px 25%';\n s.width = '50%';\n text.innerHTML = 'Place your phone into your Cardboard viewer.';\n overlay.appendChild(text);\n\n var snackbar = document.createElement('div');\n var s = snackbar.style;\n s.backgroundColor = '#CFD8DC';\n s.position = 'fixed';\n s.bottom = 0;\n s.width = '100%';\n s.height = '48px';\n s.padding = '14px 24px';\n s.boxSizing = 'border-box';\n s.color = '#656A6B';\n overlay.appendChild(snackbar);\n\n var snackbarText = document.createElement('div');\n snackbarText.style.float = 'left';\n snackbarText.innerHTML = 'No Cardboard viewer?';\n\n var snackbarButton = document.createElement('a');\n snackbarButton.href = 'https://www.google.com/get/cardboard/get-cardboard/';\n snackbarButton.innerHTML = 'get one';\n snackbarButton.target = '_blank';\n var s = snackbarButton.style;\n s.float = 'right';\n s.fontWeight = 600;\n s.textTransform = 'uppercase';\n s.borderLeft = '1px solid gray';\n s.paddingLeft = '24px';\n s.textDecoration = 'none';\n s.color = '#656A6B';\n\n snackbar.appendChild(snackbarText);\n snackbar.appendChild(snackbarButton);\n\n this.overlay = overlay;\n this.text = text;\n\n this.hide();\n}\n\nRotateInstructions.prototype.show = function(parent) {\n if (!parent && !this.overlay.parentElement) {\n document.body.appendChild(this.overlay);\n } else if (parent) {\n if (this.overlay.parentElement && this.overlay.parentElement != parent)\n this.overlay.parentElement.removeChild(this.overlay);\n\n parent.appendChild(this.overlay);\n }\n\n this.overlay.style.display = 'block';\n\n var img = this.overlay.querySelector('img');\n var s = img.style;\n\n if (Util.isLandscapeMode()) {\n s.width = '20%';\n s.marginLeft = '40%';\n s.marginTop = '3%';\n } else {\n s.width = '50%';\n s.marginLeft = '25%';\n s.marginTop = '25%';\n }\n};\n\nRotateInstructions.prototype.hide = function() {\n this.overlay.style.display = 'none';\n};\n\nRotateInstructions.prototype.showTemporarily = function(ms, parent) {\n this.show(parent);\n this.timer = setTimeout(this.hide.bind(this), ms);\n};\n\nRotateInstructions.prototype.disableShowTemporarily = function() {\n clearTimeout(this.timer);\n};\n\nRotateInstructions.prototype.update = function() {\n this.disableShowTemporarily();\n // In portrait VR mode, tell the user to rotate to landscape. Otherwise, hide\n // the instructions.\n if (!Util.isLandscapeMode() && Util.isMobile()) {\n this.show();\n } else {\n this.hide();\n }\n};\n\nRotateInstructions.prototype.loadIcon_ = function() {\n // Encoded asset_src/rotate-instructions.svg\n this.icon = Util.base64('image/svg+xml', 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE5OHB4IiBoZWlnaHQ9IjI0MHB4IiB2aWV3Qm94PSIwIDAgMTk4IDI0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4zICgxMjA4MSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHJhbnNpdGlvbjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgogICAgICAgIDxnIGlkPSJ0cmFuc2l0aW9uIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KICAgICAgICAgICAgPGcgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTQtKy1JbXBvcnRlZC1MYXllcnMtQ29weS0rLUltcG9ydGVkLUxheWVycy1Db3B5LTItQ29weSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHktNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwNy4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjYyNSwyLjUyNyBDMTQ5LjYyNSwyLjUyNyAxNTUuODA1LDYuMDk2IDE1Ni4zNjIsNi40MTggTDE1Ni4zNjIsNy4zMDQgQzE1Ni4zNjIsNy40ODEgMTU2LjM3NSw3LjY2NCAxNTYuNCw3Ljg1MyBDMTU2LjQxLDcuOTM0IDE1Ni40Miw4LjAxNSAxNTYuNDI3LDguMDk1IEMxNTYuNTY3LDkuNTEgMTU3LjQwMSwxMS4wOTMgMTU4LjUzMiwxMi4wOTQgTDE2NC4yNTIsMTcuMTU2IEwxNjQuMzMzLDE3LjA2NiBDMTY0LjMzMywxNy4wNjYgMTY4LjcxNSwxNC41MzYgMTY5LjU2OCwxNC4wNDIgQzE3MS4wMjUsMTQuODgzIDE5NS41MzgsMjkuMDM1IDE5NS41MzgsMjkuMDM1IEwxOTUuNTM4LDgzLjAzNiBDMTk1LjUzOCw4My44MDcgMTk1LjE1Miw4NC4yNTMgMTk0LjU5LDg0LjI1MyBDMTk0LjM1Nyw4NC4yNTMgMTk0LjA5NSw4NC4xNzcgMTkzLjgxOCw4NC4wMTcgTDE2OS44NTEsNzAuMTc5IEwxNjkuODM3LDcwLjIwMyBMMTQyLjUxNSw4NS45NzggTDE0MS42NjUsODQuNjU1IEMxMzYuOTM0LDgzLjEyNiAxMzEuOTE3LDgxLjkxNSAxMjYuNzE0LDgxLjA0NSBDMTI2LjcwOSw4MS4wNiAxMjYuNzA3LDgxLjA2OSAxMjYuNzA3LDgxLjA2OSBMMTIxLjY0LDk4LjAzIEwxMTMuNzQ5LDEwMi41ODYgTDExMy43MTIsMTAyLjUyMyBMMTEzLjcxMiwxMzAuMTEzIEMxMTMuNzEyLDEzMC44ODUgMTEzLjMyNiwxMzEuMzMgMTEyLjc2NCwxMzEuMzMgQzExMi41MzIsMTMxLjMzIDExMi4yNjksMTMxLjI1NCAxMTEuOTkyLDEzMS4wOTQgTDY5LjUxOSwxMDYuNTcyIEM2OC41NjksMTA2LjAyMyA2Ny43OTksMTA0LjY5NSA2Ny43OTksMTAzLjYwNSBMNjcuNzk5LDEwMi41NyBMNjcuNzc4LDEwMi42MTcgQzY3LjI3LDEwMi4zOTMgNjYuNjQ4LDEwMi4yNDkgNjUuOTYyLDEwMi4yMTggQzY1Ljg3NSwxMDIuMjE0IDY1Ljc4OCwxMDIuMjEyIDY1LjcwMSwxMDIuMjEyIEM2NS42MDYsMTAyLjIxMiA2NS41MTEsMTAyLjIxNSA2NS40MTYsMTAyLjIxOSBDNjUuMTk1LDEwMi4yMjkgNjQuOTc0LDEwMi4yMzUgNjQuNzU0LDEwMi4yMzUgQzY0LjMzMSwxMDIuMjM1IDYzLjkxMSwxMDIuMjE2IDYzLjQ5OCwxMDIuMTc4IEM2MS44NDMsMTAyLjAyNSA2MC4yOTgsMTAxLjU3OCA1OS4wOTQsMTAwLjg4MiBMMTIuNTE4LDczLjk5MiBMMTIuNTIzLDc0LjAwNCBMMi4yNDUsNTUuMjU0IEMxLjI0NCw1My40MjcgMi4wMDQsNTEuMDM4IDMuOTQzLDQ5LjkxOCBMNTkuOTU0LDE3LjU3MyBDNjAuNjI2LDE3LjE4NSA2MS4zNSwxNy4wMDEgNjIuMDUzLDE3LjAwMSBDNjMuMzc5LDE3LjAwMSA2NC42MjUsMTcuNjYgNjUuMjgsMTguODU0IEw2NS4yODUsMTguODUxIEw2NS41MTIsMTkuMjY0IEw2NS41MDYsMTkuMjY4IEM2NS45MDksMjAuMDAzIDY2LjQwNSwyMC42OCA2Ni45ODMsMjEuMjg2IEw2Ny4yNiwyMS41NTYgQzY5LjE3NCwyMy40MDYgNzEuNzI4LDI0LjM1NyA3NC4zNzMsMjQuMzU3IEM3Ni4zMjIsMjQuMzU3IDc4LjMyMSwyMy44NCA4MC4xNDgsMjIuNzg1IEM4MC4xNjEsMjIuNzg1IDg3LjQ2NywxOC41NjYgODcuNDY3LDE4LjU2NiBDODguMTM5LDE4LjE3OCA4OC44NjMsMTcuOTk0IDg5LjU2NiwxNy45OTQgQzkwLjg5MiwxNy45OTQgOTIuMTM4LDE4LjY1MiA5Mi43OTIsMTkuODQ3IEw5Ni4wNDIsMjUuNzc1IEw5Ni4wNjQsMjUuNzU3IEwxMDIuODQ5LDI5LjY3NCBMMTAyLjc0NCwyOS40OTIgTDE0OS42MjUsMi41MjcgTTE0OS42MjUsMC44OTIgQzE0OS4zNDMsMC44OTIgMTQ5LjA2MiwwLjk2NSAxNDguODEsMS4xMSBMMTAyLjY0MSwyNy42NjYgTDk3LjIzMSwyNC41NDIgTDk0LjIyNiwxOS4wNjEgQzkzLjMxMywxNy4zOTQgOTEuNTI3LDE2LjM1OSA4OS41NjYsMTYuMzU4IEM4OC41NTUsMTYuMzU4IDg3LjU0NiwxNi42MzIgODYuNjQ5LDE3LjE1IEM4My44NzgsMTguNzUgNzkuNjg3LDIxLjE2OSA3OS4zNzQsMjEuMzQ1IEM3OS4zNTksMjEuMzUzIDc5LjM0NSwyMS4zNjEgNzkuMzMsMjEuMzY5IEM3Ny43OTgsMjIuMjU0IDc2LjA4NCwyMi43MjIgNzQuMzczLDIyLjcyMiBDNzIuMDgxLDIyLjcyMiA2OS45NTksMjEuODkgNjguMzk3LDIwLjM4IEw2OC4xNDUsMjAuMTM1IEM2Ny43MDYsMTkuNjcyIDY3LjMyMywxOS4xNTYgNjcuMDA2LDE4LjYwMSBDNjYuOTg4LDE4LjU1OSA2Ni45NjgsMTguNTE5IDY2Ljk0NiwxOC40NzkgTDY2LjcxOSwxOC4wNjUgQzY2LjY5LDE4LjAxMiA2Ni42NTgsMTcuOTYgNjYuNjI0LDE3LjkxMSBDNjUuNjg2LDE2LjMzNyA2My45NTEsMTUuMzY2IDYyLjA1MywxNS4zNjYgQzYxLjA0MiwxNS4zNjYgNjAuMDMzLDE1LjY0IDU5LjEzNiwxNi4xNTggTDMuMTI1LDQ4LjUwMiBDMC40MjYsNTAuMDYxIC0wLjYxMyw1My40NDIgMC44MTEsNTYuMDQgTDExLjA4OSw3NC43OSBDMTEuMjY2LDc1LjExMyAxMS41MzcsNzUuMzUzIDExLjg1LDc1LjQ5NCBMNTguMjc2LDEwMi4yOTggQzU5LjY3OSwxMDMuMTA4IDYxLjQzMywxMDMuNjMgNjMuMzQ4LDEwMy44MDYgQzYzLjgxMiwxMDMuODQ4IDY0LjI4NSwxMDMuODcgNjQuNzU0LDEwMy44NyBDNjUsMTAzLjg3IDY1LjI0OSwxMDMuODY0IDY1LjQ5NCwxMDMuODUyIEM2NS41NjMsMTAzLjg0OSA2NS42MzIsMTAzLjg0NyA2NS43MDEsMTAzLjg0NyBDNjUuNzY0LDEwMy44NDcgNjUuODI4LDEwMy44NDkgNjUuODksMTAzLjg1MiBDNjUuOTg2LDEwMy44NTYgNjYuMDgsMTAzLjg2MyA2Ni4xNzMsMTAzLjg3NCBDNjYuMjgyLDEwNS40NjcgNjcuMzMyLDEwNy4xOTcgNjguNzAyLDEwNy45ODggTDExMS4xNzQsMTMyLjUxIEMxMTEuNjk4LDEzMi44MTIgMTEyLjIzMiwxMzIuOTY1IDExMi43NjQsMTMyLjk2NSBDMTE0LjI2MSwxMzIuOTY1IDExNS4zNDcsMTMxLjc2NSAxMTUuMzQ3LDEzMC4xMTMgTDExNS4zNDcsMTAzLjU1MSBMMTIyLjQ1OCw5OS40NDYgQzEyMi44MTksOTkuMjM3IDEyMy4wODcsOTguODk4IDEyMy4yMDcsOTguNDk4IEwxMjcuODY1LDgyLjkwNSBDMTMyLjI3OSw4My43MDIgMTM2LjU1Nyw4NC43NTMgMTQwLjYwNyw4Ni4wMzMgTDE0MS4xNCw4Ni44NjIgQzE0MS40NTEsODcuMzQ2IDE0MS45NzcsODcuNjEzIDE0Mi41MTYsODcuNjEzIEMxNDIuNzk0LDg3LjYxMyAxNDMuMDc2LDg3LjU0MiAxNDMuMzMzLDg3LjM5MyBMMTY5Ljg2NSw3Mi4wNzYgTDE5Myw4NS40MzMgQzE5My41MjMsODUuNzM1IDE5NC4wNTgsODUuODg4IDE5NC41OSw4NS44ODggQzE5Ni4wODcsODUuODg4IDE5Ny4xNzMsODQuNjg5IDE5Ny4xNzMsODMuMDM2IEwxOTcuMTczLDI5LjAzNSBDMTk3LjE3MywyOC40NTEgMTk2Ljg2MSwyNy45MTEgMTk2LjM1NSwyNy42MTkgQzE5Ni4zNTUsMjcuNjE5IDE3MS44NDMsMTMuNDY3IDE3MC4zODUsMTIuNjI2IEMxNzAuMTMyLDEyLjQ4IDE2OS44NSwxMi40MDcgMTY5LjU2OCwxMi40MDcgQzE2OS4yODUsMTIuNDA3IDE2OS4wMDIsMTIuNDgxIDE2OC43NDksMTIuNjI3IEMxNjguMTQzLDEyLjk3OCAxNjUuNzU2LDE0LjM1NyAxNjQuNDI0LDE1LjEyNSBMMTU5LjYxNSwxMC44NyBDMTU4Ljc5NiwxMC4xNDUgMTU4LjE1NCw4LjkzNyAxNTguMDU0LDcuOTM0IEMxNTguMDQ1LDcuODM3IDE1OC4wMzQsNy43MzkgMTU4LjAyMSw3LjY0IEMxNTguMDA1LDcuNTIzIDE1Ny45OTgsNy40MSAxNTcuOTk4LDcuMzA0IEwxNTcuOTk4LDYuNDE4IEMxNTcuOTk4LDUuODM0IDE1Ny42ODYsNS4yOTUgMTU3LjE4MSw1LjAwMiBDMTU2LjYyNCw0LjY4IDE1MC40NDIsMS4xMTEgMTUwLjQ0MiwxLjExMSBDMTUwLjE4OSwwLjk2NSAxNDkuOTA3LDAuODkyIDE0OS42MjUsMC44OTIiIGlkPSJGaWxsLTEiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTYuMDI3LDI1LjYzNiBMMTQyLjYwMyw1Mi41MjcgQzE0My44MDcsNTMuMjIyIDE0NC41ODIsNTQuMTE0IDE0NC44NDUsNTUuMDY4IEwxNDQuODM1LDU1LjA3NSBMNjMuNDYxLDEwMi4wNTcgTDYzLjQ2LDEwMi4wNTcgQzYxLjgwNiwxMDEuOTA1IDYwLjI2MSwxMDEuNDU3IDU5LjA1NywxMDAuNzYyIEwxMi40ODEsNzMuODcxIEw5Ni4wMjcsMjUuNjM2IiBpZD0iRmlsbC0yIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjQ2MSwxMDIuMTc0IEM2My40NTMsMTAyLjE3NCA2My40NDYsMTAyLjE3NCA2My40MzksMTAyLjE3MiBDNjEuNzQ2LDEwMi4wMTYgNjAuMjExLDEwMS41NjMgNTguOTk4LDEwMC44NjMgTDEyLjQyMiw3My45NzMgQzEyLjM4Niw3My45NTIgMTIuMzY0LDczLjkxNCAxMi4zNjQsNzMuODcxIEMxMi4zNjQsNzMuODMgMTIuMzg2LDczLjc5MSAxMi40MjIsNzMuNzcgTDk1Ljk2OCwyNS41MzUgQzk2LjAwNCwyNS41MTQgOTYuMDQ5LDI1LjUxNCA5Ni4wODUsMjUuNTM1IEwxNDIuNjYxLDUyLjQyNiBDMTQzLjg4OCw1My4xMzQgMTQ0LjY4Miw1NC4wMzggMTQ0Ljk1Nyw1NS4wMzcgQzE0NC45Nyw1NS4wODMgMTQ0Ljk1Myw1NS4xMzMgMTQ0LjkxNSw1NS4xNjEgQzE0NC45MTEsNTUuMTY1IDE0NC44OTgsNTUuMTc0IDE0NC44OTQsNTUuMTc3IEw2My41MTksMTAyLjE1OCBDNjMuNTAxLDEwMi4xNjkgNjMuNDgxLDEwMi4xNzQgNjMuNDYxLDEwMi4xNzQgTDYzLjQ2MSwxMDIuMTc0IFogTTEyLjcxNCw3My44NzEgTDU5LjExNSwxMDAuNjYxIEM2MC4yOTMsMTAxLjM0MSA2MS43ODYsMTAxLjc4MiA2My40MzUsMTAxLjkzNyBMMTQ0LjcwNyw1NS4wMTUgQzE0NC40MjgsNTQuMTA4IDE0My42ODIsNTMuMjg1IDE0Mi41NDQsNTIuNjI4IEw5Ni4wMjcsMjUuNzcxIEwxMi43MTQsNzMuODcxIEwxMi43MTQsNzMuODcxIFoiIGlkPSJGaWxsLTMiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ4LjMyNyw1OC40NzEgQzE0OC4xNDUsNTguNDggMTQ3Ljk2Miw1OC40OCAxNDcuNzgxLDU4LjQ3MiBDMTQ1Ljg4Nyw1OC4zODkgMTQ0LjQ3OSw1Ny40MzQgMTQ0LjYzNiw1Ni4zNCBDMTQ0LjY4OSw1NS45NjcgMTQ0LjY2NCw1NS41OTcgMTQ0LjU2NCw1NS4yMzUgTDYzLjQ2MSwxMDIuMDU3IEM2NC4wODksMTAyLjExNSA2NC43MzMsMTAyLjEzIDY1LjM3OSwxMDIuMDk5IEM2NS41NjEsMTAyLjA5IDY1Ljc0MywxMDIuMDkgNjUuOTI1LDEwMi4wOTggQzY3LjgxOSwxMDIuMTgxIDY5LjIyNywxMDMuMTM2IDY5LjA3LDEwNC4yMyBMMTQ4LjMyNyw1OC40NzEiIGlkPSJGaWxsLTQiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjkuMDcsMTA0LjM0NyBDNjkuMDQ4LDEwNC4zNDcgNjkuMDI1LDEwNC4zNCA2OS4wMDUsMTA0LjMyNyBDNjguOTY4LDEwNC4zMDEgNjguOTQ4LDEwNC4yNTcgNjguOTU1LDEwNC4yMTMgQzY5LDEwMy44OTYgNjguODk4LDEwMy41NzYgNjguNjU4LDEwMy4yODggQzY4LjE1MywxMDIuNjc4IDY3LjEwMywxMDIuMjY2IDY1LjkyLDEwMi4yMTQgQzY1Ljc0MiwxMDIuMjA2IDY1LjU2MywxMDIuMjA3IDY1LjM4NSwxMDIuMjE1IEM2NC43NDIsMTAyLjI0NiA2NC4wODcsMTAyLjIzMiA2My40NSwxMDIuMTc0IEM2My4zOTksMTAyLjE2OSA2My4zNTgsMTAyLjEzMiA2My4zNDcsMTAyLjA4MiBDNjMuMzM2LDEwMi4wMzMgNjMuMzU4LDEwMS45ODEgNjMuNDAyLDEwMS45NTYgTDE0NC41MDYsNTUuMTM0IEMxNDQuNTM3LDU1LjExNiAxNDQuNTc1LDU1LjExMyAxNDQuNjA5LDU1LjEyNyBDMTQ0LjY0Miw1NS4xNDEgMTQ0LjY2OCw1NS4xNyAxNDQuNjc3LDU1LjIwNCBDMTQ0Ljc4MSw1NS41ODUgMTQ0LjgwNiw1NS45NzIgMTQ0Ljc1MSw1Ni4zNTcgQzE0NC43MDYsNTYuNjczIDE0NC44MDgsNTYuOTk0IDE0NS4wNDcsNTcuMjgyIEMxNDUuNTUzLDU3Ljg5MiAxNDYuNjAyLDU4LjMwMyAxNDcuNzg2LDU4LjM1NSBDMTQ3Ljk2NCw1OC4zNjMgMTQ4LjE0Myw1OC4zNjMgMTQ4LjMyMSw1OC4zNTQgQzE0OC4zNzcsNTguMzUyIDE0OC40MjQsNTguMzg3IDE0OC40MzksNTguNDM4IEMxNDguNDU0LDU4LjQ5IDE0OC40MzIsNTguNTQ1IDE0OC4zODUsNTguNTcyIEw2OS4xMjksMTA0LjMzMSBDNjkuMTExLDEwNC4zNDIgNjkuMDksMTA0LjM0NyA2OS4wNywxMDQuMzQ3IEw2OS4wNywxMDQuMzQ3IFogTTY1LjY2NSwxMDEuOTc1IEM2NS43NTQsMTAxLjk3NSA2NS44NDIsMTAxLjk3NyA2NS45MywxMDEuOTgxIEM2Ny4xOTYsMTAyLjAzNyA2OC4yODMsMTAyLjQ2OSA2OC44MzgsMTAzLjEzOSBDNjkuMDY1LDEwMy40MTMgNjkuMTg4LDEwMy43MTQgNjkuMTk4LDEwNC4wMjEgTDE0Ny44ODMsNTguNTkyIEMxNDcuODQ3LDU4LjU5MiAxNDcuODExLDU4LjU5MSAxNDcuNzc2LDU4LjU4OSBDMTQ2LjUwOSw1OC41MzMgMTQ1LjQyMiw1OC4xIDE0NC44NjcsNTcuNDMxIEMxNDQuNTg1LDU3LjA5MSAxNDQuNDY1LDU2LjcwNyAxNDQuNTIsNTYuMzI0IEMxNDQuNTYzLDU2LjAyMSAxNDQuNTUyLDU1LjcxNiAxNDQuNDg4LDU1LjQxNCBMNjMuODQ2LDEwMS45NyBDNjQuMzUzLDEwMi4wMDIgNjQuODY3LDEwMi4wMDYgNjUuMzc0LDEwMS45ODIgQzY1LjQ3MSwxMDEuOTc3IDY1LjU2OCwxMDEuOTc1IDY1LjY2NSwxMDEuOTc1IEw2NS42NjUsMTAxLjk3NSBaIiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIuMjA4LDU1LjEzNCBDMS4yMDcsNTMuMzA3IDEuOTY3LDUwLjkxNyAzLjkwNiw0OS43OTcgTDU5LjkxNywxNy40NTMgQzYxLjg1NiwxNi4zMzMgNjQuMjQxLDE2LjkwNyA2NS4yNDMsMTguNzM0IEw2NS40NzUsMTkuMTQ0IEM2NS44NzIsMTkuODgyIDY2LjM2OCwyMC41NiA2Ni45NDUsMjEuMTY1IEw2Ny4yMjMsMjEuNDM1IEM3MC41NDgsMjQuNjQ5IDc1LjgwNiwyNS4xNTEgODAuMTExLDIyLjY2NSBMODcuNDMsMTguNDQ1IEM4OS4zNywxNy4zMjYgOTEuNzU0LDE3Ljg5OSA5Mi43NTUsMTkuNzI3IEw5Ni4wMDUsMjUuNjU1IEwxMi40ODYsNzMuODg0IEwyLjIwOCw1NS4xMzQgWiIgaWQ9IkZpbGwtNiIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi40ODYsNzQuMDAxIEMxMi40NzYsNzQuMDAxIDEyLjQ2NSw3My45OTkgMTIuNDU1LDczLjk5NiBDMTIuNDI0LDczLjk4OCAxMi4zOTksNzMuOTY3IDEyLjM4NCw3My45NCBMMi4xMDYsNTUuMTkgQzEuMDc1LDUzLjMxIDEuODU3LDUwLjg0NSAzLjg0OCw0OS42OTYgTDU5Ljg1OCwxNy4zNTIgQzYwLjUyNSwxNi45NjcgNjEuMjcxLDE2Ljc2NCA2Mi4wMTYsMTYuNzY0IEM2My40MzEsMTYuNzY0IDY0LjY2NiwxNy40NjYgNjUuMzI3LDE4LjY0NiBDNjUuMzM3LDE4LjY1NCA2NS4zNDUsMTguNjYzIDY1LjM1MSwxOC42NzQgTDY1LjU3OCwxOS4wODggQzY1LjU4NCwxOS4xIDY1LjU4OSwxOS4xMTIgNjUuNTkxLDE5LjEyNiBDNjUuOTg1LDE5LjgzOCA2Ni40NjksMjAuNDk3IDY3LjAzLDIxLjA4NSBMNjcuMzA1LDIxLjM1MSBDNjkuMTUxLDIzLjEzNyA3MS42NDksMjQuMTIgNzQuMzM2LDI0LjEyIEM3Ni4zMTMsMjQuMTIgNzguMjksMjMuNTgyIDgwLjA1MywyMi41NjMgQzgwLjA2NCwyMi41NTcgODAuMDc2LDIyLjU1MyA4MC4wODgsMjIuNTUgTDg3LjM3MiwxOC4zNDQgQzg4LjAzOCwxNy45NTkgODguNzg0LDE3Ljc1NiA4OS41MjksMTcuNzU2IEM5MC45NTYsMTcuNzU2IDkyLjIwMSwxOC40NzIgOTIuODU4LDE5LjY3IEw5Ni4xMDcsMjUuNTk5IEM5Ni4xMzgsMjUuNjU0IDk2LjExOCwyNS43MjQgOTYuMDYzLDI1Ljc1NiBMMTIuNTQ1LDczLjk4NSBDMTIuNTI2LDczLjk5NiAxMi41MDYsNzQuMDAxIDEyLjQ4Niw3NC4wMDEgTDEyLjQ4Niw3NC4wMDEgWiBNNjIuMDE2LDE2Ljk5NyBDNjEuMzEyLDE2Ljk5NyA2MC42MDYsMTcuMTkgNTkuOTc1LDE3LjU1NCBMMy45NjUsNDkuODk5IEMyLjA4Myw1MC45ODUgMS4zNDEsNTMuMzA4IDIuMzEsNTUuMDc4IEwxMi41MzEsNzMuNzIzIEw5NS44NDgsMjUuNjExIEw5Mi42NTMsMTkuNzgyIEM5Mi4wMzgsMTguNjYgOTAuODcsMTcuOTkgODkuNTI5LDE3Ljk5IEM4OC44MjUsMTcuOTkgODguMTE5LDE4LjE4MiA4Ny40ODksMTguNTQ3IEw4MC4xNzIsMjIuNzcyIEM4MC4xNjEsMjIuNzc4IDgwLjE0OSwyMi43ODIgODAuMTM3LDIyLjc4NSBDNzguMzQ2LDIzLjgxMSA3Ni4zNDEsMjQuMzU0IDc0LjMzNiwyNC4zNTQgQzcxLjU4OCwyNC4zNTQgNjkuMDMzLDIzLjM0NyA2Ny4xNDIsMjEuNTE5IEw2Ni44NjQsMjEuMjQ5IEM2Ni4yNzcsMjAuNjM0IDY1Ljc3NCwxOS45NDcgNjUuMzY3LDE5LjIwMyBDNjUuMzYsMTkuMTkyIDY1LjM1NiwxOS4xNzkgNjUuMzU0LDE5LjE2NiBMNjUuMTYzLDE4LjgxOSBDNjUuMTU0LDE4LjgxMSA2NS4xNDYsMTguODAxIDY1LjE0LDE4Ljc5IEM2NC41MjUsMTcuNjY3IDYzLjM1NywxNi45OTcgNjIuMDE2LDE2Ljk5NyBMNjIuMDE2LDE2Ljk5NyBaIiBpZD0iRmlsbC03IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQyLjQzNCw0OC44MDggTDQyLjQzNCw0OC44MDggQzM5LjkyNCw0OC44MDcgMzcuNzM3LDQ3LjU1IDM2LjU4Miw0NS40NDMgQzM0Ljc3MSw0Mi4xMzkgMzYuMTQ0LDM3LjgwOSAzOS42NDEsMzUuNzg5IEw1MS45MzIsMjguNjkxIEM1My4xMDMsMjguMDE1IDU0LjQxMywyNy42NTggNTUuNzIxLDI3LjY1OCBDNTguMjMxLDI3LjY1OCA2MC40MTgsMjguOTE2IDYxLjU3MywzMS4wMjMgQzYzLjM4NCwzNC4zMjcgNjIuMDEyLDM4LjY1NyA1OC41MTQsNDAuNjc3IEw0Ni4yMjMsNDcuNzc1IEM0NS4wNTMsNDguNDUgNDMuNzQyLDQ4LjgwOCA0Mi40MzQsNDguODA4IEw0Mi40MzQsNDguODA4IFogTTU1LjcyMSwyOC4xMjUgQzU0LjQ5NSwyOC4xMjUgNTMuMjY1LDI4LjQ2MSA1Mi4xNjYsMjkuMDk2IEwzOS44NzUsMzYuMTk0IEMzNi41OTYsMzguMDg3IDM1LjMwMiw0Mi4xMzYgMzYuOTkyLDQ1LjIxOCBDMzguMDYzLDQ3LjE3MyA0MC4wOTgsNDguMzQgNDIuNDM0LDQ4LjM0IEM0My42NjEsNDguMzQgNDQuODksNDguMDA1IDQ1Ljk5LDQ3LjM3IEw1OC4yODEsNDAuMjcyIEM2MS41NiwzOC4zNzkgNjIuODUzLDM0LjMzIDYxLjE2NCwzMS4yNDggQzYwLjA5MiwyOS4yOTMgNTguMDU4LDI4LjEyNSA1NS43MjEsMjguMTI1IEw1NS43MjEsMjguMTI1IFoiIGlkPSJGaWxsLTgiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjU4OCwyLjQwNyBDMTQ5LjU4OCwyLjQwNyAxNTUuNzY4LDUuOTc1IDE1Ni4zMjUsNi4yOTcgTDE1Ni4zMjUsNy4xODQgQzE1Ni4zMjUsNy4zNiAxNTYuMzM4LDcuNTQ0IDE1Ni4zNjIsNy43MzMgQzE1Ni4zNzMsNy44MTQgMTU2LjM4Miw3Ljg5NCAxNTYuMzksNy45NzUgQzE1Ni41Myw5LjM5IDE1Ny4zNjMsMTAuOTczIDE1OC40OTUsMTEuOTc0IEwxNjUuODkxLDE4LjUxOSBDMTY2LjA2OCwxOC42NzUgMTY2LjI0OSwxOC44MTQgMTY2LjQzMiwxOC45MzQgQzE2OC4wMTEsMTkuOTc0IDE2OS4zODIsMTkuNCAxNjkuNDk0LDE3LjY1MiBDMTY5LjU0MywxNi44NjggMTY5LjU1MSwxNi4wNTcgMTY5LjUxNywxNS4yMjMgTDE2OS41MTQsMTUuMDYzIEwxNjkuNTE0LDEzLjkxMiBDMTcwLjc4LDE0LjY0MiAxOTUuNTAxLDI4LjkxNSAxOTUuNTAxLDI4LjkxNSBMMTk1LjUwMSw4Mi45MTUgQzE5NS41MDEsODQuMDA1IDE5NC43MzEsODQuNDQ1IDE5My43ODEsODMuODk3IEwxNTEuMzA4LDU5LjM3NCBDMTUwLjM1OCw1OC44MjYgMTQ5LjU4OCw1Ny40OTcgMTQ5LjU4OCw1Ni40MDggTDE0OS41ODgsMjIuMzc1IiBpZD0iRmlsbC05IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE5NC41NTMsODQuMjUgQzE5NC4yOTYsODQuMjUgMTk0LjAxMyw4NC4xNjUgMTkzLjcyMiw4My45OTcgTDE1MS4yNSw1OS40NzYgQzE1MC4yNjksNTguOTA5IDE0OS40NzEsNTcuNTMzIDE0OS40NzEsNTYuNDA4IEwxNDkuNDcxLDIyLjM3NSBMMTQ5LjcwNSwyMi4zNzUgTDE0OS43MDUsNTYuNDA4IEMxNDkuNzA1LDU3LjQ1OSAxNTAuNDUsNTguNzQ0IDE1MS4zNjYsNTkuMjc0IEwxOTMuODM5LDgzLjc5NSBDMTk0LjI2Myw4NC4wNCAxOTQuNjU1LDg0LjA4MyAxOTQuOTQyLDgzLjkxNyBDMTk1LjIyNyw4My43NTMgMTk1LjM4NCw4My4zOTcgMTk1LjM4NCw4Mi45MTUgTDE5NS4zODQsMjguOTgyIEMxOTQuMTAyLDI4LjI0MiAxNzIuMTA0LDE1LjU0MiAxNjkuNjMxLDE0LjExNCBMMTY5LjYzNCwxNS4yMiBDMTY5LjY2OCwxNi4wNTIgMTY5LjY2LDE2Ljg3NCAxNjkuNjEsMTcuNjU5IEMxNjkuNTU2LDE4LjUwMyAxNjkuMjE0LDE5LjEyMyAxNjguNjQ3LDE5LjQwNSBDMTY4LjAyOCwxOS43MTQgMTY3LjE5NywxOS41NzggMTY2LjM2NywxOS4wMzIgQzE2Ni4xODEsMTguOTA5IDE2NS45OTUsMTguNzY2IDE2NS44MTQsMTguNjA2IEwxNTguNDE3LDEyLjA2MiBDMTU3LjI1OSwxMS4wMzYgMTU2LjQxOCw5LjQzNyAxNTYuMjc0LDcuOTg2IEMxNTYuMjY2LDcuOTA3IDE1Ni4yNTcsNy44MjcgMTU2LjI0Nyw3Ljc0OCBDMTU2LjIyMSw3LjU1NSAxNTYuMjA5LDcuMzY1IDE1Ni4yMDksNy4xODQgTDE1Ni4yMDksNi4zNjQgQzE1NS4zNzUsNS44ODMgMTQ5LjUyOSwyLjUwOCAxNDkuNTI5LDIuNTA4IEwxNDkuNjQ2LDIuMzA2IEMxNDkuNjQ2LDIuMzA2IDE1NS44MjcsNS44NzQgMTU2LjM4NCw2LjE5NiBMMTU2LjQ0Miw2LjIzIEwxNTYuNDQyLDcuMTg0IEMxNTYuNDQyLDcuMzU1IDE1Ni40NTQsNy41MzUgMTU2LjQ3OCw3LjcxNyBDMTU2LjQ4OSw3LjggMTU2LjQ5OSw3Ljg4MiAxNTYuNTA3LDcuOTYzIEMxNTYuNjQ1LDkuMzU4IDE1Ny40NTUsMTAuODk4IDE1OC41NzIsMTEuODg2IEwxNjUuOTY5LDE4LjQzMSBDMTY2LjE0MiwxOC41ODQgMTY2LjMxOSwxOC43MiAxNjYuNDk2LDE4LjgzNyBDMTY3LjI1NCwxOS4zMzYgMTY4LDE5LjQ2NyAxNjguNTQzLDE5LjE5NiBDMTY5LjAzMywxOC45NTMgMTY5LjMyOSwxOC40MDEgMTY5LjM3NywxNy42NDUgQzE2OS40MjcsMTYuODY3IDE2OS40MzQsMTYuMDU0IDE2OS40MDEsMTUuMjI4IEwxNjkuMzk3LDE1LjA2NSBMMTY5LjM5NywxMy43MSBMMTY5LjU3MiwxMy44MSBDMTcwLjgzOSwxNC41NDEgMTk1LjU1OSwyOC44MTQgMTk1LjU1OSwyOC44MTQgTDE5NS42MTgsMjguODQ3IEwxOTUuNjE4LDgyLjkxNSBDMTk1LjYxOCw4My40ODQgMTk1LjQyLDgzLjkxMSAxOTUuMDU5LDg0LjExOSBDMTk0LjkwOCw4NC4yMDYgMTk0LjczNyw4NC4yNSAxOTQuNTUzLDg0LjI1IiBpZD0iRmlsbC0xMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDUuNjg1LDU2LjE2MSBMMTY5LjgsNzAuMDgzIEwxNDMuODIyLDg1LjA4MSBMMTQyLjM2LDg0Ljc3NCBDMTM1LjgyNiw4Mi42MDQgMTI4LjczMiw4MS4wNDYgMTIxLjM0MSw4MC4xNTggQzExNi45NzYsNzkuNjM0IDExMi42NzgsODEuMjU0IDExMS43NDMsODMuNzc4IEMxMTEuNTA2LDg0LjQxNCAxMTEuNTAzLDg1LjA3MSAxMTEuNzMyLDg1LjcwNiBDMTEzLjI3LDg5Ljk3MyAxMTUuOTY4LDk0LjA2OSAxMTkuNzI3LDk3Ljg0MSBMMTIwLjI1OSw5OC42ODYgQzEyMC4yNiw5OC42ODUgOTQuMjgyLDExMy42ODMgOTQuMjgyLDExMy42ODMgTDcwLjE2Nyw5OS43NjEgTDE0NS42ODUsNTYuMTYxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NC4yODIsMTEzLjgxOCBMOTQuMjIzLDExMy43ODUgTDY5LjkzMyw5OS43NjEgTDcwLjEwOCw5OS42NiBMMTQ1LjY4NSw1Ni4wMjYgTDE0NS43NDMsNTYuMDU5IEwxNzAuMDMzLDcwLjA4MyBMMTQzLjg0Miw4NS4yMDUgTDE0My43OTcsODUuMTk1IEMxNDMuNzcyLDg1LjE5IDE0Mi4zMzYsODQuODg4IDE0Mi4zMzYsODQuODg4IEMxMzUuNzg3LDgyLjcxNCAxMjguNzIzLDgxLjE2MyAxMjEuMzI3LDgwLjI3NCBDMTIwLjc4OCw4MC4yMDkgMTIwLjIzNiw4MC4xNzcgMTE5LjY4OSw4MC4xNzcgQzExNS45MzEsODAuMTc3IDExMi42MzUsODEuNzA4IDExMS44NTIsODMuODE5IEMxMTEuNjI0LDg0LjQzMiAxMTEuNjIxLDg1LjA1MyAxMTEuODQyLDg1LjY2NyBDMTEzLjM3Nyw4OS45MjUgMTE2LjA1OCw5My45OTMgMTE5LjgxLDk3Ljc1OCBMMTE5LjgyNiw5Ny43NzkgTDEyMC4zNTIsOTguNjE0IEMxMjAuMzU0LDk4LjYxNyAxMjAuMzU2LDk4LjYyIDEyMC4zNTgsOTguNjI0IEwxMjAuNDIyLDk4LjcyNiBMMTIwLjMxNyw5OC43ODcgQzEyMC4yNjQsOTguODE4IDk0LjU5OSwxMTMuNjM1IDk0LjM0LDExMy43ODUgTDk0LjI4MiwxMTMuODE4IEw5NC4yODIsMTEzLjgxOCBaIE03MC40MDEsOTkuNzYxIEw5NC4yODIsMTEzLjU0OSBMMTE5LjA4NCw5OS4yMjkgQzExOS42Myw5OC45MTQgMTE5LjkzLDk4Ljc0IDEyMC4xMDEsOTguNjU0IEwxMTkuNjM1LDk3LjkxNCBDMTE1Ljg2NCw5NC4xMjcgMTEzLjE2OCw5MC4wMzMgMTExLjYyMiw4NS43NDYgQzExMS4zODIsODUuMDc5IDExMS4zODYsODQuNDA0IDExMS42MzMsODMuNzM4IEMxMTIuNDQ4LDgxLjUzOSAxMTUuODM2LDc5Ljk0MyAxMTkuNjg5LDc5Ljk0MyBDMTIwLjI0Niw3OS45NDMgMTIwLjgwNiw3OS45NzYgMTIxLjM1NSw4MC4wNDIgQzEyOC43NjcsODAuOTMzIDEzNS44NDYsODIuNDg3IDE0Mi4zOTYsODQuNjYzIEMxNDMuMjMyLDg0LjgzOCAxNDMuNjExLDg0LjkxNyAxNDMuNzg2LDg0Ljk2NyBMMTY5LjU2Niw3MC4wODMgTDE0NS42ODUsNTYuMjk1IEw3MC40MDEsOTkuNzYxIEw3MC40MDEsOTkuNzYxIFoiIGlkPSJGaWxsLTEyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2Ny4yMywxOC45NzkgTDE2Ny4yMyw2OS44NSBMMTM5LjkwOSw4NS42MjMgTDEzMy40NDgsNzEuNDU2IEMxMzIuNTM4LDY5LjQ2IDEzMC4wMiw2OS43MTggMTI3LjgyNCw3Mi4wMyBDMTI2Ljc2OSw3My4xNCAxMjUuOTMxLDc0LjU4NSAxMjUuNDk0LDc2LjA0OCBMMTE5LjAzNCw5Ny42NzYgTDkxLjcxMiwxMTMuNDUgTDkxLjcxMiw2Mi41NzkgTDE2Ny4yMywxOC45NzkiIGlkPSJGaWxsLTEzIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkxLjcxMiwxMTMuNTY3IEM5MS42OTIsMTEzLjU2NyA5MS42NzIsMTEzLjU2MSA5MS42NTMsMTEzLjU1MSBDOTEuNjE4LDExMy41MyA5MS41OTUsMTEzLjQ5MiA5MS41OTUsMTEzLjQ1IEw5MS41OTUsNjIuNTc5IEM5MS41OTUsNjIuNTM3IDkxLjYxOCw2Mi40OTkgOTEuNjUzLDYyLjQ3OCBMMTY3LjE3MiwxOC44NzggQzE2Ny4yMDgsMTguODU3IDE2Ny4yNTIsMTguODU3IDE2Ny4yODgsMTguODc4IEMxNjcuMzI0LDE4Ljg5OSAxNjcuMzQ3LDE4LjkzNyAxNjcuMzQ3LDE4Ljk3OSBMMTY3LjM0Nyw2OS44NSBDMTY3LjM0Nyw2OS44OTEgMTY3LjMyNCw2OS45MyAxNjcuMjg4LDY5Ljk1IEwxMzkuOTY3LDg1LjcyNSBDMTM5LjkzOSw4NS43NDEgMTM5LjkwNSw4NS43NDUgMTM5Ljg3Myw4NS43MzUgQzEzOS44NDIsODUuNzI1IDEzOS44MTYsODUuNzAyIDEzOS44MDIsODUuNjcyIEwxMzMuMzQyLDcxLjUwNCBDMTMyLjk2Nyw3MC42ODIgMTMyLjI4LDcwLjIyOSAxMzEuNDA4LDcwLjIyOSBDMTMwLjMxOSw3MC4yMjkgMTI5LjA0NCw3MC45MTUgMTI3LjkwOCw3Mi4xMSBDMTI2Ljg3NCw3My4yIDEyNi4wMzQsNzQuNjQ3IDEyNS42MDYsNzYuMDgyIEwxMTkuMTQ2LDk3LjcwOSBDMTE5LjEzNyw5Ny43MzggMTE5LjExOCw5Ny43NjIgMTE5LjA5Miw5Ny43NzcgTDkxLjc3LDExMy41NTEgQzkxLjc1MiwxMTMuNTYxIDkxLjczMiwxMTMuNTY3IDkxLjcxMiwxMTMuNTY3IEw5MS43MTIsMTEzLjU2NyBaIE05MS44MjksNjIuNjQ3IEw5MS44MjksMTEzLjI0OCBMMTE4LjkzNSw5Ny41OTggTDEyNS4zODIsNzYuMDE1IEMxMjUuODI3LDc0LjUyNSAxMjYuNjY0LDczLjA4MSAxMjcuNzM5LDcxLjk1IEMxMjguOTE5LDcwLjcwOCAxMzAuMjU2LDY5Ljk5NiAxMzEuNDA4LDY5Ljk5NiBDMTMyLjM3Nyw2OS45OTYgMTMzLjEzOSw3MC40OTcgMTMzLjU1NCw3MS40MDcgTDEzOS45NjEsODUuNDU4IEwxNjcuMTEzLDY5Ljc4MiBMMTY3LjExMywxOS4xODEgTDkxLjgyOSw2Mi42NDcgTDkxLjgyOSw2Mi42NDcgWiIgaWQ9IkZpbGwtMTQiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTY4LjU0MywxOS4yMTMgTDE2OC41NDMsNzAuMDgzIEwxNDEuMjIxLDg1Ljg1NyBMMTM0Ljc2MSw3MS42ODkgQzEzMy44NTEsNjkuNjk0IDEzMS4zMzMsNjkuOTUxIDEyOS4xMzcsNzIuMjYzIEMxMjguMDgyLDczLjM3NCAxMjcuMjQ0LDc0LjgxOSAxMjYuODA3LDc2LjI4MiBMMTIwLjM0Niw5Ny45MDkgTDkzLjAyNSwxMTMuNjgzIEw5My4wMjUsNjIuODEzIEwxNjguNTQzLDE5LjIxMyIgaWQ9IkZpbGwtMTUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTMuMDI1LDExMy44IEM5My4wMDUsMTEzLjggOTIuOTg0LDExMy43OTUgOTIuOTY2LDExMy43ODUgQzkyLjkzMSwxMTMuNzY0IDkyLjkwOCwxMTMuNzI1IDkyLjkwOCwxMTMuNjg0IEw5Mi45MDgsNjIuODEzIEM5Mi45MDgsNjIuNzcxIDkyLjkzMSw2Mi43MzMgOTIuOTY2LDYyLjcxMiBMMTY4LjQ4NCwxOS4xMTIgQzE2OC41MiwxOS4wOSAxNjguNTY1LDE5LjA5IDE2OC42MDEsMTkuMTEyIEMxNjguNjM3LDE5LjEzMiAxNjguNjYsMTkuMTcxIDE2OC42NiwxOS4yMTIgTDE2OC42Niw3MC4wODMgQzE2OC42Niw3MC4xMjUgMTY4LjYzNyw3MC4xNjQgMTY4LjYwMSw3MC4xODQgTDE0MS4yOCw4NS45NTggQzE0MS4yNTEsODUuOTc1IDE0MS4yMTcsODUuOTc5IDE0MS4xODYsODUuOTY4IEMxNDEuMTU0LDg1Ljk1OCAxNDEuMTI5LDg1LjkzNiAxNDEuMTE1LDg1LjkwNiBMMTM0LjY1NSw3MS43MzggQzEzNC4yOCw3MC45MTUgMTMzLjU5Myw3MC40NjMgMTMyLjcyLDcwLjQ2MyBDMTMxLjYzMiw3MC40NjMgMTMwLjM1Nyw3MS4xNDggMTI5LjIyMSw3Mi4zNDQgQzEyOC4xODYsNzMuNDMzIDEyNy4zNDcsNzQuODgxIDEyNi45MTksNzYuMzE1IEwxMjAuNDU4LDk3Ljk0MyBDMTIwLjQ1LDk3Ljk3MiAxMjAuNDMxLDk3Ljk5NiAxMjAuNDA1LDk4LjAxIEw5My4wODMsMTEzLjc4NSBDOTMuMDY1LDExMy43OTUgOTMuMDQ1LDExMy44IDkzLjAyNSwxMTMuOCBMOTMuMDI1LDExMy44IFogTTkzLjE0Miw2Mi44ODEgTDkzLjE0MiwxMTMuNDgxIEwxMjAuMjQ4LDk3LjgzMiBMMTI2LjY5NSw3Ni4yNDggQzEyNy4xNCw3NC43NTggMTI3Ljk3Nyw3My4zMTUgMTI5LjA1Miw3Mi4xODMgQzEzMC4yMzEsNzAuOTQyIDEzMS41NjgsNzAuMjI5IDEzMi43Miw3MC4yMjkgQzEzMy42ODksNzAuMjI5IDEzNC40NTIsNzAuNzMxIDEzNC44NjcsNzEuNjQxIEwxNDEuMjc0LDg1LjY5MiBMMTY4LjQyNiw3MC4wMTYgTDE2OC40MjYsMTkuNDE1IEw5My4xNDIsNjIuODgxIEw5My4xNDIsNjIuODgxIFoiIGlkPSJGaWxsLTE2IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS44LDcwLjA4MyBMMTQyLjQ3OCw4NS44NTcgTDEzNi4wMTgsNzEuNjg5IEMxMzUuMTA4LDY5LjY5NCAxMzIuNTksNjkuOTUxIDEzMC4zOTMsNzIuMjYzIEMxMjkuMzM5LDczLjM3NCAxMjguNSw3NC44MTkgMTI4LjA2NCw3Ni4yODIgTDEyMS42MDMsOTcuOTA5IEw5NC4yODIsMTEzLjY4MyBMOTQuMjgyLDYyLjgxMyBMMTY5LjgsMTkuMjEzIEwxNjkuOCw3MC4wODMgWiIgaWQ9IkZpbGwtMTciIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTQuMjgyLDExMy45MTcgQzk0LjI0MSwxMTMuOTE3IDk0LjIwMSwxMTMuOTA3IDk0LjE2NSwxMTMuODg2IEM5NC4wOTMsMTEzLjg0NSA5NC4wNDgsMTEzLjc2NyA5NC4wNDgsMTEzLjY4NCBMOTQuMDQ4LDYyLjgxMyBDOTQuMDQ4LDYyLjczIDk0LjA5Myw2Mi42NTIgOTQuMTY1LDYyLjYxMSBMMTY5LjY4MywxOS4wMSBDMTY5Ljc1NSwxOC45NjkgMTY5Ljg0NCwxOC45NjkgMTY5LjkxNywxOS4wMSBDMTY5Ljk4OSwxOS4wNTIgMTcwLjAzMywxOS4xMjkgMTcwLjAzMywxOS4yMTIgTDE3MC4wMzMsNzAuMDgzIEMxNzAuMDMzLDcwLjE2NiAxNjkuOTg5LDcwLjI0NCAxNjkuOTE3LDcwLjI4NSBMMTQyLjU5NSw4Ni4wNiBDMTQyLjUzOCw4Ni4wOTIgMTQyLjQ2OSw4Ni4xIDE0Mi40MDcsODYuMDggQzE0Mi4zNDQsODYuMDYgMTQyLjI5Myw4Ni4wMTQgMTQyLjI2Niw4NS45NTQgTDEzNS44MDUsNzEuNzg2IEMxMzUuNDQ1LDcwLjk5NyAxMzQuODEzLDcwLjU4IDEzMy45NzcsNzAuNTggQzEzMi45MjEsNzAuNTggMTMxLjY3Niw3MS4yNTIgMTMwLjU2Miw3Mi40MjQgQzEyOS41NCw3My41MDEgMTI4LjcxMSw3NC45MzEgMTI4LjI4Nyw3Ni4zNDggTDEyMS44MjcsOTcuOTc2IEMxMjEuODEsOTguMDM0IDEyMS43NzEsOTguMDgyIDEyMS43Miw5OC4xMTIgTDk0LjM5OCwxMTMuODg2IEM5NC4zNjIsMTEzLjkwNyA5NC4zMjIsMTEzLjkxNyA5NC4yODIsMTEzLjkxNyBMOTQuMjgyLDExMy45MTcgWiBNOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDExMy4yNzkgTDEyMS40MDYsOTcuNzU0IEwxMjcuODQsNzYuMjE1IEMxMjguMjksNzQuNzA4IDEyOS4xMzcsNzMuMjQ3IDEzMC4yMjQsNzIuMTAzIEMxMzEuNDI1LDcwLjgzOCAxMzIuNzkzLDcwLjExMiAxMzMuOTc3LDcwLjExMiBDMTM0Ljk5NSw3MC4xMTIgMTM1Ljc5NSw3MC42MzggMTM2LjIzLDcxLjU5MiBMMTQyLjU4NCw4NS41MjYgTDE2OS41NjYsNjkuOTQ4IEwxNjkuNTY2LDE5LjYxNyBMOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDYyLjk0OCBaIiBpZD0iRmlsbC0xOCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDkuODk0LDkyLjk0MyBMMTA5Ljg5NCw5Mi45NDMgQzEwOC4xMiw5Mi45NDMgMTA2LjY1Myw5Mi4yMTggMTA1LjY1LDkwLjgyMyBDMTA1LjU4Myw5MC43MzEgMTA1LjU5Myw5MC42MSAxMDUuNjczLDkwLjUyOSBDMTA1Ljc1Myw5MC40NDggMTA1Ljg4LDkwLjQ0IDEwNS45NzQsOTAuNTA2IEMxMDYuNzU0LDkxLjA1MyAxMDcuNjc5LDkxLjMzMyAxMDguNzI0LDkxLjMzMyBDMTEwLjA0Nyw5MS4zMzMgMTExLjQ3OCw5MC44OTQgMTEyLjk4LDkwLjAyNyBDMTE4LjI5MSw4Ni45NiAxMjIuNjExLDc5LjUwOSAxMjIuNjExLDczLjQxNiBDMTIyLjYxMSw3MS40ODkgMTIyLjE2OSw2OS44NTYgMTIxLjMzMyw2OC42OTIgQzEyMS4yNjYsNjguNiAxMjEuMjc2LDY4LjQ3MyAxMjEuMzU2LDY4LjM5MiBDMTIxLjQzNiw2OC4zMTEgMTIxLjU2Myw2OC4yOTkgMTIxLjY1Niw2OC4zNjUgQzEyMy4zMjcsNjkuNTM3IDEyNC4yNDcsNzEuNzQ2IDEyNC4yNDcsNzQuNTg0IEMxMjQuMjQ3LDgwLjgyNiAxMTkuODIxLDg4LjQ0NyAxMTQuMzgyLDkxLjU4NyBDMTEyLjgwOCw5Mi40OTUgMTExLjI5OCw5Mi45NDMgMTA5Ljg5NCw5Mi45NDMgTDEwOS44OTQsOTIuOTQzIFogTTEwNi45MjUsOTEuNDAxIEMxMDcuNzM4LDkyLjA1MiAxMDguNzQ1LDkyLjI3OCAxMDkuODkzLDkyLjI3OCBMMTA5Ljg5NCw5Mi4yNzggQzExMS4yMTUsOTIuMjc4IDExMi42NDcsOTEuOTUxIDExNC4xNDgsOTEuMDg0IEMxMTkuNDU5LDg4LjAxNyAxMjMuNzgsODAuNjIxIDEyMy43OCw3NC41MjggQzEyMy43OCw3Mi41NDkgMTIzLjMxNyw3MC45MjkgMTIyLjQ1NCw2OS43NjcgQzEyMi44NjUsNzAuODAyIDEyMy4wNzksNzIuMDQyIDEyMy4wNzksNzMuNDAyIEMxMjMuMDc5LDc5LjY0NSAxMTguNjUzLDg3LjI4NSAxMTMuMjE0LDkwLjQyNSBDMTExLjY0LDkxLjMzNCAxMTAuMTMsOTEuNzQyIDEwOC43MjQsOTEuNzQyIEMxMDguMDgzLDkxLjc0MiAxMDcuNDgxLDkxLjU5MyAxMDYuOTI1LDkxLjQwMSBMMTA2LjkyNSw5MS40MDEgWiIgaWQ9IkZpbGwtMTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjA5Nyw5MC4yMyBDMTE4LjQ4MSw4Ny4xMjIgMTIyLjg0NSw3OS41OTQgMTIyLjg0NSw3My40MTYgQzEyMi44NDUsNzEuMzY1IDEyMi4zNjIsNjkuNzI0IDEyMS41MjIsNjguNTU2IEMxMTkuNzM4LDY3LjMwNCAxMTcuMTQ4LDY3LjM2MiAxMTQuMjY1LDY5LjAyNiBDMTA4Ljg4MSw3Mi4xMzQgMTA0LjUxNyw3OS42NjIgMTA0LjUxNyw4NS44NCBDMTA0LjUxNyw4Ny44OTEgMTA1LDg5LjUzMiAxMDUuODQsOTAuNyBDMTA3LjYyNCw5MS45NTIgMTEwLjIxNCw5MS44OTQgMTEzLjA5Nyw5MC4yMyIgaWQ9IkZpbGwtMjAiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTA4LjcyNCw5MS42MTQgTDEwOC43MjQsOTEuNjE0IEMxMDcuNTgyLDkxLjYxNCAxMDYuNTY2LDkxLjQwMSAxMDUuNzA1LDkwLjc5NyBDMTA1LjY4NCw5MC43ODMgMTA1LjY2NSw5MC44MTEgMTA1LjY1LDkwLjc5IEMxMDQuNzU2LDg5LjU0NiAxMDQuMjgzLDg3Ljg0MiAxMDQuMjgzLDg1LjgxNyBDMTA0LjI4Myw3OS41NzUgMTA4LjcwOSw3MS45NTMgMTE0LjE0OCw2OC44MTIgQzExNS43MjIsNjcuOTA0IDExNy4yMzIsNjcuNDQ5IDExOC42MzgsNjcuNDQ5IEMxMTkuNzgsNjcuNDQ5IDEyMC43OTYsNjcuNzU4IDEyMS42NTYsNjguMzYyIEMxMjEuNjc4LDY4LjM3NyAxMjEuNjk3LDY4LjM5NyAxMjEuNzEyLDY4LjQxOCBDMTIyLjYwNiw2OS42NjIgMTIzLjA3OSw3MS4zOSAxMjMuMDc5LDczLjQxNSBDMTIzLjA3OSw3OS42NTggMTE4LjY1Myw4Ny4xOTggMTEzLjIxNCw5MC4zMzggQzExMS42NCw5MS4yNDcgMTEwLjEzLDkxLjYxNCAxMDguNzI0LDkxLjYxNCBMMTA4LjcyNCw5MS42MTQgWiBNMTA2LjAwNiw5MC41MDUgQzEwNi43OCw5MS4wMzcgMTA3LjY5NCw5MS4yODEgMTA4LjcyNCw5MS4yODEgQzExMC4wNDcsOTEuMjgxIDExMS40NzgsOTAuODY4IDExMi45OCw5MC4wMDEgQzExOC4yOTEsODYuOTM1IDEyMi42MTEsNzkuNDk2IDEyMi42MTEsNzMuNDAzIEMxMjIuNjExLDcxLjQ5NCAxMjIuMTc3LDY5Ljg4IDEyMS4zNTYsNjguNzE4IEMxMjAuNTgyLDY4LjE4NSAxMTkuNjY4LDY3LjkxOSAxMTguNjM4LDY3LjkxOSBDMTE3LjMxNSw2Ny45MTkgMTE1Ljg4Myw2OC4zNiAxMTQuMzgyLDY5LjIyNyBDMTA5LjA3MSw3Mi4yOTMgMTA0Ljc1MSw3OS43MzMgMTA0Ljc1MSw4NS44MjYgQzEwNC43NTEsODcuNzM1IDEwNS4xODUsODkuMzQzIDEwNi4wMDYsOTAuNTA1IEwxMDYuMDA2LDkwLjUwNSBaIiBpZD0iRmlsbC0yMSIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDkuMzE4LDcuMjYyIEwxMzkuMzM0LDE2LjE0IEwxNTUuMjI3LDI3LjE3MSBMMTYwLjgxNiwyMS4wNTkgTDE0OS4zMTgsNy4yNjIiIGlkPSJGaWxsLTIyIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS42NzYsMTMuODQgTDE1OS45MjgsMTkuNDY3IEMxNTYuMjg2LDIxLjU3IDE1MC40LDIxLjU4IDE0Ni43ODEsMTkuNDkxIEMxNDMuMTYxLDE3LjQwMiAxNDMuMTgsMTQuMDAzIDE0Ni44MjIsMTEuOSBMMTU2LjMxNyw2LjI5MiBMMTQ5LjU4OCwyLjQwNyBMNjcuNzUyLDQ5LjQ3OCBMMTEzLjY3NSw3NS45OTIgTDExNi43NTYsNzQuMjEzIEMxMTcuMzg3LDczLjg0OCAxMTcuNjI1LDczLjMxNSAxMTcuMzc0LDcyLjgyMyBDMTE1LjAxNyw2OC4xOTEgMTE0Ljc4MSw2My4yNzcgMTE2LjY5MSw1OC41NjEgQzEyMi4zMjksNDQuNjQxIDE0MS4yLDMzLjc0NiAxNjUuMzA5LDMwLjQ5MSBDMTczLjQ3OCwyOS4zODggMTgxLjk4OSwyOS41MjQgMTkwLjAxMywzMC44ODUgQzE5MC44NjUsMzEuMDMgMTkxLjc4OSwzMC44OTMgMTkyLjQyLDMwLjUyOCBMMTk1LjUwMSwyOC43NSBMMTY5LjY3NiwxMy44NCIgaWQ9IkZpbGwtMjMiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3Ni40NTkgQzExMy41OTQsNzYuNDU5IDExMy41MTQsNzYuNDM4IDExMy40NDIsNzYuMzk3IEw2Ny41MTgsNDkuODgyIEM2Ny4zNzQsNDkuNzk5IDY3LjI4NCw0OS42NDUgNjcuMjg1LDQ5LjQ3OCBDNjcuMjg1LDQ5LjMxMSA2Ny4zNzQsNDkuMTU3IDY3LjUxOSw0OS4wNzMgTDE0OS4zNTUsMi4wMDIgQzE0OS40OTksMS45MTkgMTQ5LjY3NywxLjkxOSAxNDkuODIxLDIuMDAyIEwxNTYuNTUsNS44ODcgQzE1Ni43NzQsNi4wMTcgMTU2Ljg1LDYuMzAyIDE1Ni43MjIsNi41MjYgQzE1Ni41OTIsNi43NDkgMTU2LjMwNyw2LjgyNiAxNTYuMDgzLDYuNjk2IEwxNDkuNTg3LDIuOTQ2IEw2OC42ODcsNDkuNDc5IEwxMTMuNjc1LDc1LjQ1MiBMMTE2LjUyMyw3My44MDggQzExNi43MTUsNzMuNjk3IDExNy4xNDMsNzMuMzk5IDExNi45NTgsNzMuMDM1IEMxMTQuNTQyLDY4LjI4NyAxMTQuMyw2My4yMjEgMTE2LjI1OCw1OC4zODUgQzExOS4wNjQsNTEuNDU4IDEyNS4xNDMsNDUuMTQzIDEzMy44NCw0MC4xMjIgQzE0Mi40OTcsMzUuMTI0IDE1My4zNTgsMzEuNjMzIDE2NS4yNDcsMzAuMDI4IEMxNzMuNDQ1LDI4LjkyMSAxODIuMDM3LDI5LjA1OCAxOTAuMDkxLDMwLjQyNSBDMTkwLjgzLDMwLjU1IDE5MS42NTIsMzAuNDMyIDE5Mi4xODYsMzAuMTI0IEwxOTQuNTY3LDI4Ljc1IEwxNjkuNDQyLDE0LjI0NCBDMTY5LjIxOSwxNC4xMTUgMTY5LjE0MiwxMy44MjkgMTY5LjI3MSwxMy42MDYgQzE2OS40LDEzLjM4MiAxNjkuNjg1LDEzLjMwNiAxNjkuOTA5LDEzLjQzNSBMMTk1LjczNCwyOC4zNDUgQzE5NS44NzksMjguNDI4IDE5NS45NjgsMjguNTgzIDE5NS45NjgsMjguNzUgQzE5NS45NjgsMjguOTE2IDE5NS44NzksMjkuMDcxIDE5NS43MzQsMjkuMTU0IEwxOTIuNjUzLDMwLjkzMyBDMTkxLjkzMiwzMS4zNSAxOTAuODksMzEuNTA4IDE4OS45MzUsMzEuMzQ2IEMxODEuOTcyLDI5Ljk5NSAxNzMuNDc4LDI5Ljg2IDE2NS4zNzIsMzAuOTU0IEMxNTMuNjAyLDMyLjU0MyAxNDIuODYsMzUuOTkzIDEzNC4zMDcsNDAuOTMxIEMxMjUuNzkzLDQ1Ljg0NyAxMTkuODUxLDUyLjAwNCAxMTcuMTI0LDU4LjczNiBDMTE1LjI3LDYzLjMxNCAxMTUuNTAxLDY4LjExMiAxMTcuNzksNzIuNjExIEMxMTguMTYsNzMuMzM2IDExNy44NDUsNzQuMTI0IDExNi45OSw3NC42MTcgTDExMy45MDksNzYuMzk3IEMxMTMuODM2LDc2LjQzOCAxMTMuNzU2LDc2LjQ1OSAxMTMuNjc1LDc2LjQ1OSIgaWQ9IkZpbGwtMjQiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUzLjMxNiwyMS4yNzkgQzE1MC45MDMsMjEuMjc5IDE0OC40OTUsMjAuNzUxIDE0Ni42NjQsMTkuNjkzIEMxNDQuODQ2LDE4LjY0NCAxNDMuODQ0LDE3LjIzMiAxNDMuODQ0LDE1LjcxOCBDMTQzLjg0NCwxNC4xOTEgMTQ0Ljg2LDEyLjc2MyAxNDYuNzA1LDExLjY5OCBMMTU2LjE5OCw2LjA5MSBDMTU2LjMwOSw2LjAyNSAxNTYuNDUyLDYuMDYyIDE1Ni41MTgsNi4xNzMgQzE1Ni41ODMsNi4yODQgMTU2LjU0Nyw2LjQyNyAxNTYuNDM2LDYuNDkzIEwxNDYuOTQsMTIuMTAyIEMxNDUuMjQ0LDEzLjA4MSAxNDQuMzEyLDE0LjM2NSAxNDQuMzEyLDE1LjcxOCBDMTQ0LjMxMiwxNy4wNTggMTQ1LjIzLDE4LjMyNiAxNDYuODk3LDE5LjI4OSBDMTUwLjQ0NiwyMS4zMzggMTU2LjI0LDIxLjMyNyAxNTkuODExLDE5LjI2NSBMMTY5LjU1OSwxMy42MzcgQzE2OS42NywxMy41NzMgMTY5LjgxMywxMy42MTEgMTY5Ljg3OCwxMy43MjMgQzE2OS45NDMsMTMuODM0IDE2OS45MDQsMTMuOTc3IDE2OS43OTMsMTQuMDQyIEwxNjAuMDQ1LDE5LjY3IEMxNTguMTg3LDIwLjc0MiAxNTUuNzQ5LDIxLjI3OSAxNTMuMzE2LDIxLjI3OSIgaWQ9IkZpbGwtMjUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3NS45OTIgTDY3Ljc2Miw0OS40ODQiIGlkPSJGaWxsLTI2IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMy42NzUsNzYuMzQyIEMxMTMuNjE1LDc2LjM0MiAxMTMuNTU1LDc2LjMyNyAxMTMuNSw3Ni4yOTUgTDY3LjU4Nyw0OS43ODcgQzY3LjQxOSw0OS42OSA2Ny4zNjIsNDkuNDc2IDY3LjQ1OSw0OS4zMDkgQzY3LjU1Niw0OS4xNDEgNjcuNzcsNDkuMDgzIDY3LjkzNyw0OS4xOCBMMTEzLjg1LDc1LjY4OCBDMTE0LjAxOCw3NS43ODUgMTE0LjA3NSw3NiAxMTMuOTc4LDc2LjE2NyBDMTEzLjkxNCw3Ni4yNzkgMTEzLjc5Niw3Ni4zNDIgMTEzLjY3NSw3Ni4zNDIiIGlkPSJGaWxsLTI3IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY3Ljc2Miw0OS40ODQgTDY3Ljc2MiwxMDMuNDg1IEM2Ny43NjIsMTA0LjU3NSA2OC41MzIsMTA1LjkwMyA2OS40ODIsMTA2LjQ1MiBMMTExLjk1NSwxMzAuOTczIEMxMTIuOTA1LDEzMS41MjIgMTEzLjY3NSwxMzEuMDgzIDExMy42NzUsMTI5Ljk5MyBMMTEzLjY3NSw3NS45OTIiIGlkPSJGaWxsLTI4IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMi43MjcsMTMxLjU2MSBDMTEyLjQzLDEzMS41NjEgMTEyLjEwNywxMzEuNDY2IDExMS43OCwxMzEuMjc2IEw2OS4zMDcsMTA2Ljc1NSBDNjguMjQ0LDEwNi4xNDIgNjcuNDEyLDEwNC43MDUgNjcuNDEyLDEwMy40ODUgTDY3LjQxMiw0OS40ODQgQzY3LjQxMiw0OS4yOSA2Ny41NjksNDkuMTM0IDY3Ljc2Miw0OS4xMzQgQzY3Ljk1Niw0OS4xMzQgNjguMTEzLDQ5LjI5IDY4LjExMyw0OS40ODQgTDY4LjExMywxMDMuNDg1IEM2OC4xMTMsMTA0LjQ0NSA2OC44MiwxMDUuNjY1IDY5LjY1NywxMDYuMTQ4IEwxMTIuMTMsMTMwLjY3IEMxMTIuNDc0LDEzMC44NjggMTEyLjc5MSwxMzAuOTEzIDExMywxMzAuNzkyIEMxMTMuMjA2LDEzMC42NzMgMTEzLjMyNSwxMzAuMzgxIDExMy4zMjUsMTI5Ljk5MyBMMTEzLjMyNSw3NS45OTIgQzExMy4zMjUsNzUuNzk4IDExMy40ODIsNzUuNjQxIDExMy42NzUsNzUuNjQxIEMxMTMuODY5LDc1LjY0MSAxMTQuMDI1LDc1Ljc5OCAxMTQuMDI1LDc1Ljk5MiBMMTE0LjAyNSwxMjkuOTkzIEMxMTQuMDI1LDEzMC42NDggMTEzLjc4NiwxMzEuMTQ3IDExMy4zNSwxMzEuMzk5IEMxMTMuMTYyLDEzMS41MDcgMTEyLjk1MiwxMzEuNTYxIDExMi43MjcsMTMxLjU2MSIgaWQ9IkZpbGwtMjkiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEyLjg2LDQwLjUxMiBDMTEyLjg2LDQwLjUxMiAxMTIuODYsNDAuNTEyIDExMi44NTksNDAuNTEyIEMxMTAuNTQxLDQwLjUxMiAxMDguMzYsMzkuOTkgMTA2LjcxNywzOS4wNDEgQzEwNS4wMTIsMzguMDU3IDEwNC4wNzQsMzYuNzI2IDEwNC4wNzQsMzUuMjkyIEMxMDQuMDc0LDMzLjg0NyAxMDUuMDI2LDMyLjUwMSAxMDYuNzU0LDMxLjUwNCBMMTE4Ljc5NSwyNC41NTEgQzEyMC40NjMsMjMuNTg5IDEyMi42NjksMjMuMDU4IDEyNS4wMDcsMjMuMDU4IEMxMjcuMzI1LDIzLjA1OCAxMjkuNTA2LDIzLjU4MSAxMzEuMTUsMjQuNTMgQzEzMi44NTQsMjUuNTE0IDEzMy43OTMsMjYuODQ1IDEzMy43OTMsMjguMjc4IEMxMzMuNzkzLDI5LjcyNCAxMzIuODQxLDMxLjA2OSAxMzEuMTEzLDMyLjA2NyBMMTE5LjA3MSwzOS4wMTkgQzExNy40MDMsMzkuOTgyIDExNS4xOTcsNDAuNTEyIDExMi44Niw0MC41MTIgTDExMi44Niw0MC41MTIgWiBNMTI1LjAwNywyMy43NTkgQzEyMi43OSwyMy43NTkgMTIwLjcwOSwyNC4yNTYgMTE5LjE0NiwyNS4xNTggTDEwNy4xMDQsMzIuMTEgQzEwNS42MDIsMzIuOTc4IDEwNC43NzQsMzQuMTA4IDEwNC43NzQsMzUuMjkyIEMxMDQuNzc0LDM2LjQ2NSAxMDUuNTg5LDM3LjU4MSAxMDcuMDY3LDM4LjQzNCBDMTA4LjYwNSwzOS4zMjMgMTEwLjY2MywzOS44MTIgMTEyLjg1OSwzOS44MTIgTDExMi44NiwzOS44MTIgQzExNS4wNzYsMzkuODEyIDExNy4xNTgsMzkuMzE1IDExOC43MjEsMzguNDEzIEwxMzAuNzYyLDMxLjQ2IEMxMzIuMjY0LDMwLjU5MyAxMzMuMDkyLDI5LjQ2MyAxMzMuMDkyLDI4LjI3OCBDMTMzLjA5MiwyNy4xMDYgMTMyLjI3OCwyNS45OSAxMzAuOCwyNS4xMzYgQzEyOS4yNjEsMjQuMjQ4IDEyNy4yMDQsMjMuNzU5IDEyNS4wMDcsMjMuNzU5IEwxMjUuMDA3LDIzLjc1OSBaIiBpZD0iRmlsbC0zMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjUuNjMsMTYuMjE5IEwxNTkuODk2LDE5LjUzIEMxNTYuNzI5LDIxLjM1OCAxNTEuNjEsMjEuMzY3IDE0OC40NjMsMTkuNTUgQzE0NS4zMTYsMTcuNzMzIDE0NS4zMzIsMTQuNzc4IDE0OC40OTksMTIuOTQ5IEwxNTQuMjMzLDkuNjM5IEwxNjUuNjMsMTYuMjE5IiBpZD0iRmlsbC0zMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTQuMjMzLDEwLjQ0OCBMMTY0LjIyOCwxNi4yMTkgTDE1OS41NDYsMTguOTIzIEMxNTguMTEyLDE5Ljc1IDE1Ni4xOTQsMjAuMjA2IDE1NC4xNDcsMjAuMjA2IEMxNTIuMTE4LDIwLjIwNiAxNTAuMjI0LDE5Ljc1NyAxNDguODE0LDE4Ljk0MyBDMTQ3LjUyNCwxOC4xOTkgMTQ2LjgxNCwxNy4yNDkgMTQ2LjgxNCwxNi4yNjkgQzE0Ni44MTQsMTUuMjc4IDE0Ny41MzcsMTQuMzE0IDE0OC44NSwxMy41NTYgTDE1NC4yMzMsMTAuNDQ4IE0xNTQuMjMzLDkuNjM5IEwxNDguNDk5LDEyLjk0OSBDMTQ1LjMzMiwxNC43NzggMTQ1LjMxNiwxNy43MzMgMTQ4LjQ2MywxOS41NSBDMTUwLjAzMSwyMC40NTUgMTUyLjA4NiwyMC45MDcgMTU0LjE0NywyMC45MDcgQzE1Ni4yMjQsMjAuOTA3IDE1OC4zMDYsMjAuNDQ3IDE1OS44OTYsMTkuNTMgTDE2NS42MywxNi4yMTkgTDE1NC4yMzMsOS42MzkiIGlkPSJGaWxsLTMyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NS40NDUsNzIuNjY3IEwxNDUuNDQ1LDcyLjY2NyBDMTQzLjY3Miw3Mi42NjcgMTQyLjIwNCw3MS44MTcgMTQxLjIwMiw3MC40MjIgQzE0MS4xMzUsNzAuMzMgMTQxLjE0NSw3MC4xNDcgMTQxLjIyNSw3MC4wNjYgQzE0MS4zMDUsNjkuOTg1IDE0MS40MzIsNjkuOTQ2IDE0MS41MjUsNzAuMDExIEMxNDIuMzA2LDcwLjU1OSAxNDMuMjMxLDcwLjgyMyAxNDQuMjc2LDcwLjgyMiBDMTQ1LjU5OCw3MC44MjIgMTQ3LjAzLDcwLjM3NiAxNDguNTMyLDY5LjUwOSBDMTUzLjg0Miw2Ni40NDMgMTU4LjE2Myw1OC45ODcgMTU4LjE2Myw1Mi44OTQgQzE1OC4xNjMsNTAuOTY3IDE1Ny43MjEsNDkuMzMyIDE1Ni44ODQsNDguMTY4IEMxNTYuODE4LDQ4LjA3NiAxNTYuODI4LDQ3Ljk0OCAxNTYuOTA4LDQ3Ljg2NyBDMTU2Ljk4OCw0Ny43ODYgMTU3LjExNCw0Ny43NzQgMTU3LjIwOCw0Ny44NCBDMTU4Ljg3OCw0OS4wMTIgMTU5Ljc5OCw1MS4yMiAxNTkuNzk4LDU0LjA1OSBDMTU5Ljc5OCw2MC4zMDEgMTU1LjM3Myw2OC4wNDYgMTQ5LjkzMyw3MS4xODYgQzE0OC4zNiw3Mi4wOTQgMTQ2Ljg1LDcyLjY2NyAxNDUuNDQ1LDcyLjY2NyBMMTQ1LjQ0NSw3Mi42NjcgWiBNMTQyLjQ3Niw3MSBDMTQzLjI5LDcxLjY1MSAxNDQuMjk2LDcyLjAwMiAxNDUuNDQ1LDcyLjAwMiBDMTQ2Ljc2Nyw3Mi4wMDIgMTQ4LjE5OCw3MS41NSAxNDkuNyw3MC42ODIgQzE1NS4wMSw2Ny42MTcgMTU5LjMzMSw2MC4xNTkgMTU5LjMzMSw1NC4wNjUgQzE1OS4zMzEsNTIuMDg1IDE1OC44NjgsNTAuNDM1IDE1OC4wMDYsNDkuMjcyIEMxNTguNDE3LDUwLjMwNyAxNTguNjMsNTEuNTMyIDE1OC42Myw1Mi44OTIgQzE1OC42Myw1OS4xMzQgMTU0LjIwNSw2Ni43NjcgMTQ4Ljc2NSw2OS45MDcgQzE0Ny4xOTIsNzAuODE2IDE0NS42ODEsNzEuMjgzIDE0NC4yNzYsNzEuMjgzIEMxNDMuNjM0LDcxLjI4MyAxNDMuMDMzLDcxLjE5MiAxNDIuNDc2LDcxIEwxNDIuNDc2LDcxIFoiIGlkPSJGaWxsLTMzIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0OC42NDgsNjkuNzA0IEMxNTQuMDMyLDY2LjU5NiAxNTguMzk2LDU5LjA2OCAxNTguMzk2LDUyLjg5MSBDMTU4LjM5Niw1MC44MzkgMTU3LjkxMyw0OS4xOTggMTU3LjA3NCw0OC4wMyBDMTU1LjI4OSw0Ni43NzggMTUyLjY5OSw0Ni44MzYgMTQ5LjgxNiw0OC41MDEgQzE0NC40MzMsNTEuNjA5IDE0MC4wNjgsNTkuMTM3IDE0MC4wNjgsNjUuMzE0IEMxNDAuMDY4LDY3LjM2NSAxNDAuNTUyLDY5LjAwNiAxNDEuMzkxLDcwLjE3NCBDMTQzLjE3Niw3MS40MjcgMTQ1Ljc2NSw3MS4zNjkgMTQ4LjY0OCw2OS43MDQiIGlkPSJGaWxsLTM0IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NC4yNzYsNzEuMjc2IEwxNDQuMjc2LDcxLjI3NiBDMTQzLjEzMyw3MS4yNzYgMTQyLjExOCw3MC45NjkgMTQxLjI1Nyw3MC4zNjUgQzE0MS4yMzYsNzAuMzUxIDE0MS4yMTcsNzAuMzMyIDE0MS4yMDIsNzAuMzExIEMxNDAuMzA3LDY5LjA2NyAxMzkuODM1LDY3LjMzOSAxMzkuODM1LDY1LjMxNCBDMTM5LjgzNSw1OS4wNzMgMTQ0LjI2LDUxLjQzOSAxNDkuNyw0OC4yOTggQzE1MS4yNzMsNDcuMzkgMTUyLjc4NCw0Ni45MjkgMTU0LjE4OSw0Ni45MjkgQzE1NS4zMzIsNDYuOTI5IDE1Ni4zNDcsNDcuMjM2IDE1Ny4yMDgsNDcuODM5IEMxNTcuMjI5LDQ3Ljg1NCAxNTcuMjQ4LDQ3Ljg3MyAxNTcuMjYzLDQ3Ljg5NCBDMTU4LjE1Nyw0OS4xMzggMTU4LjYzLDUwLjg2NSAxNTguNjMsNTIuODkxIEMxNTguNjMsNTkuMTMyIDE1NC4yMDUsNjYuNzY2IDE0OC43NjUsNjkuOTA3IEMxNDcuMTkyLDcwLjgxNSAxNDUuNjgxLDcxLjI3NiAxNDQuMjc2LDcxLjI3NiBMMTQ0LjI3Niw3MS4yNzYgWiBNMTQxLjU1OCw3MC4xMDQgQzE0Mi4zMzEsNzAuNjM3IDE0My4yNDUsNzEuMDA1IDE0NC4yNzYsNzEuMDA1IEMxNDUuNTk4LDcxLjAwNSAxNDcuMDMsNzAuNDY3IDE0OC41MzIsNjkuNiBDMTUzLjg0Miw2Ni41MzQgMTU4LjE2Myw1OS4wMzMgMTU4LjE2Myw1Mi45MzkgQzE1OC4xNjMsNTEuMDMxIDE1Ny43MjksNDkuMzg1IDE1Ni45MDcsNDguMjIzIEMxNTYuMTMzLDQ3LjY5MSAxNTUuMjE5LDQ3LjQwOSAxNTQuMTg5LDQ3LjQwOSBDMTUyLjg2Nyw0Ny40MDkgMTUxLjQzNSw0Ny44NDIgMTQ5LjkzMyw0OC43MDkgQzE0NC42MjMsNTEuNzc1IDE0MC4zMDIsNTkuMjczIDE0MC4zMDIsNjUuMzY2IEMxNDAuMzAyLDY3LjI3NiAxNDAuNzM2LDY4Ljk0MiAxNDEuNTU4LDcwLjEwNCBMMTQxLjU1OCw3MC4xMDQgWiIgaWQ9IkZpbGwtMzUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUwLjcyLDY1LjM2MSBMMTUwLjM1Nyw2NS4wNjYgQzE1MS4xNDcsNjQuMDkyIDE1MS44NjksNjMuMDQgMTUyLjUwNSw2MS45MzggQzE1My4zMTMsNjAuNTM5IDE1My45NzgsNTkuMDY3IDE1NC40ODIsNTcuNTYzIEwxNTQuOTI1LDU3LjcxMiBDMTU0LjQxMiw1OS4yNDUgMTUzLjczMyw2MC43NDUgMTUyLjkxLDYyLjE3MiBDMTUyLjI2Miw2My4yOTUgMTUxLjUyNSw2NC4zNjggMTUwLjcyLDY1LjM2MSIgaWQ9IkZpbGwtMzYiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1LjkxNyw4NC41MTQgTDExNS41NTQsODQuMjIgQzExNi4zNDQsODMuMjQ1IDExNy4wNjYsODIuMTk0IDExNy43MDIsODEuMDkyIEMxMTguNTEsNzkuNjkyIDExOS4xNzUsNzguMjIgMTE5LjY3OCw3Ni43MTcgTDEyMC4xMjEsNzYuODY1IEMxMTkuNjA4LDc4LjM5OCAxMTguOTMsNzkuODk5IDExOC4xMDYsODEuMzI2IEMxMTcuNDU4LDgyLjQ0OCAxMTYuNzIyLDgzLjUyMSAxMTUuOTE3LDg0LjUxNCIgaWQ9IkZpbGwtMzciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE0LDEzMC40NzYgTDExNCwxMzAuMDA4IEwxMTQsNzYuMDUyIEwxMTQsNzUuNTg0IEwxMTQsNzYuMDUyIEwxMTQsMTMwLjAwOCBMMTE0LDEzMC40NzYiIGlkPSJGaWxsLTM4IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyLjAwMDAwMCwgMC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTkuODIyLDM3LjQ3NCBDMTkuODM5LDM3LjMzOSAxOS43NDcsMzcuMTk0IDE5LjU1NSwzNy4wODIgQzE5LjIyOCwzNi44OTQgMTguNzI5LDM2Ljg3MiAxOC40NDYsMzcuMDM3IEwxMi40MzQsNDAuNTA4IEMxMi4zMDMsNDAuNTg0IDEyLjI0LDQwLjY4NiAxMi4yNDMsNDAuNzkzIEMxMi4yNDUsNDAuOTI1IDEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQxLjM3MSBMMTIuMjQ1LDQxLjQxNCBMMTIuMjM4LDQxLjU0MiBDOC4xNDgsNDMuODg3IDUuNjQ3LDQ1LjMyMSA1LjY0Nyw0NS4zMjEgQzUuNjQ2LDQ1LjMyMSAzLjU3LDQ2LjM2NyAyLjg2LDUwLjUxMyBDMi44Niw1MC41MTMgMS45NDgsNTcuNDc0IDEuOTYyLDcwLjI1OCBDMS45NzcsODIuODI4IDIuNTY4LDg3LjMyOCAzLjEyOSw5MS42MDkgQzMuMzQ5LDkzLjI5MyA2LjEzLDkzLjczNCA2LjEzLDkzLjczNCBDNi40NjEsOTMuNzc0IDYuODI4LDkzLjcwNyA3LjIxLDkzLjQ4NiBMODIuNDgzLDQ5LjkzNSBDODQuMjkxLDQ4Ljg2NiA4NS4xNSw0Ni4yMTYgODUuNTM5LDQzLjY1MSBDODYuNzUyLDM1LjY2MSA4Ny4yMTQsMTAuNjczIDg1LjI2NCwzLjc3MyBDODUuMDY4LDMuMDggODQuNzU0LDIuNjkgODQuMzk2LDIuNDkxIEw4Mi4zMSwxLjcwMSBDODEuNTgzLDEuNzI5IDgwLjg5NCwyLjE2OCA4MC43NzYsMi4yMzYgQzgwLjYzNiwyLjMxNyA0MS44MDcsMjQuNTg1IDIwLjAzMiwzNy4wNzIgTDE5LjgyMiwzNy40NzQiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODIuMzExLDEuNzAxIEw4NC4zOTYsMi40OTEgQzg0Ljc1NCwyLjY5IDg1LjA2OCwzLjA4IDg1LjI2NCwzLjc3MyBDODcuMjEzLDEwLjY3MyA4Ni43NTEsMzUuNjYgODUuNTM5LDQzLjY1MSBDODUuMTQ5LDQ2LjIxNiA4NC4yOSw0OC44NjYgODIuNDgzLDQ5LjkzNSBMNy4yMSw5My40ODYgQzYuODk3LDkzLjY2NyA2LjU5NSw5My43NDQgNi4zMTQsOTMuNzQ0IEw2LjEzMSw5My43MzMgQzYuMTMxLDkzLjczNCAzLjM0OSw5My4yOTMgMy4xMjgsOTEuNjA5IEMyLjU2OCw4Ny4zMjcgMS45NzcsODIuODI4IDEuOTYzLDcwLjI1OCBDMS45NDgsNTcuNDc0IDIuODYsNTAuNTEzIDIuODYsNTAuNTEzIEMzLjU3LDQ2LjM2NyA1LjY0Nyw0NS4zMjEgNS42NDcsNDUuMzIxIEM1LjY0Nyw0NS4zMjEgOC4xNDgsNDMuODg3IDEyLjIzOCw0MS41NDIgTDEyLjI0NSw0MS40MTQgTDEyLjI0NSw0MS4zNzEgQzEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQwLjkyNSAxMi4yNDMsNDAuNzkzIEMxMi4yNCw0MC42ODYgMTIuMzAyLDQwLjU4MyAxMi40MzQsNDAuNTA4IEwxOC40NDYsMzcuMDM2IEMxOC41NzQsMzYuOTYyIDE4Ljc0NiwzNi45MjYgMTguOTI3LDM2LjkyNiBDMTkuMTQ1LDM2LjkyNiAxOS4zNzYsMzYuOTc5IDE5LjU1NCwzNy4wODIgQzE5Ljc0NywzNy4xOTQgMTkuODM5LDM3LjM0IDE5LjgyMiwzNy40NzQgTDIwLjAzMywzNy4wNzIgQzQxLjgwNiwyNC41ODUgODAuNjM2LDIuMzE4IDgwLjc3NywyLjIzNiBDODAuODk0LDIuMTY4IDgxLjU4MywxLjcyOSA4Mi4zMTEsMS43MDEgTTgyLjMxMSwwLjcwNCBMODIuMjcyLDAuNzA1IEM4MS42NTQsMC43MjggODAuOTg5LDAuOTQ5IDgwLjI5OCwxLjM2MSBMODAuMjc3LDEuMzczIEM4MC4xMjksMS40NTggNTkuNzY4LDEzLjEzNSAxOS43NTgsMzYuMDc5IEMxOS41LDM1Ljk4MSAxOS4yMTQsMzUuOTI5IDE4LjkyNywzNS45MjkgQzE4LjU2MiwzNS45MjkgMTguMjIzLDM2LjAxMyAxNy45NDcsMzYuMTczIEwxMS45MzUsMzkuNjQ0IEMxMS40OTMsMzkuODk5IDExLjIzNiw0MC4zMzQgMTEuMjQ2LDQwLjgxIEwxMS4yNDcsNDAuOTYgTDUuMTY3LDQ0LjQ0NyBDNC43OTQsNDQuNjQ2IDIuNjI1LDQ1Ljk3OCAxLjg3Nyw1MC4zNDUgTDEuODcxLDUwLjM4NCBDMS44NjIsNTAuNDU0IDAuOTUxLDU3LjU1NyAwLjk2NSw3MC4yNTkgQzAuOTc5LDgyLjg3OSAxLjU2OCw4Ny4zNzUgMi4xMzcsOTEuNzI0IEwyLjEzOSw5MS43MzkgQzIuNDQ3LDk0LjA5NCA1LjYxNCw5NC42NjIgNS45NzUsOTQuNzE5IEw2LjAwOSw5NC43MjMgQzYuMTEsOTQuNzM2IDYuMjEzLDk0Ljc0MiA2LjMxNCw5NC43NDIgQzYuNzksOTQuNzQyIDcuMjYsOTQuNjEgNy43MSw5NC4zNSBMODIuOTgzLDUwLjc5OCBDODQuNzk0LDQ5LjcyNyA4NS45ODIsNDcuMzc1IDg2LjUyNSw0My44MDEgQzg3LjcxMSwzNS45ODcgODguMjU5LDEwLjcwNSA4Ni4yMjQsMy41MDIgQzg1Ljk3MSwyLjYwOSA4NS41MiwxLjk3NSA4NC44ODEsMS42MiBMODQuNzQ5LDEuNTU4IEw4Mi42NjQsMC43NjkgQzgyLjU1MSwwLjcyNSA4Mi40MzEsMC43MDQgODIuMzExLDAuNzA0IiBpZD0iRmlsbC0yIiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY2LjI2NywxMS41NjUgTDY3Ljc2MiwxMS45OTkgTDExLjQyMyw0NC4zMjUiIGlkPSJGaWxsLTMiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMjAyLDkwLjU0NSBDMTIuMDI5LDkwLjU0NSAxMS44NjIsOTAuNDU1IDExLjc2OSw5MC4yOTUgQzExLjYzMiw5MC4wNTcgMTEuNzEzLDg5Ljc1MiAxMS45NTIsODkuNjE0IEwzMC4zODksNzguOTY5IEMzMC42MjgsNzguODMxIDMwLjkzMyw3OC45MTMgMzEuMDcxLDc5LjE1MiBDMzEuMjA4LDc5LjM5IDMxLjEyNyw3OS42OTYgMzAuODg4LDc5LjgzMyBMMTIuNDUxLDkwLjQ3OCBMMTIuMjAyLDkwLjU0NSIgaWQ9IkZpbGwtNCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy43NjQsNDIuNjU0IEwxMy42NTYsNDIuNTkyIEwxMy43MDIsNDIuNDIxIEwxOC44MzcsMzkuNDU3IEwxOS4wMDcsMzkuNTAyIEwxOC45NjIsMzkuNjczIEwxMy44MjcsNDIuNjM3IEwxMy43NjQsNDIuNjU0IiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTguNTIsOTAuMzc1IEw4LjUyLDQ2LjQyMSBMOC41ODMsNDYuMzg1IEw3NS44NCw3LjU1NCBMNzUuODQsNTEuNTA4IEw3NS43NzgsNTEuNTQ0IEw4LjUyLDkwLjM3NSBMOC41Miw5MC4zNzUgWiBNOC43Nyw0Ni41NjQgTDguNzcsODkuOTQ0IEw3NS41OTEsNTEuMzY1IEw3NS41OTEsNy45ODUgTDguNzcsNDYuNTY0IEw4Ljc3LDQ2LjU2NCBaIiBpZD0iRmlsbC02IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0Ljk4Niw4My4xODIgQzI0Ljc1Niw4My4zMzEgMjQuMzc0LDgzLjU2NiAyNC4xMzcsODMuNzA1IEwxMi42MzIsOTAuNDA2IEMxMi4zOTUsOTAuNTQ1IDEyLjQyNiw5MC42NTggMTIuNyw5MC42NTggTDEzLjI2NSw5MC42NTggQzEzLjU0LDkwLjY1OCAxMy45NTgsOTAuNTQ1IDE0LjE5NSw5MC40MDYgTDI1LjcsODMuNzA1IEMyNS45MzcsODMuNTY2IDI2LjEyOCw4My40NTIgMjYuMTI1LDgzLjQ0OSBDMjYuMTIyLDgzLjQ0NyAyNi4xMTksODMuMjIgMjYuMTE5LDgyLjk0NiBDMjYuMTE5LDgyLjY3MiAyNS45MzEsODIuNTY5IDI1LjcwMSw4Mi43MTkgTDI0Ljk4Niw4My4xODIiIGlkPSJGaWxsLTciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMjY2LDkwLjc4MiBMMTIuNyw5MC43ODIgQzEyLjUsOTAuNzgyIDEyLjM4NCw5MC43MjYgMTIuMzU0LDkwLjYxNiBDMTIuMzI0LDkwLjUwNiAxMi4zOTcsOTAuMzk5IDEyLjU2OSw5MC4yOTkgTDI0LjA3NCw4My41OTcgQzI0LjMxLDgzLjQ1OSAyNC42ODksODMuMjI2IDI0LjkxOCw4My4wNzggTDI1LjYzMyw4Mi42MTQgQzI1LjcyMyw4Mi41NTUgMjUuODEzLDgyLjUyNSAyNS44OTksODIuNTI1IEMyNi4wNzEsODIuNTI1IDI2LjI0NCw4Mi42NTUgMjYuMjQ0LDgyLjk0NiBDMjYuMjQ0LDgzLjE2IDI2LjI0NSw4My4zMDkgMjYuMjQ3LDgzLjM4MyBMMjYuMjUzLDgzLjM4NyBMMjYuMjQ5LDgzLjQ1NiBDMjYuMjQ2LDgzLjUzMSAyNi4yNDYsODMuNTMxIDI1Ljc2Myw4My44MTIgTDE0LjI1OCw5MC41MTQgQzE0LDkwLjY2NSAxMy41NjQsOTAuNzgyIDEzLjI2Niw5MC43ODIgTDEzLjI2Niw5MC43ODIgWiBNMTIuNjY2LDkwLjUzMiBMMTIuNyw5MC41MzMgTDEzLjI2Niw5MC41MzMgQzEzLjUxOCw5MC41MzMgMTMuOTE1LDkwLjQyNSAxNC4xMzIsOTAuMjk5IEwyNS42MzcsODMuNTk3IEMyNS44MDUsODMuNDk5IDI1LjkzMSw4My40MjQgMjUuOTk4LDgzLjM4MyBDMjUuOTk0LDgzLjI5OSAyNS45OTQsODMuMTY1IDI1Ljk5NCw4Mi45NDYgTDI1Ljg5OSw4Mi43NzUgTDI1Ljc2OCw4Mi44MjQgTDI1LjA1NCw4My4yODcgQzI0LjgyMiw4My40MzcgMjQuNDM4LDgzLjY3MyAyNC4yLDgzLjgxMiBMMTIuNjk1LDkwLjUxNCBMMTIuNjY2LDkwLjUzMiBMMTIuNjY2LDkwLjUzMiBaIiBpZD0iRmlsbC04IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEzLjI2Niw4OS44NzEgTDEyLjcsODkuODcxIEMxMi41LDg5Ljg3MSAxMi4zODQsODkuODE1IDEyLjM1NCw4OS43MDUgQzEyLjMyNCw4OS41OTUgMTIuMzk3LDg5LjQ4OCAxMi41NjksODkuMzg4IEwyNC4wNzQsODIuNjg2IEMyNC4zMzIsODIuNTM1IDI0Ljc2OCw4Mi40MTggMjUuMDY3LDgyLjQxOCBMMjUuNjMyLDgyLjQxOCBDMjUuODMyLDgyLjQxOCAyNS45NDgsODIuNDc0IDI1Ljk3OCw4Mi41ODQgQzI2LjAwOCw4Mi42OTQgMjUuOTM1LDgyLjgwMSAyNS43NjMsODIuOTAxIEwxNC4yNTgsODkuNjAzIEMxNCw4OS43NTQgMTMuNTY0LDg5Ljg3MSAxMy4yNjYsODkuODcxIEwxMy4yNjYsODkuODcxIFogTTEyLjY2Niw4OS42MjEgTDEyLjcsODkuNjIyIEwxMy4yNjYsODkuNjIyIEMxMy41MTgsODkuNjIyIDEzLjkxNSw4OS41MTUgMTQuMTMyLDg5LjM4OCBMMjUuNjM3LDgyLjY4NiBMMjUuNjY3LDgyLjY2OCBMMjUuNjMyLDgyLjY2NyBMMjUuMDY3LDgyLjY2NyBDMjQuODE1LDgyLjY2NyAyNC40MTgsODIuNzc1IDI0LjIsODIuOTAxIEwxMi42OTUsODkuNjAzIEwxMi42NjYsODkuNjIxIEwxMi42NjYsODkuNjIxIFoiIGlkPSJGaWxsLTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMzcsOTAuODAxIEwxMi4zNyw4OS41NTQgTDEyLjM3LDkwLjgwMSIgaWQ9IkZpbGwtMTAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi4xMyw5My45MDEgQzUuMzc5LDkzLjgwOCA0LjgxNiw5My4xNjQgNC42OTEsOTIuNTI1IEMzLjg2LDg4LjI4NyAzLjU0LDgzLjc0MyAzLjUyNiw3MS4xNzMgQzMuNTExLDU4LjM4OSA0LjQyMyw1MS40MjggNC40MjMsNTEuNDI4IEM1LjEzNCw0Ny4yODIgNy4yMSw0Ni4yMzYgNy4yMSw0Ni4yMzYgQzcuMjEsNDYuMjM2IDgxLjY2NywzLjI1IDgyLjA2OSwzLjAxNyBDODIuMjkyLDIuODg4IDg0LjU1NiwxLjQzMyA4NS4yNjQsMy45NCBDODcuMjE0LDEwLjg0IDg2Ljc1MiwzNS44MjcgODUuNTM5LDQzLjgxOCBDODUuMTUsNDYuMzgzIDg0LjI5MSw0OS4wMzMgODIuNDgzLDUwLjEwMSBMNy4yMSw5My42NTMgQzYuODI4LDkzLjg3NCA2LjQ2MSw5My45NDEgNi4xMyw5My45MDEgQzYuMTMsOTMuOTAxIDMuMzQ5LDkzLjQ2IDMuMTI5LDkxLjc3NiBDMi41NjgsODcuNDk1IDEuOTc3LDgyLjk5NSAxLjk2Miw3MC40MjUgQzEuOTQ4LDU3LjY0MSAyLjg2LDUwLjY4IDIuODYsNTAuNjggQzMuNTcsNDYuNTM0IDUuNjQ3LDQ1LjQ4OSA1LjY0Nyw0NS40ODkgQzUuNjQ2LDQ1LjQ4OSA4LjA2NSw0NC4wOTIgMTIuMjQ1LDQxLjY3OSBMMTMuMTE2LDQxLjU2IEwxOS43MTUsMzcuNzMgTDE5Ljc2MSwzNy4yNjkgTDYuMTMsOTMuOTAxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjMxNyw5NC4xNjEgTDYuMTAyLDk0LjE0OCBMNi4xMDEsOTQuMTQ4IEw1Ljg1Nyw5NC4xMDEgQzUuMTM4LDkzLjk0NSAzLjA4NSw5My4zNjUgMi44ODEsOTEuODA5IEMyLjMxMyw4Ny40NjkgMS43MjcsODIuOTk2IDEuNzEzLDcwLjQyNSBDMS42OTksNTcuNzcxIDIuNjA0LDUwLjcxOCAyLjYxMyw1MC42NDggQzMuMzM4LDQ2LjQxNyA1LjQ0NSw0NS4zMSA1LjUzNSw0NS4yNjYgTDEyLjE2Myw0MS40MzkgTDEzLjAzMyw0MS4zMiBMMTkuNDc5LDM3LjU3OCBMMTkuNTEzLDM3LjI0NCBDMTkuNTI2LDM3LjEwNyAxOS42NDcsMzcuMDA4IDE5Ljc4NiwzNy4wMjEgQzE5LjkyMiwzNy4wMzQgMjAuMDIzLDM3LjE1NiAyMC4wMDksMzcuMjkzIEwxOS45NSwzNy44ODIgTDEzLjE5OCw0MS44MDEgTDEyLjMyOCw0MS45MTkgTDUuNzcyLDQ1LjcwNCBDNS43NDEsNDUuNzIgMy43ODIsNDYuNzcyIDMuMTA2LDUwLjcyMiBDMy4wOTksNTAuNzgyIDIuMTk4LDU3LjgwOCAyLjIxMiw3MC40MjQgQzIuMjI2LDgyLjk2MyAyLjgwOSw4Ny40MiAzLjM3Myw5MS43MjkgQzMuNDY0LDkyLjQyIDQuMDYyLDkyLjg4MyA0LjY4Miw5My4xODEgQzQuNTY2LDkyLjk4NCA0LjQ4Niw5Mi43NzYgNC40NDYsOTIuNTcyIEMzLjY2NSw4OC41ODggMy4yOTEsODQuMzcgMy4yNzYsNzEuMTczIEMzLjI2Miw1OC41MiA0LjE2Nyw1MS40NjYgNC4xNzYsNTEuMzk2IEM0LjkwMSw0Ny4xNjUgNy4wMDgsNDYuMDU5IDcuMDk4LDQ2LjAxNCBDNy4wOTQsNDYuMDE1IDgxLjU0MiwzLjAzNCA4MS45NDQsMi44MDIgTDgxLjk3MiwyLjc4NSBDODIuODc2LDIuMjQ3IDgzLjY5MiwyLjA5NyA4NC4zMzIsMi4zNTIgQzg0Ljg4NywyLjU3MyA4NS4yODEsMy4wODUgODUuNTA0LDMuODcyIEM4Ny41MTgsMTEgODYuOTY0LDM2LjA5MSA4NS43ODUsNDMuODU1IEM4NS4yNzgsNDcuMTk2IDg0LjIxLDQ5LjM3IDgyLjYxLDUwLjMxNyBMNy4zMzUsOTMuODY5IEM2Ljk5OSw5NC4wNjMgNi42NTgsOTQuMTYxIDYuMzE3LDk0LjE2MSBMNi4zMTcsOTQuMTYxIFogTTYuMTcsOTMuNjU0IEM2LjQ2Myw5My42OSA2Ljc3NCw5My42MTcgNy4wODUsOTMuNDM3IEw4Mi4zNTgsNDkuODg2IEM4NC4xODEsNDguODA4IDg0Ljk2LDQ1Ljk3MSA4NS4yOTIsNDMuNzggQzg2LjQ2NiwzNi4wNDkgODcuMDIzLDExLjA4NSA4NS4wMjQsNC4wMDggQzg0Ljg0NiwzLjM3NyA4NC41NTEsMi45NzYgODQuMTQ4LDIuODE2IEM4My42NjQsMi42MjMgODIuOTgyLDIuNzY0IDgyLjIyNywzLjIxMyBMODIuMTkzLDMuMjM0IEM4MS43OTEsMy40NjYgNy4zMzUsNDYuNDUyIDcuMzM1LDQ2LjQ1MiBDNy4zMDQsNDYuNDY5IDUuMzQ2LDQ3LjUyMSA0LjY2OSw1MS40NzEgQzQuNjYyLDUxLjUzIDMuNzYxLDU4LjU1NiAzLjc3NSw3MS4xNzMgQzMuNzksODQuMzI4IDQuMTYxLDg4LjUyNCA0LjkzNiw5Mi40NzYgQzUuMDI2LDkyLjkzNyA1LjQxMiw5My40NTkgNS45NzMsOTMuNjE1IEM2LjA4Nyw5My42NCA2LjE1OCw5My42NTIgNi4xNjksOTMuNjU0IEw2LjE3LDkzLjY1NCBMNi4xNyw5My42NTQgWiIgaWQ9IkZpbGwtMTIiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4zMTcsNjguOTgyIEM3LjgwNiw2OC43MDEgOC4yMDIsNjguOTI2IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNi44MjksNzEuMjk0IDYuNDMzLDcxLjA2OSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIiBpZD0iRmlsbC0xMyIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjkyLDcxLjEzMyBDNi42MzEsNzEuMTMzIDYuNDMzLDcwLjkwNSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIEM3LjQ2LDY4LjkgNy41OTUsNjguODYxIDcuNzE0LDY4Ljg2MSBDOC4wMDMsNjguODYxIDguMjAyLDY5LjA5IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNy4xNzQsNzEuMDk0IDcuMDM5LDcxLjEzMyA2LjkyLDcxLjEzMyBNNy43MTQsNjguNjc0IEM3LjU1Nyw2OC42NzQgNy4zOTIsNjguNzIzIDcuMjI0LDY4LjgyMSBDNi42NzYsNjkuMTM4IDYuMjQ2LDY5Ljg3OSA2LjI0Niw3MC41MDggQzYuMjQ2LDcwLjk5NCA2LjUxNyw3MS4zMiA2LjkyLDcxLjMyIEM3LjA3OCw3MS4zMiA3LjI0Myw3MS4yNzEgNy40MTEsNzEuMTc0IEM3Ljk1OSw3MC44NTcgOC4zODksNzAuMTE3IDguMzg5LDY5LjQ4NyBDOC4zODksNjkuMDAxIDguMTE3LDY4LjY3NCA3LjcxNCw2OC42NzQiIGlkPSJGaWxsLTE0IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuOTIsNzAuOTQ3IEM2LjY0OSw3MC45NDcgNi42MjEsNzAuNjQgNi42MjEsNzAuNTA4IEM2LjYyMSw3MC4wMTcgNi45ODIsNjkuMzkyIDcuNDExLDY5LjE0NSBDNy41MjEsNjkuMDgyIDcuNjI1LDY5LjA0OSA3LjcxNCw2OS4wNDkgQzcuOTg2LDY5LjA0OSA4LjAxNSw2OS4zNTUgOC4wMTUsNjkuNDg3IEM4LjAxNSw2OS45NzggNy42NTIsNzAuNjAzIDcuMjI0LDcwLjg1MSBDNy4xMTUsNzAuOTE0IDcuMDEsNzAuOTQ3IDYuOTIsNzAuOTQ3IE03LjcxNCw2OC44NjEgQzcuNTk1LDY4Ljg2MSA3LjQ2LDY4LjkgNy4zMTcsNjguOTgyIEM2LjgyOSw2OS4yNjUgNi40MzMsNjkuOTQ4IDYuNDMzLDcwLjUwOCBDNi40MzMsNzAuOTA1IDYuNjMxLDcxLjEzMyA2LjkyLDcxLjEzMyBDNy4wMzksNzEuMTMzIDcuMTc0LDcxLjA5NCA3LjMxNyw3MS4wMTIgQzcuODA2LDcwLjczIDguMjAyLDcwLjA0NyA4LjIwMiw2OS40ODcgQzguMjAyLDY5LjA5IDguMDAzLDY4Ljg2MSA3LjcxNCw2OC44NjEiIGlkPSJGaWxsLTE1IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNDQ0LDg1LjM1IEM3LjcwOCw4NS4xOTggNy45MjEsODUuMzE5IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuOTI1IDcuNzA4LDg2LjI5MiA3LjQ0NCw4Ni40NDQgQzcuMTgxLDg2LjU5NyA2Ljk2Nyw4Ni40NzUgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IiBpZD0iRmlsbC0xNiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjIzLDg2LjUxIEM3LjA3NCw4Ni41MSA2Ljk2Nyw4Ni4zODcgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IEM3LjUyMSw4NS4zMDUgNy41OTQsODUuMjg0IDcuNjU4LDg1LjI4NCBDNy44MTQsODUuMjg0IDcuOTIxLDg1LjQwOCA3LjkyMSw4NS42MjIgQzcuOTIxLDg1LjkyNSA3LjcwOCw4Ni4yOTIgNy40NDQsODYuNDQ0IEM3LjM2Nyw4Ni40ODkgNy4yOTQsODYuNTEgNy4yMyw4Ni41MSBNNy42NTgsODUuMDk4IEM3LjU1OCw4NS4wOTggNy40NTUsODUuMTI3IDcuMzUxLDg1LjE4OCBDNy4wMzEsODUuMzczIDYuNzgxLDg1LjgwNiA2Ljc4MSw4Ni4xNzMgQzYuNzgxLDg2LjQ4MiA2Ljk2Niw4Ni42OTcgNy4yMyw4Ni42OTcgQzcuMzMsODYuNjk3IDcuNDMzLDg2LjY2NiA3LjUzOCw4Ni42MDcgQzcuODU4LDg2LjQyMiA4LjEwOCw4NS45ODkgOC4xMDgsODUuNjIyIEM4LjEwOCw4NS4zMTMgNy45MjMsODUuMDk4IDcuNjU4LDg1LjA5OCIgaWQ9IkZpbGwtMTciIGZpbGw9IiM4MDk3QTIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4yMyw4Ni4zMjIgTDcuMTU0LDg2LjE3MyBDNy4xNTQsODUuOTM4IDcuMzMzLDg1LjYyOSA3LjUzOCw4NS41MTIgTDcuNjU4LDg1LjQ3MSBMNy43MzQsODUuNjIyIEM3LjczNCw4NS44NTYgNy41NTUsODYuMTY0IDcuMzUxLDg2LjI4MiBMNy4yMyw4Ni4zMjIgTTcuNjU4LDg1LjI4NCBDNy41OTQsODUuMjg0IDcuNTIxLDg1LjMwNSA3LjQ0NCw4NS4zNSBDNy4xODEsODUuNTAyIDYuOTY3LDg1Ljg3MSA2Ljk2Nyw4Ni4xNzMgQzYuOTY3LDg2LjM4NyA3LjA3NCw4Ni41MSA3LjIzLDg2LjUxIEM3LjI5NCw4Ni41MSA3LjM2Nyw4Ni40ODkgNy40NDQsODYuNDQ0IEM3LjcwOCw4Ni4yOTIgNy45MjEsODUuOTI1IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuNDA4IDcuODE0LDg1LjI4NCA3LjY1OCw4NS4yODQiIGlkPSJGaWxsLTE4IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTc3LjI3OCw3Ljc2OSBMNzcuMjc4LDUxLjQzNiBMMTAuMjA4LDkwLjE2IEwxMC4yMDgsNDYuNDkzIEw3Ny4yNzgsNy43NjkiIGlkPSJGaWxsLTE5IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEwLjA4Myw5MC4zNzUgTDEwLjA4Myw0Ni40MjEgTDEwLjE0Niw0Ni4zODUgTDc3LjQwMyw3LjU1NCBMNzcuNDAzLDUxLjUwOCBMNzcuMzQxLDUxLjU0NCBMMTAuMDgzLDkwLjM3NSBMMTAuMDgzLDkwLjM3NSBaIE0xMC4zMzMsNDYuNTY0IEwxMC4zMzMsODkuOTQ0IEw3Ny4xNTQsNTEuMzY1IEw3Ny4xNTQsNy45ODUgTDEwLjMzMyw0Ni41NjQgTDEwLjMzMyw0Ni41NjQgWiIgaWQ9IkZpbGwtMjAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMjUuNzM3LDg4LjY0NyBMMTE4LjA5OCw5MS45ODEgTDExOC4wOTgsODQgTDEwNi42MzksODguNzEzIEwxMDYuNjM5LDk2Ljk4MiBMOTksMTAwLjMxNSBMMTEyLjM2OSwxMDMuOTYxIEwxMjUuNzM3LDg4LjY0NyIgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTIiIGZpbGw9IiM0NTVBNjQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+');\n};\n\nmodule.exports = RotateInstructions;\n\n},{\"./util.js\":24}],19:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * TODO: Fix up all \"new THREE\" instantiations to improve performance.\n */\nvar SensorSample = _dereq_('./sensor-sample.js');\nvar MathUtil = _dereq_('../math-util.js');\nvar Util = _dereq_('../util.js');\n\nvar DEBUG = false;\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Current filter orientation\n this.filterQ = new MathUtil.Quaternion();\n this.previousFilterQ = new MathUtil.Quaternion();\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (DEBUG) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n},{\"../math-util.js\":16,\"../util.js\":24,\"./sensor-sample.js\":22}],20:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar ComplementaryFilter = _dereq_('./complementary-filter.js');\nvar PosePredictor = _dereq_('./pose-predictor.js');\nvar TouchPanner = _dereq_('../touch-panner.js');\nvar MathUtil = _dereq_('../math-util.js');\nvar Util = _dereq_('../util.js');\n\n/**\n * The pose sensor, implemented using DeviceMotion APIs.\n */\nfunction FusionPoseSensor() {\n this.deviceId = 'webvr-polyfill:fused';\n this.deviceName = 'VR Position Device (webvr-polyfill:fused)';\n\n this.accelerometer = new MathUtil.Vector3();\n this.gyroscope = new MathUtil.Vector3();\n\n window.addEventListener('devicemotion', this.onDeviceMotionChange_.bind(this));\n window.addEventListener('orientationchange', this.onScreenOrientationChange_.bind(this));\n\n this.filter = new ComplementaryFilter(WebVRConfig.K_FILTER);\n this.posePredictor = new PosePredictor(WebVRConfig.PREDICTION_TIME_S);\n this.touchPanner = new TouchPanner();\n\n this.filterToWorldQ = new MathUtil.Quaternion();\n\n // Set the filter to world transform, depending on OS.\n if (Util.isIOS()) {\n this.filterToWorldQ.setFromAxisAngle(new MathUtil.Vector3(1, 0, 0), Math.PI / 2);\n } else {\n this.filterToWorldQ.setFromAxisAngle(new MathUtil.Vector3(1, 0, 0), -Math.PI / 2);\n }\n\n this.inverseWorldToScreenQ = new MathUtil.Quaternion();\n this.worldToScreenQ = new MathUtil.Quaternion();\n this.originalPoseAdjustQ = new MathUtil.Quaternion();\n this.originalPoseAdjustQ.setFromAxisAngle(new MathUtil.Vector3(0, 0, 1),\n -window.orientation * Math.PI / 180);\n\n this.setScreenTransform_();\n // Adjust this filter for being in landscape mode.\n if (Util.isLandscapeMode()) {\n this.filterToWorldQ.multiply(this.inverseWorldToScreenQ);\n }\n\n // Keep track of a reset transform for resetSensor.\n this.resetQ = new MathUtil.Quaternion();\n\n this.isFirefoxAndroid = Util.isFirefoxAndroid();\n this.isIOS = Util.isIOS();\n\n this.orientationOut_ = new Float32Array(4);\n}\n\nFusionPoseSensor.prototype.getPosition = function() {\n // This PoseSensor doesn't support position\n return null;\n};\n\nFusionPoseSensor.prototype.getOrientation = function() {\n // Convert from filter space to the the same system used by the\n // deviceorientation event.\n var orientation = this.filter.getOrientation();\n\n // Predict orientation.\n this.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n // Convert to THREE coordinate system: -Z forward, Y up, X right.\n var out = new MathUtil.Quaternion();\n out.copy(this.filterToWorldQ);\n out.multiply(this.resetQ);\n if (!WebVRConfig.TOUCH_PANNER_DISABLED) {\n out.multiply(this.touchPanner.getOrientation());\n }\n out.multiply(this.predictedQ);\n out.multiply(this.worldToScreenQ);\n\n // Handle the yaw-only case.\n if (WebVRConfig.YAW_ONLY) {\n // Make a quaternion that only turns around the Y-axis.\n out.x = 0;\n out.z = 0;\n out.normalize();\n }\n\n this.orientationOut_[0] = out.x;\n this.orientationOut_[1] = out.y;\n this.orientationOut_[2] = out.z;\n this.orientationOut_[3] = out.w;\n return this.orientationOut_;\n};\n\nFusionPoseSensor.prototype.resetPose = function() {\n // Reduce to inverted yaw-only.\n this.resetQ.copy(this.filter.getOrientation());\n this.resetQ.x = 0;\n this.resetQ.y = 0;\n this.resetQ.z *= -1;\n this.resetQ.normalize();\n\n // Take into account extra transformations in landscape mode.\n if (Util.isLandscapeMode()) {\n this.resetQ.multiply(this.inverseWorldToScreenQ);\n }\n\n // Take into account original pose.\n this.resetQ.multiply(this.originalPoseAdjustQ);\n\n if (!WebVRConfig.TOUCH_PANNER_DISABLED) {\n this.touchPanner.resetSensor();\n }\n};\n\nFusionPoseSensor.prototype.onDeviceMotionChange_ = function(deviceMotion) {\n var accGravity = deviceMotion.accelerationIncludingGravity;\n var rotRate = deviceMotion.rotationRate;\n var timestampS = deviceMotion.timeStamp / 1000;\n\n // Firefox Android timeStamp returns one thousandth of a millisecond.\n if (this.isFirefoxAndroid) {\n timestampS /= 1000;\n }\n\n var deltaS = timestampS - this.previousTimestampS;\n if (deltaS <= Util.MIN_TIMESTEP || deltaS > Util.MAX_TIMESTEP) {\n console.warn('Invalid timestamps detected. Time step between successive ' +\n 'gyroscope sensor samples is very small or not monotonic');\n this.previousTimestampS = timestampS;\n return;\n }\n this.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n this.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n // With iOS and Firefox Android, rotationRate is reported in degrees,\n // so we first convert to radians.\n if (this.isIOS || this.isFirefoxAndroid) {\n this.gyroscope.multiplyScalar(Math.PI / 180);\n }\n\n this.filter.addAccelMeasurement(this.accelerometer, timestampS);\n this.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n this.previousTimestampS = timestampS;\n};\n\nFusionPoseSensor.prototype.onScreenOrientationChange_ =\n function(screenOrientation) {\n this.setScreenTransform_();\n};\n\nFusionPoseSensor.prototype.setScreenTransform_ = function() {\n this.worldToScreenQ.set(0, 0, 0, 1);\n switch (window.orientation) {\n case 0:\n break;\n case 90:\n this.worldToScreenQ.setFromAxisAngle(new MathUtil.Vector3(0, 0, 1), -Math.PI / 2);\n break;\n case -90:\n this.worldToScreenQ.setFromAxisAngle(new MathUtil.Vector3(0, 0, 1), Math.PI / 2);\n break;\n case 180:\n // TODO.\n break;\n }\n this.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n this.inverseWorldToScreenQ.inverse();\n};\n\nmodule.exports = FusionPoseSensor;\n\n},{\"../math-util.js\":16,\"../touch-panner.js\":23,\"../util.js\":24,\"./complementary-filter.js\":19,\"./pose-predictor.js\":21}],21:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = _dereq_('../math-util.js');\nvar DEBUG = false;\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (DEBUG) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n},{\"../math-util.js\":16}],22:[function(_dereq_,module,exports){\nfunction SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n},{}],23:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = _dereq_('./math-util.js');\nvar Util = _dereq_('./util.js');\n\nvar ROTATE_SPEED = 0.5;\n/**\n * Provides a quaternion responsible for pre-panning the scene before further\n * transformations due to device sensors.\n */\nfunction TouchPanner() {\n window.addEventListener('touchstart', this.onTouchStart_.bind(this));\n window.addEventListener('touchmove', this.onTouchMove_.bind(this));\n window.addEventListener('touchend', this.onTouchEnd_.bind(this));\n\n this.isTouching = false;\n this.rotateStart = new MathUtil.Vector2();\n this.rotateEnd = new MathUtil.Vector2();\n this.rotateDelta = new MathUtil.Vector2();\n\n this.theta = 0;\n this.orientation = new MathUtil.Quaternion();\n}\n\nTouchPanner.prototype.getOrientation = function() {\n this.orientation.setFromEulerXYZ(0, 0, this.theta);\n return this.orientation;\n};\n\nTouchPanner.prototype.resetSensor = function() {\n this.theta = 0;\n};\n\nTouchPanner.prototype.onTouchStart_ = function(e) {\n // Only respond if there is exactly one touch.\n if (e.touches.length != 1) {\n return;\n }\n this.rotateStart.set(e.touches[0].pageX, e.touches[0].pageY);\n this.isTouching = true;\n};\n\nTouchPanner.prototype.onTouchMove_ = function(e) {\n if (!this.isTouching) {\n return;\n }\n this.rotateEnd.set(e.touches[0].pageX, e.touches[0].pageY);\n this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);\n this.rotateStart.copy(this.rotateEnd);\n\n // On iOS, direction is inverted.\n if (Util.isIOS()) {\n this.rotateDelta.x *= -1;\n }\n\n var element = document.body;\n this.theta += 2 * Math.PI * this.rotateDelta.x / element.clientWidth * ROTATE_SPEED;\n};\n\nTouchPanner.prototype.onTouchEnd_ = function(e) {\n this.isTouching = false;\n};\n\nmodule.exports = TouchPanner;\n\n},{\"./math-util.js\":16,\"./util.js\":24}],24:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar objectAssign = _dereq_('object-assign');\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n return (window.orientation == 90 || window.orientation == -90);\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = function (out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right),\n bt = 1 / (bottom - top),\n nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = objectAssign;\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n console.log('Resetting width to...', width);\n setTimeout(function() {\n console.log('Done. Width is now', width);\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nmodule.exports = Util;\n\n},{\"object-assign\":2}],25:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Emitter = _dereq_('./emitter.js');\nvar Util = _dereq_('./util.js');\nvar DeviceInfo = _dereq_('./device-info.js');\n\nvar DEFAULT_VIEWER = 'CardboardV1';\nvar VIEWER_KEY = 'WEBVR_CARDBOARD_VIEWER';\nvar CLASS_NAME = 'webvr-polyfill-viewer-selector';\n\n/**\n * Creates a viewer selector with the options specified. Supports being shown\n * and hidden. Generates events when viewer parameters change. Also supports\n * saving the currently selected index in localStorage.\n */\nfunction ViewerSelector() {\n // Try to load the selected key from local storage. If none exists, use the\n // default key.\n try {\n this.selectedKey = localStorage.getItem(VIEWER_KEY) || DEFAULT_VIEWER;\n } catch (error) {\n console.error('Failed to load viewer profile: %s', error);\n }\n this.dialog = this.createDialog_(DeviceInfo.Viewers);\n this.root = null;\n}\nViewerSelector.prototype = new Emitter();\n\nViewerSelector.prototype.show = function(root) {\n this.root = root;\n\n root.appendChild(this.dialog);\n //console.log('ViewerSelector.show');\n\n // Ensure the currently selected item is checked.\n var selected = this.dialog.querySelector('#' + this.selectedKey);\n selected.checked = true;\n\n // Show the UI.\n this.dialog.style.display = 'block';\n};\n\nViewerSelector.prototype.hide = function() {\n if (this.root && this.root.contains(this.dialog)) {\n this.root.removeChild(this.dialog);\n }\n //console.log('ViewerSelector.hide');\n this.dialog.style.display = 'none';\n};\n\nViewerSelector.prototype.getCurrentViewer = function() {\n return DeviceInfo.Viewers[this.selectedKey];\n};\n\nViewerSelector.prototype.getSelectedKey_ = function() {\n var input = this.dialog.querySelector('input[name=field]:checked');\n if (input) {\n return input.id;\n }\n return null;\n};\n\nViewerSelector.prototype.onSave_ = function() {\n this.selectedKey = this.getSelectedKey_();\n if (!this.selectedKey || !DeviceInfo.Viewers[this.selectedKey]) {\n console.error('ViewerSelector.onSave_: this should never happen!');\n return;\n }\n\n this.emit('change', DeviceInfo.Viewers[this.selectedKey]);\n\n // Attempt to save the viewer profile, but fails in private mode.\n try {\n localStorage.setItem(VIEWER_KEY, this.selectedKey);\n } catch(error) {\n console.error('Failed to save viewer profile: %s', error);\n }\n this.hide();\n};\n\n/**\n * Creates the dialog.\n */\nViewerSelector.prototype.createDialog_ = function(options) {\n var container = document.createElement('div');\n container.classList.add(CLASS_NAME);\n container.style.display = 'none';\n // Create an overlay that dims the background, and which goes away when you\n // tap it.\n var overlay = document.createElement('div');\n var s = overlay.style;\n s.position = 'fixed';\n s.left = 0;\n s.top = 0;\n s.width = '100%';\n s.height = '100%';\n s.background = 'rgba(0, 0, 0, 0.3)';\n overlay.addEventListener('click', this.hide.bind(this));\n\n var width = 280;\n var dialog = document.createElement('div');\n var s = dialog.style;\n s.boxSizing = 'border-box';\n s.position = 'fixed';\n s.top = '24px';\n s.left = '50%';\n s.marginLeft = (-width/2) + 'px';\n s.width = width + 'px';\n s.padding = '24px';\n s.overflow = 'hidden';\n s.background = '#fafafa';\n s.fontFamily = \"'Roboto', sans-serif\";\n s.boxShadow = '0px 5px 20px #666';\n\n dialog.appendChild(this.createH1_('Select your viewer'));\n for (var id in options) {\n dialog.appendChild(this.createChoice_(id, options[id].label));\n }\n dialog.appendChild(this.createButton_('Save', this.onSave_.bind(this)));\n\n container.appendChild(overlay);\n container.appendChild(dialog);\n\n return container;\n};\n\nViewerSelector.prototype.createH1_ = function(name) {\n var h1 = document.createElement('h1');\n var s = h1.style;\n s.color = 'black';\n s.fontSize = '20px';\n s.fontWeight = 'bold';\n s.marginTop = 0;\n s.marginBottom = '24px';\n h1.innerHTML = name;\n return h1;\n};\n\nViewerSelector.prototype.createChoice_ = function(id, name) {\n /*\n

\n \n \n
\n */\n var div = document.createElement('div');\n div.style.marginTop = '8px';\n div.style.color = 'black';\n\n var input = document.createElement('input');\n input.style.fontSize = '30px';\n input.setAttribute('id', id);\n input.setAttribute('type', 'radio');\n input.setAttribute('value', id);\n input.setAttribute('name', 'field');\n\n var label = document.createElement('label');\n label.style.marginLeft = '4px';\n label.setAttribute('for', id);\n label.innerHTML = name;\n\n div.appendChild(input);\n div.appendChild(label);\n\n return div;\n};\n\nViewerSelector.prototype.createButton_ = function(label, onclick) {\n var button = document.createElement('button');\n button.innerHTML = label;\n var s = button.style;\n s.float = 'right';\n s.textTransform = 'uppercase';\n s.color = '#1094f7';\n s.fontSize = '14px';\n s.letterSpacing = 0;\n s.border = 0;\n s.background = 'none';\n s.marginTop = '16px';\n\n button.addEventListener('click', onclick);\n\n return button;\n};\n\nmodule.exports = ViewerSelector;\n\n},{\"./device-info.js\":9,\"./emitter.js\":14,\"./util.js\":24}],26:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = _dereq_('./util.js');\n\n/**\n * Android and iOS compatible wakelock implementation.\n *\n * Refactored thanks to dkovalev@.\n */\nfunction AndroidWakeLock() {\n var video = document.createElement('video');\n\n video.addEventListener('ended', function() {\n video.play();\n });\n\n this.request = function() {\n if (video.paused) {\n // Base64 version of videos_src/no-sleep-120s.mp4.\n video.src = Util.base64('video/mp4', 'AAAAGGZ0eXBpc29tAAAAAG1wNDFhdmMxAAAIA21vb3YAAABsbXZoZAAAAADSa9v60mvb+gABX5AAlw/gAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAdkdHJhawAAAFx0a2hkAAAAAdJr2/rSa9v6AAAAAQAAAAAAlw/gAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAQAAAAHAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAJcP4AAAAAAAAQAAAAAG3G1kaWEAAAAgbWRoZAAAAADSa9v60mvb+gAPQkAGjneAFccAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAABodtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAZHc3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAMABwASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQAC//hABlnZAALrNlfllw4QAAAAwBAAAADAKPFCmWAAQAFaOvssiwAAAAYc3R0cwAAAAAAAAABAAAAbgAPQkAAAAAUc3RzcwAAAAAAAAABAAAAAQAAA4BjdHRzAAAAAAAAAG4AAAABAD0JAAAAAAEAehIAAAAAAQA9CQAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEALcbAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAABuAAAAAQAAAcxzdHN6AAAAAAAAAAAAAABuAAADCQAAABgAAAAOAAAADgAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAM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');\n video.play();\n }\n };\n\n this.release = function() {\n video.pause();\n video.src = '';\n };\n}\n\nfunction iOSWakeLock() {\n var timer = null;\n\n this.request = function() {\n if (!timer) {\n timer = setInterval(function() {\n window.location = window.location;\n setTimeout(window.stop, 0);\n }, 30000);\n }\n }\n\n this.release = function() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n}\n\n\nfunction getWakeLock() {\n var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n if (userAgent.match(/iPhone/i) || userAgent.match(/iPod/i)) {\n return iOSWakeLock;\n } else {\n return AndroidWakeLock;\n }\n}\n\nmodule.exports = getWakeLock();\n},{\"./util.js\":24}],27:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Polyfill ES6 Promises (mostly for IE 11).\n_dereq_('es6-promise').polyfill();\n\nvar CardboardVRDisplay = _dereq_('./cardboard-vr-display.js');\nvar MouseKeyboardVRDisplay = _dereq_('./mouse-keyboard-vr-display.js');\n// Uncomment to add positional tracking via webcam.\n//var WebcamPositionSensorVRDevice = require('./webcam-position-sensor-vr-device.js');\nvar VRDisplay = _dereq_('./base.js').VRDisplay;\nvar HMDVRDevice = _dereq_('./base.js').HMDVRDevice;\nvar PositionSensorVRDevice = _dereq_('./base.js').PositionSensorVRDevice;\nvar VRDisplayHMDDevice = _dereq_('./display-wrappers.js').VRDisplayHMDDevice;\nvar VRDisplayPositionSensorDevice = _dereq_('./display-wrappers.js').VRDisplayPositionSensorDevice;\n\nfunction WebVRPolyfill() {\n this.displays = [];\n this.devices = []; // For deprecated objects\n this.devicesPopulated = false;\n this.nativeWebVRAvailable = this.isWebVRAvailable();\n this.nativeLegacyWebVRAvailable = this.isDeprecatedWebVRAvailable();\n\n if (!this.nativeLegacyWebVRAvailable) {\n if (!this.nativeWebVRAvailable) {\n this.enablePolyfill();\n }\n if (WebVRConfig.ENABLE_DEPRECATED_API) {\n this.enableDeprecatedPolyfill();\n }\n }\n}\n\nWebVRPolyfill.prototype.isWebVRAvailable = function() {\n return ('getVRDisplays' in navigator);\n};\n\nWebVRPolyfill.prototype.isDeprecatedWebVRAvailable = function() {\n return ('getVRDevices' in navigator) || ('mozGetVRDevices' in navigator);\n};\n\nWebVRPolyfill.prototype.populateDevices = function() {\n if (this.devicesPopulated) {\n return;\n }\n\n // Initialize our virtual VR devices.\n var vrDisplay = null;\n\n // Add a Cardboard VRDisplay on compatible mobile devices\n if (this.isCardboardCompatible()) {\n vrDisplay = new CardboardVRDisplay();\n this.displays.push(vrDisplay);\n\n // For backwards compatibility\n if (WebVRConfig.ENABLE_DEPRECATED_API) {\n this.devices.push(new VRDisplayHMDDevice(vrDisplay));\n this.devices.push(new VRDisplayPositionSensorDevice(vrDisplay));\n }\n }\n\n // Add a Mouse and Keyboard driven VRDisplay for desktops/laptops\n if (!this.isMobile() && !WebVRConfig.MOUSE_KEYBOARD_CONTROLS_DISABLED) {\n vrDisplay = new MouseKeyboardVRDisplay();\n this.displays.push(vrDisplay);\n\n // For backwards compatibility\n if (WebVRConfig.ENABLE_DEPRECATED_API) {\n this.devices.push(new VRDisplayHMDDevice(vrDisplay));\n this.devices.push(new VRDisplayPositionSensorDevice(vrDisplay));\n }\n }\n\n // Uncomment to add positional tracking via webcam.\n //if (!this.isMobile() && WebVRConfig.ENABLE_DEPRECATED_API) {\n // positionDevice = new WebcamPositionSensorVRDevice();\n // this.devices.push(positionDevice);\n //}\n\n this.devicesPopulated = true;\n};\n\nWebVRPolyfill.prototype.enablePolyfill = function() {\n // Provide navigator.getVRDisplays.\n navigator.getVRDisplays = this.getVRDisplays.bind(this);\n\n // Provide the VRDisplay object.\n window.VRDisplay = VRDisplay;\n};\n\nWebVRPolyfill.prototype.enableDeprecatedPolyfill = function() {\n // Provide navigator.getVRDevices.\n navigator.getVRDevices = this.getVRDevices.bind(this);\n\n // Provide the CardboardHMDVRDevice and PositionSensorVRDevice objects.\n window.HMDVRDevice = HMDVRDevice;\n window.PositionSensorVRDevice = PositionSensorVRDevice;\n};\n\nWebVRPolyfill.prototype.getVRDisplays = function() {\n this.populateDevices();\n var displays = this.displays;\n return new Promise(function(resolve, reject) {\n try {\n resolve(displays);\n } catch (e) {\n reject(e);\n }\n });\n};\n\nWebVRPolyfill.prototype.getVRDevices = function() {\n console.warn('getVRDevices is deprecated. Please update your code to use getVRDisplays instead.');\n var self = this;\n return new Promise(function(resolve, reject) {\n try {\n if (!self.devicesPopulated) {\n if (self.nativeWebVRAvailable) {\n return navigator.getVRDisplays(function(displays) {\n for (var i = 0; i < displays.length; ++i) {\n self.devices.push(new VRDisplayHMDDevice(displays[i]));\n self.devices.push(new VRDisplayPositionSensorDevice(displays[i]));\n }\n self.devicesPopulated = true;\n resolve(self.devices);\n }, reject);\n }\n\n if (self.nativeLegacyWebVRAvailable) {\n return (navigator.getVRDDevices || navigator.mozGetVRDevices)(function(devices) {\n for (var i = 0; i < devices.length; ++i) {\n if (devices[i] instanceof HMDVRDevice) {\n self.devices.push(devices[i]);\n }\n if (devices[i] instanceof PositionSensorVRDevice) {\n self.devices.push(devices[i]);\n }\n }\n self.devicesPopulated = true;\n resolve(self.devices);\n }, reject);\n }\n }\n\n self.populateDevices();\n resolve(self.devices);\n } catch (e) {\n reject(e);\n }\n });\n};\n\n/**\n * Determine if a device is mobile.\n */\nWebVRPolyfill.prototype.isMobile = function() {\n return /Android/i.test(navigator.userAgent) ||\n /iPhone|iPad|iPod/i.test(navigator.userAgent);\n};\n\nWebVRPolyfill.prototype.isCardboardCompatible = function() {\n // For now, support all iOS and Android devices.\n // Also enable the WebVRConfig.FORCE_VR flag for debugging.\n return this.isMobile() || WebVRConfig.FORCE_ENABLE_VR;\n};\n\nmodule.exports = WebVRPolyfill;\n\n},{\"./base.js\":4,\"./cardboard-vr-display.js\":7,\"./display-wrappers.js\":10,\"./mouse-keyboard-vr-display.js\":17,\"es6-promise\":1}]},{},[15]);\n", - "module.exports={\n \"name\": \"aframe\",\n \"version\": \"0.3.0\",\n \"description\": \"Building blocks for the VR Web\",\n \"homepage\": \"https://aframe.io/\",\n \"main\": \"dist/aframe.js\",\n \"scripts\": {\n \"browserify\": \"browserify src/index.js -s 'AFRAME' -p browserify-derequire\",\n \"build\": \"mkdirp build/ && npm run browserify -- --debug -o build/aframe.js\",\n \"codecov\": \"codecov\",\n \"dev\": \"npm run build && node ./scripts/budo\",\n \"dist\": \"npm run dist:min && npm run dist:max\",\n \"dist:max\": \"npm run browserify -s -- --debug | exorcist dist/aframe.js.map > dist/aframe.js\",\n \"dist:min\": \"npm run browserify -s -- --debug -p [minifyify --map aframe.min.js.map --output dist/aframe.min.js.map] -o dist/aframe.min.js\",\n \"dist:release\": \"npm run dist:release:min && npm run dist:release:max\",\n \"dist:release:max\": \"npm run browserify -s -- --debug | exorcist dist/aframe-v0.3.0.js.map > dist/aframe-v0.3.0.js\",\n \"dist:release:min\": \"npm run browserify -s -- --debug -p [minifyify --map aframe-v0.3.0.min.js.map --output dist/aframe-v0.3.0.min.js.map] -o dist/aframe-v0.3.0.min.js\",\n \"gh-pages\": \"npm run ghpages\",\n \"ghpages\": \"node ./scripts/gh-pages\",\n \"lint\": \"semistandard -v | snazzy\",\n \"precommit\": \"npm run lint\",\n \"preghpages\": \"npm run dist && rimraf gh-pages && mkdirp gh-pages && cp -r {.nojekyll,dist,lib,examples,index.html,style} gh-pages/. 2>/dev/null || : && git checkout dist/ && replace 'build/aframe.js' 'dist/aframe.min.js' gh-pages/ -r --silent\",\n \"release:bump\": \"npm run dist && git commit -am 'bump dist' && npm version patch --preminor\",\n \"release:push\": \"npm login && npm publish && git push --follow-tags\",\n \"start\": \"npm run dev\",\n \"test\": \"karma start ./tests/karma.conf.js\",\n \"test:firefox\": \"karma start ./tests/karma.conf.js --browsers Firefox\",\n \"test:chrome\": \"karma start ./tests/karma.conf.js --browsers Chrome\",\n \"test:ci\": \"TEST_ENV=ci karma start ./tests/karma.conf.js --single-run --browsers Firefox\",\n \"version\": \"npm run dist\"\n },\n \"repository\": \"aframevr/aframe\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"debug\": \"^2.2.0\",\n \"deep-assign\": \"^2.0.0\",\n \"document-register-element\": \"dmarcos/document-register-element#8ccc532b7\",\n \"promise-polyfill\": \"^3.1.0\",\n \"object-assign\": \"^4.0.1\",\n \"present\": \"0.0.6\",\n \"style-attr\": \"^1.0.2\",\n \"three\": \"^0.76.1\",\n \"tween.js\": \"^15.0.0\",\n \"webvr-polyfill\": \"0.9.15\"\n },\n \"devDependencies\": {\n \"browserify\": \"^13.1.0\",\n \"browserify-css\": \"^0.8.2\",\n \"browserify-derequire\": \"^0.9.4\",\n \"browserify-istanbul\": \"^2.0.0\",\n \"budo\": \"^8.1.0\",\n \"chai\": \"^3.5.0\",\n \"chai-shallow-deep-equal\": \"^1.3.0\",\n \"codecov\": \"^1.0.1\",\n \"exorcist\": \"^0.4.0\",\n \"gh-pages\": \"^0.6.0\",\n \"husky\": \"^0.10.1\",\n \"istanbul\": \"^0.4.4\",\n \"karma\": \"^1.2.0\",\n \"karma-browserify\": \"^5.1.0\",\n \"karma-chai-shallow-deep-equal\": \"0.0.4\",\n \"karma-chrome-launcher\": \"^1.0.1\",\n \"karma-coverage\": \"^1.1.1\",\n \"karma-env-preprocessor\": \"^0.1.1\",\n \"karma-firefox-launcher\": \"^1.0.0\",\n \"karma-mocha\": \"^1.1.1\",\n \"karma-mocha-reporter\": \"^2.1.0\",\n \"karma-sinon-chai\": \"^1.2.3\",\n \"lolex\": \"^1.5.1\",\n \"minifyify\": \"^7.3.3\",\n \"mkdirp\": \"0.5.1\",\n \"mocha\": \"^3.0.2\",\n \"mozilla-download\": \"^1.0.5\",\n \"open\": \"0.0.5\",\n \"replace\": \"^0.3.0\",\n \"rimraf\": \"2.5.0\",\n \"semistandard\": \"^7.0.2\",\n \"sinon\": \"^1.17.5\",\n \"sinon-chai\": \"^2.8.0\",\n \"snazzy\": \"^3.0.0\",\n \"uglifyjs\": \"^2.4.10\"\n },\n \"link\": true,\n \"browserify\": {\n \"transform\": [\n \"browserify-css\"\n ]\n },\n \"semistandard\": {\n \"ignore\": [\n \"build/**\",\n \"dist/**\",\n \"examples/**/shaders/*.js\",\n \"**/vendor/**\"\n ]\n },\n \"keywords\": [\n \"3d\",\n \"aframe\",\n \"cardboard\",\n \"components\",\n \"oculus\",\n \"three\",\n \"three.js\",\n \"rift\",\n \"vive\",\n \"vr\",\n \"web-components\",\n \"webvr\"\n ],\n \"browserify-css\": {\n \"minify\": true\n },\n \"engines\": {\n \"node\": \">= 0.12.7\",\n \"npm\": \"^2.12.1\"\n }\n}\n", + "module.exports={\n \"name\": \"aframe\",\n \"version\": \"0.3.1\",\n \"description\": \"Building blocks for the VR Web\",\n \"homepage\": \"https://aframe.io/\",\n \"main\": \"dist/aframe.js\",\n \"scripts\": {\n \"browserify\": \"browserify src/index.js -s 'AFRAME' -p browserify-derequire\",\n \"build\": \"mkdirp build/ && npm run browserify -- --debug -o build/aframe.js\",\n \"codecov\": \"codecov\",\n \"dev\": \"npm run build && node ./scripts/budo\",\n \"dist\": \"npm run dist:min && npm run dist:max\",\n \"dist:max\": \"npm run browserify -s -- --debug | exorcist dist/aframe.js.map > dist/aframe.js\",\n \"dist:min\": \"npm run browserify -s -- --debug -p [minifyify --map aframe.min.js.map --output dist/aframe.min.js.map] -o dist/aframe.min.js\",\n \"dist:release\": \"npm run dist:release:min && npm run dist:release:max\",\n \"dist:release:max\": \"npm run browserify -s -- --debug | exorcist dist/aframe-v0.3.0.js.map > dist/aframe-v0.3.0.js\",\n \"dist:release:min\": \"npm run browserify -s -- --debug -p [minifyify --map aframe-v0.3.0.min.js.map --output dist/aframe-v0.3.0.min.js.map] -o dist/aframe-v0.3.0.min.js\",\n \"gh-pages\": \"npm run ghpages\",\n \"ghpages\": \"node ./scripts/gh-pages\",\n \"lint\": \"semistandard -v | snazzy\",\n \"precommit\": \"npm run lint\",\n \"preghpages\": \"npm run dist && rimraf gh-pages && mkdirp gh-pages && cp -r {.nojekyll,dist,lib,examples,index.html,style} gh-pages/. 2>/dev/null || : && git checkout dist/ && replace 'build/aframe.js' 'dist/aframe.min.js' gh-pages/ -r --silent\",\n \"release:bump\": \"npm run dist && git commit -am 'bump dist' && npm version patch --preminor\",\n \"release:push\": \"npm login && npm publish && git push --follow-tags\",\n \"start\": \"npm run dev\",\n \"test\": \"karma start ./tests/karma.conf.js\",\n \"test:firefox\": \"karma start ./tests/karma.conf.js --browsers Firefox\",\n \"test:chrome\": \"karma start ./tests/karma.conf.js --browsers Chrome\",\n \"test:ci\": \"TEST_ENV=ci karma start ./tests/karma.conf.js --single-run --browsers Firefox\",\n \"version\": \"npm run dist\"\n },\n \"repository\": \"aframevr/aframe\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"browserify-css\": \"^0.8.2\",\n \"debug\": \"^2.2.0\",\n \"deep-assign\": \"^2.0.0\",\n \"document-register-element\": \"dmarcos/document-register-element#8ccc532b7\",\n \"object-assign\": \"^4.0.1\",\n \"present\": \"0.0.6\",\n \"promise-polyfill\": \"^3.1.0\",\n \"style-attr\": \"^1.0.2\",\n \"three\": \"^0.76.1\",\n \"tween.js\": \"^15.0.0\",\n \"webvr-polyfill\": \"0.9.15\"\n },\n \"devDependencies\": {\n \"browserify\": \"^13.1.0\",\n \"browserify-derequire\": \"^0.9.4\",\n \"browserify-istanbul\": \"^2.0.0\",\n \"budo\": \"^8.1.0\",\n \"chai\": \"^3.5.0\",\n \"chai-shallow-deep-equal\": \"^1.3.0\",\n \"codecov\": \"^1.0.1\",\n \"exorcist\": \"^0.4.0\",\n \"gh-pages\": \"^0.6.0\",\n \"husky\": \"^0.10.1\",\n \"istanbul\": \"^0.4.4\",\n \"karma\": \"^1.2.0\",\n \"karma-browserify\": \"^5.1.0\",\n \"karma-chai-shallow-deep-equal\": \"0.0.4\",\n \"karma-chrome-launcher\": \"^1.0.1\",\n \"karma-coverage\": \"^1.1.1\",\n \"karma-env-preprocessor\": \"^0.1.1\",\n \"karma-firefox-launcher\": \"^1.0.0\",\n \"karma-mocha\": \"^1.1.1\",\n \"karma-mocha-reporter\": \"^2.1.0\",\n \"karma-sinon-chai\": \"^1.2.3\",\n \"lolex\": \"^1.5.1\",\n \"minifyify\": \"^7.3.3\",\n \"mkdirp\": \"0.5.1\",\n \"mocha\": \"^3.0.2\",\n \"mozilla-download\": \"^1.0.5\",\n \"open\": \"0.0.5\",\n \"replace\": \"^0.3.0\",\n \"rimraf\": \"2.5.0\",\n \"semistandard\": \"^7.0.2\",\n \"sinon\": \"^1.17.5\",\n \"sinon-chai\": \"^2.8.0\",\n \"snazzy\": \"^3.0.0\",\n \"uglifyjs\": \"^2.4.10\"\n },\n \"link\": true,\n \"browserify\": {\n \"transform\": [\n \"browserify-css\"\n ]\n },\n \"semistandard\": {\n \"ignore\": [\n \"build/**\",\n \"dist/**\",\n \"examples/**/shaders/*.js\",\n \"**/vendor/**\"\n ]\n },\n \"keywords\": [\n \"3d\",\n \"aframe\",\n \"cardboard\",\n \"components\",\n \"oculus\",\n \"three\",\n \"three.js\",\n \"rift\",\n \"vive\",\n \"vr\",\n \"web-components\",\n \"webvr\"\n ],\n \"browserify-css\": {\n \"minify\": true\n },\n \"engines\": {\n \"node\": \">= 0.12.7\",\n \"npm\": \"^2.12.1\"\n }\n}\n", "var registerComponent = require('../core/component').registerComponent;\r\nvar THREE = require('../lib/three');\r\n\r\n/**\r\n * Blend character model component.\r\n * Loads a model with skeletal animation blending.\r\n */\r\nmodule.exports.Component = registerComponent('blend-character-model', {\r\n schema: {type: 'src'},\r\n\r\n init: function () {\r\n this.model = null;\r\n },\r\n\r\n update: function () {\r\n var self = this;\r\n var el = this.el;\r\n var src = this.data;\r\n\r\n if (!src) { return; }\r\n\r\n this.remove();\r\n this.model = new THREE.BlendCharacter();\r\n\r\n this.model.load(src, function () {\r\n el.setObject3D('mesh', self.model);\r\n el.emit('model-loaded', {format: 'blend', model: self.model});\r\n self.model.castShadow = true;\r\n self.model.receiveShadow = true;\r\n self.model.material.shading = THREE.FlatShading;\r\n self.model.geometry.computeBoundingBox();\r\n });\r\n },\r\n\r\n remove: function () {\r\n if (!this.model) { return; }\r\n this.el.removeObject3D('mesh');\r\n }\r\n});\r\n", "var registerComponent = require('../core/component').registerComponent;\nvar THREE = require('../lib/three');\nvar utils = require('../utils/');\n\nvar checkHeadsetConnected = utils.checkHeadsetConnected;\n\n/**\n * Camera component.\n * Pairs along with camera system to handle tracking the active camera.\n */\nmodule.exports.Component = registerComponent('camera', {\n schema: {\n active: {default: true},\n far: {default: 10000},\n fov: {default: 80, min: 0},\n near: {default: 0.005, min: 0},\n userHeight: {default: 0, min: 0},\n zoom: {default: 1, min: 0}\n },\n\n /**\n * Initialize three.js camera and add it to the entity.\n * Add reference from scene to this entity as the camera.\n */\n init: function () {\n var camera;\n var el = this.el;\n var sceneEl = el.sceneEl;\n\n this.savedPose = null;\n\n // Create camera.\n camera = this.camera = new THREE.PerspectiveCamera();\n el.setObject3D('camera', camera);\n\n // Add listeners to save and restore camera pose if headset is present.\n this.onEnterVR = this.onEnterVR.bind(this);\n this.onExitVR = this.onExitVR.bind(this);\n sceneEl.addEventListener('enter-vr', this.onEnterVR);\n sceneEl.addEventListener('exit-vr', this.onExitVR);\n },\n\n /**\n * Update three.js camera.\n */\n update: function (oldData) {\n var el = this.el;\n var data = this.data;\n var camera = this.camera;\n var system = this.system;\n\n // Update height offset.\n this.addHeightOffset(oldData.userHeight);\n\n // Update properties.\n camera.aspect = data.aspect || (window.innerWidth / window.innerHeight);\n camera.far = data.far;\n camera.fov = data.fov;\n camera.near = data.near;\n camera.zoom = data.zoom;\n camera.updateProjectionMatrix();\n\n // Active property did not change.\n if (oldData && oldData.active === data.active) { return; }\n\n // If `active` property changes, or first update, handle active camera with system.\n if (data.active && system.activeCameraEl !== el) {\n // Camera enabled. Set camera to this camera.\n system.setActiveCamera(el);\n } else if (!data.active && system.activeCameraEl === el) {\n // Camera disabled. Set camera to another camera.\n system.disableActiveCamera();\n }\n },\n\n /**\n * Remove camera on remove (callback).\n */\n remove: function () {\n var sceneEl = this.el.sceneEl;\n this.el.removeObject3D('camera');\n sceneEl.removeEventListener('enter-vr', this.onEnterVR);\n sceneEl.removeEventListener('exit-vr', this.onExitVR);\n },\n\n /**\n * Save pose and remove the offset.\n */\n onEnterVR: function () {\n this.saveCameraPose();\n this.removeHeightOffset();\n },\n\n /**\n * Restore the pose. Do not need to re-add the offset because it was saved on entering VR.\n */\n onExitVR: function () {\n this.restoreCameraPose();\n },\n\n /**\n * Offsets the position of the camera to set a human scale perspective\n * This offset is not necessary when using a headset because the SDK\n * will return the real user's head height and position.\n */\n addHeightOffset: function (oldOffset) {\n var el = this.el;\n var currentPosition;\n var userHeightOffset = this.data.userHeight;\n\n oldOffset = oldOffset || 0;\n currentPosition = el.getComputedAttribute('position') || {x: 0, y: 0, z: 0};\n el.setAttribute('position', {\n x: currentPosition.x,\n y: currentPosition.y - oldOffset + userHeightOffset,\n z: currentPosition.z\n });\n },\n\n /**\n * Remove the height offset (called when entering VR) since WebVR API gives absolute\n * position.\n * Does not apply for mobile.\n */\n removeHeightOffset: function () {\n var currentPosition;\n var el = this.el;\n var headsetConnected;\n var sceneEl = el.sceneEl;\n var userHeightOffset = this.data.userHeight;\n\n // If there's not a headset connected we keep the offset.\n // Necessary for fullscreen mode with no headset.\n // Checking this.headsetConnected to make the value injectable for unit tests.\n headsetConnected = this.headsetConnected || checkHeadsetConnected();\n if (sceneEl.isMobile || !userHeightOffset || !headsetConnected) { return; }\n\n currentPosition = el.getAttribute('position') || {x: 0, y: 0, z: 0};\n el.setAttribute('position', {\n x: currentPosition.x,\n y: currentPosition.y - userHeightOffset,\n z: currentPosition.z\n });\n },\n\n /**\n * Save camera pose before entering VR to restore later if exiting.\n */\n saveCameraPose: function () {\n var el = this.el;\n var headsetConnected = this.headsetConnected || checkHeadsetConnected();\n\n if (this.savedPose || !headsetConnected) { return; }\n\n this.savedPose = {\n position: el.getAttribute('position'),\n rotation: el.getAttribute('rotation')\n };\n },\n\n /**\n * Reset camera pose to before entering VR.\n */\n restoreCameraPose: function () {\n var el = this.el;\n var savedPose = this.savedPose;\n var headsetConnected = this.headsetConnected || checkHeadsetConnected();\n\n if (!savedPose || !headsetConnected) { return; }\n\n // Reset camera orientation.\n el.setAttribute('position', savedPose.position);\n el.setAttribute('rotation', savedPose.rotation);\n this.savedPose = null;\n }\n});\n", "var registerComponent = require('../core/component').registerComponent;\nvar THREE = require('../lib/three');\n\nmodule.exports.Component = registerComponent('collada-model', {\n schema: {\n type: 'src'\n },\n\n init: function () {\n this.model = null;\n this.loader = new THREE.ColladaLoader();\n this.loader.options.convertUpAxis = true;\n },\n\n update: function () {\n var self = this;\n var el = this.el;\n var src = this.data;\n\n if (!src) { return; }\n\n this.remove();\n\n this.loader.load(src, function (colladaModel) {\n self.model = colladaModel.scene;\n el.setObject3D('mesh', self.model);\n el.emit('model-loaded', {format: 'collada', model: self.model});\n });\n },\n\n remove: function () {\n if (!this.model) { return; }\n this.el.removeObject3D('mesh');\n }\n});\n", diff --git a/dist/aframe.min.js b/dist/aframe.min.js index 784fc6ab511..478055facfb 100644 --- a/dist/aframe.min.js +++ b/dist/aframe.min.js @@ -62,7 +62,7 @@ var t=r.style;t.float="right",t.fontWeight=600,t.textTransform="uppercase",t.bor }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],20:[function(_dereq_,module,exports){ -module.exports={"name":"aframe","version":"0.3.0","description":"Building blocks for the VR Web","homepage":"https://aframe.io/","main":"dist/aframe.js","scripts":{"browserify":"browserify src/index.js -s 'AFRAME' -p browserify-derequire","build":"mkdirp build/ && npm run browserify -- --debug -o build/aframe.js","codecov":"codecov","dev":"npm run build && node ./scripts/budo","dist":"npm run dist:min && npm run dist:max","dist:max":"npm run browserify -s -- --debug | exorcist dist/aframe.js.map > dist/aframe.js","dist:min":"npm run browserify -s -- --debug -p [minifyify --map aframe.min.js.map --output dist/aframe.min.js.map] -o dist/aframe.min.js","dist:release":"npm run dist:release:min && npm run dist:release:max","dist:release:max":"npm run browserify -s -- --debug | exorcist dist/aframe-v0.3.0.js.map > dist/aframe-v0.3.0.js","dist:release:min":"npm run browserify -s -- --debug -p [minifyify --map aframe-v0.3.0.min.js.map --output dist/aframe-v0.3.0.min.js.map] -o dist/aframe-v0.3.0.min.js","gh-pages":"npm run ghpages","ghpages":"node ./scripts/gh-pages","lint":"semistandard -v | snazzy","precommit":"npm run lint","preghpages":"npm run dist && rimraf gh-pages && mkdirp gh-pages && cp -r {.nojekyll,dist,lib,examples,index.html,style} gh-pages/. 2>/dev/null || : && git checkout dist/ && replace 'build/aframe.js' 'dist/aframe.min.js' gh-pages/ -r --silent","release:bump":"npm run dist && git commit -am 'bump dist' && npm version patch --preminor","release:push":"npm login && npm publish && git push --follow-tags","start":"npm run dev","test":"karma start ./tests/karma.conf.js","test:firefox":"karma start ./tests/karma.conf.js --browsers Firefox","test:chrome":"karma start ./tests/karma.conf.js --browsers Chrome","test:ci":"TEST_ENV=ci karma start ./tests/karma.conf.js --single-run --browsers Firefox","version":"npm run dist"},"repository":"aframevr/aframe","license":"MIT","dependencies":{"debug":"^2.2.0","deep-assign":"^2.0.0","document-register-element":"dmarcos/document-register-element#8ccc532b7","promise-polyfill":"^3.1.0","object-assign":"^4.0.1","present":"0.0.6","style-attr":"^1.0.2","three":"^0.76.1","tween.js":"^15.0.0","webvr-polyfill":"0.9.15"},"devDependencies":{"browserify":"^13.1.0","browserify-css":"^0.8.2","browserify-derequire":"^0.9.4","browserify-istanbul":"^2.0.0","budo":"^8.1.0","chai":"^3.5.0","chai-shallow-deep-equal":"^1.3.0","codecov":"^1.0.1","exorcist":"^0.4.0","gh-pages":"^0.6.0","husky":"^0.10.1","istanbul":"^0.4.4","karma":"^1.2.0","karma-browserify":"^5.1.0","karma-chai-shallow-deep-equal":"0.0.4","karma-chrome-launcher":"^1.0.1","karma-coverage":"^1.1.1","karma-env-preprocessor":"^0.1.1","karma-firefox-launcher":"^1.0.0","karma-mocha":"^1.1.1","karma-mocha-reporter":"^2.1.0","karma-sinon-chai":"^1.2.3","lolex":"^1.5.1","minifyify":"^7.3.3","mkdirp":"0.5.1","mocha":"^3.0.2","mozilla-download":"^1.0.5","open":"0.0.5","replace":"^0.3.0","rimraf":"2.5.0","semistandard":"^7.0.2","sinon":"^1.17.5","sinon-chai":"^2.8.0","snazzy":"^3.0.0","uglifyjs":"^2.4.10"},"link":true,"browserify":{"transform":["browserify-css"]},"semistandard":{"ignore":["build/**","dist/**","examples/**/shaders/*.js","**/vendor/**"]},"keywords":["3d","aframe","cardboard","components","oculus","three","three.js","rift","vive","vr","web-components","webvr"],"browserify-css":{"minify":true},"engines":{"node":">= 0.12.7","npm":"^2.12.1"}} +module.exports={"name":"aframe","version":"0.3.1","description":"Building blocks for the VR Web","homepage":"https://aframe.io/","main":"dist/aframe.js","scripts":{"browserify":"browserify src/index.js -s 'AFRAME' -p browserify-derequire","build":"mkdirp build/ && npm run browserify -- --debug -o build/aframe.js","codecov":"codecov","dev":"npm run build && node ./scripts/budo","dist":"npm run dist:min && npm run dist:max","dist:max":"npm run browserify -s -- --debug | exorcist dist/aframe.js.map > dist/aframe.js","dist:min":"npm run browserify -s -- --debug -p [minifyify --map aframe.min.js.map --output dist/aframe.min.js.map] -o dist/aframe.min.js","dist:release":"npm run dist:release:min && npm run dist:release:max","dist:release:max":"npm run browserify -s -- --debug | exorcist dist/aframe-v0.3.0.js.map > dist/aframe-v0.3.0.js","dist:release:min":"npm run browserify -s -- --debug -p [minifyify --map aframe-v0.3.0.min.js.map --output dist/aframe-v0.3.0.min.js.map] -o dist/aframe-v0.3.0.min.js","gh-pages":"npm run ghpages","ghpages":"node ./scripts/gh-pages","lint":"semistandard -v | snazzy","precommit":"npm run lint","preghpages":"npm run dist && rimraf gh-pages && mkdirp gh-pages && cp -r {.nojekyll,dist,lib,examples,index.html,style} gh-pages/. 2>/dev/null || : && git checkout dist/ && replace 'build/aframe.js' 'dist/aframe.min.js' gh-pages/ -r --silent","release:bump":"npm run dist && git commit -am 'bump dist' && npm version patch --preminor","release:push":"npm login && npm publish && git push --follow-tags","start":"npm run dev","test":"karma start ./tests/karma.conf.js","test:firefox":"karma start ./tests/karma.conf.js --browsers Firefox","test:chrome":"karma start ./tests/karma.conf.js --browsers Chrome","test:ci":"TEST_ENV=ci karma start ./tests/karma.conf.js --single-run --browsers Firefox","version":"npm run dist"},"repository":"aframevr/aframe","license":"MIT","dependencies":{"browserify-css":"^0.8.2","debug":"^2.2.0","deep-assign":"^2.0.0","document-register-element":"dmarcos/document-register-element#8ccc532b7","object-assign":"^4.0.1","present":"0.0.6","promise-polyfill":"^3.1.0","style-attr":"^1.0.2","three":"^0.76.1","tween.js":"^15.0.0","webvr-polyfill":"0.9.15"},"devDependencies":{"browserify":"^13.1.0","browserify-derequire":"^0.9.4","browserify-istanbul":"^2.0.0","budo":"^8.1.0","chai":"^3.5.0","chai-shallow-deep-equal":"^1.3.0","codecov":"^1.0.1","exorcist":"^0.4.0","gh-pages":"^0.6.0","husky":"^0.10.1","istanbul":"^0.4.4","karma":"^1.2.0","karma-browserify":"^5.1.0","karma-chai-shallow-deep-equal":"0.0.4","karma-chrome-launcher":"^1.0.1","karma-coverage":"^1.1.1","karma-env-preprocessor":"^0.1.1","karma-firefox-launcher":"^1.0.0","karma-mocha":"^1.1.1","karma-mocha-reporter":"^2.1.0","karma-sinon-chai":"^1.2.3","lolex":"^1.5.1","minifyify":"^7.3.3","mkdirp":"0.5.1","mocha":"^3.0.2","mozilla-download":"^1.0.5","open":"0.0.5","replace":"^0.3.0","rimraf":"2.5.0","semistandard":"^7.0.2","sinon":"^1.17.5","sinon-chai":"^2.8.0","snazzy":"^3.0.0","uglifyjs":"^2.4.10"},"link":true,"browserify":{"transform":["browserify-css"]},"semistandard":{"ignore":["build/**","dist/**","examples/**/shaders/*.js","**/vendor/**"]},"keywords":["3d","aframe","cardboard","components","oculus","three","three.js","rift","vive","vr","web-components","webvr"],"browserify-css":{"minify":true},"engines":{"node":">= 0.12.7","npm":"^2.12.1"}} },{}],21:[function(_dereq_,module,exports){ var registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three");module.exports.Component=registerComponent("blend-character-model",{schema:{type:"src"},init:function(){this.model=null},update:function(){var e=this,o=this.el,t=this.data;t&&(this.remove(),this.model=new THREE.BlendCharacter,this.model.load(t,function(){o.setObject3D("mesh",e.model),o.emit("model-loaded",{format:"blend",model:e.model}),e.model.castShadow=!0,e.model.receiveShadow=!0,e.model.material.shading=THREE.FlatShading,e.model.geometry.computeBoundingBox()}))},remove:function(){this.model&&this.el.removeObject3D("mesh")}}); },{"../core/component":59,"../lib/three":103}],22:[function(_dereq_,module,exports){ diff --git a/dist/aframe.min.js.map b/dist/aframe.min.js.map index 20bfe089328..3e12b769915 100644 --- a/dist/aframe.min.js.map +++ b/dist/aframe.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","package.json","src/style/aframe.css","src/style/rStats.css","src/index.js","node_modules/promise-polyfill/Promise.js","node_modules/present/lib/present-browser.js","node_modules/tween.js/src/Tween.js","src/core/component.js","src/core/shader.js","src/core/geometry.js","src/core/system.js","src/lib/three.js","src/components/index.js","src/geometries/index.js","src/shaders/index.js","src/systems/index.js","src/core/a-node.js","src/core/a-animation.js","src/core/a-entity.js","src/core/a-assets.js","src/core/a-cubemap.js","src/core/a-mixin.js","src/core/a-register-element.js","src/core/schema.js","node_modules/webvr-polyfill/build/webvr-polyfill.js","src/utils/index.js","src/core/scene/a-scene.js","src/extras/primitives/primitives.js","src/extras/primitives/getMeshMixin.js","src/extras/declarative-events/index.js","src/extras/primitives/index.js","src/extras/components/index.js","vendor/VRControls.js","vendor/VREffect.js","src/geometries/box.js","src/geometries/circle.js","src/geometries/cone.js","src/geometries/dodecahedron.js","src/geometries/cylinder.js","src/geometries/icosahedron.js","src/geometries/octahedron.js","src/geometries/plane.js","src/geometries/ring.js","src/geometries/sphere.js","src/geometries/tetrahedron.js","src/geometries/torus.js","src/geometries/torusKnot.js","src/components/blend-character-model.js","src/components/camera.js","src/components/collada-model.js","src/components/cursor.js","src/components/geometry.js","src/components/hand-controls.js","src/components/light.js","src/components/look-at.js","src/components/look-controls.js","src/components/material.js","src/components/position.js","src/components/obj-model.js","src/components/raycaster.js","src/components/rotation.js","src/components/scale.js","src/components/sound.js","src/components/tracked-controls.js","src/components/visible.js","src/components/vive-controls.js","src/components/wasd-controls.js","src/shaders/flat.js","src/shaders/standard.js","src/systems/camera.js","src/systems/geometry.js","src/systems/light.js","src/systems/material.js","src/systems/tracked-controls.js","src/constants/animation.js","src/utils/debug.js","src/core/propertyTypes.js","src/utils/coordinates.js","src/utils/checkHeadsetConnected.js","src/utils/entity.js","src/utils/forceCanvasResizeSafariMobile.js","src/utils/material.js","src/utils/styleParser.js","src/utils/src-loader.js","node_modules/browserify-css/browser.js","src/components/scene/canvas.js","src/components/scene/debug.js","src/components/scene/embedded.js","src/components/scene/inspector.js","src/components/scene/fog.js","src/components/scene/keyboard-shortcuts.js","src/components/scene/vr-mode-ui.js","src/components/scene/stats.js","node_modules/document-register-element/build/document-register-element.js","node_modules/object-assign/index.js","node_modules/deep-assign/index.js","src/core/scene/wakelock.js","src/core/scene/postMessage.js","src/core/scene/metaTags.js","src/extras/components/pivot.js","node_modules/three/three.js","node_modules/browserify/node_modules/process/browser.js","src/extras/primitives/primitives/a-camera.js","src/extras/primitives/primitives/a-collada-model.js","src/extras/primitives/primitives/a-cursor.js","src/extras/primitives/primitives/a-image.js","src/extras/primitives/primitives/a-curvedimage.js","src/extras/primitives/primitives/a-light.js","src/extras/primitives/primitives/a-obj-model.js","src/extras/primitives/primitives/a-sky.js","src/extras/primitives/primitives/a-sound.js","src/extras/primitives/primitives/a-video.js","src/extras/primitives/primitives/a-videosphere.js","src/extras/primitives/primitives/meshPrimitives.js","vendor/rStats.js","vendor/rStats.extras.js","node_modules/deep-assign/node_modules/is-obj/index.js","src/constants/index.js","node_modules/debug/browser.js","src/lib/rStatsAframe.js","node_modules/three/examples/js/BlendCharacter.js","node_modules/style-attr/index.js","vendor/wakelock/wakelock.js","node_modules/three/examples/js/loaders/OBJLoader.js","node_modules/three/examples/js/loaders/MTLLoader.js","node_modules/debug/debug.js","node_modules/three/examples/js/loaders/ColladaLoader.js","vendor/wakelock/util.js","node_modules/debug/node_modules/ms/index.js"],"names":["window","Promise","require","hasNativeWebVRImplementation","navigator","getVRDisplays","getVRDevices","WebVRConfig","BUFFER_SCALE","CARDBOARD_UI_DISABLED","ROTATE_INSTRUCTIONS_DISABLED","TOUCH_PANNER_DISABLED","MOUSE_KEYBOARD_CONTROLS_DISABLED","test","userAgent","devicePixelRatio","AScene","components","registerComponent","registerGeometry","registerPrimitive","registerShader","registerSystem","shaders","systems","THREE","TWEEN","pkg","utils","ANode","AEntity","console","log","version","dependencies","module","exports","AFRAME","geometries","registerElement","primitives","getMeshMixin","schema","root","bind","fn","thisArg","apply","arguments","this","TypeError","_state","_value","_deferreds","doResolve","resolve","reject","handle","deferred","me","push","asap","cb","onFulfilled","onRejected","ret","e","newValue","then","finale","call","i","len","length","Handler","done","value","reason","ex","setTimeoutFunc","setTimeout","setImmediate","isArray","Array","Object","prototype","toString","all","args","slice","res","val","remaining","constructor","race","values","_setImmediateFn","performance","global","present","names","name","shift","dateNow","Date","now","getTime","navigationStart","timing","performanceNow","noConflict","conflict","offset","_tweens","REVISION","getAll","removeAll","add","tween","remove","indexOf","splice","update","time","undefined","Tween","object","_object","_valuesStart","_valuesEnd","_valuesStartRepeat","_duration","_repeat","_yoyo","_isPlaying","_reversed","_delayTime","_startTime","_easingFunction","Easing","Linear","None","_interpolationFunction","Interpolation","_chainedTweens","_onStartCallback","_onStartCallbackFired","_onUpdateCallback","_onCompleteCallback","_onStopCallback","field","parseFloat","to","properties","duration","start","property","concat","stop","stopChainedTweens","numChainedTweens","delay","amount","repeat","times","yoyo","easing","interpolation","chain","onStart","callback","onUpdate","onComplete","onStop","elapsed","end","isFinite","tmp","k","Quadratic","In","Out","InOut","Cubic","Quartic","Quintic","Sinusoidal","Math","cos","PI","sin","Exponential","pow","Circular","sqrt","Elastic","s","a","p","asin","Back","Bounce","v","m","f","floor","Utils","Bezier","b","n","pw","bn","Bernstein","CatmullRom","p0","p1","t","fc","Factorial","p2","p3","v0","v1","t2","t3","define","amd","buildData","el","elData","silent","handleMixinUpdate","mixinEl","mixinData","getAttribute","data","extendProperties","isSinglePropSchema","componentDefined","isSingleProp","mixinEls","default","keys","forEach","key","parseProperty","parseProperties","dest","source","extend","wrapPause","pauseMethod","sceneEl","isPlaying","tick","removeBehavior","wrapPlay","playMethod","shouldPlay","initialized","addBehavior","processSchema","process","isSingleProperty","stringifyProperties","stringifyProperty","styleParser","Component","attr","id","attrName","updateCachedAttrValue","init","prevData","updateSchema","play","pause","parse","stringify","getData","attrValue","parseAttrValueForCache","parsedValue","flushToDOM","HTMLElement","setAttribute","updateProperties","oldData","deepEqual","emit","newData","extendSchema","schemaAddon","extendedSchema","component","definition","NewComponent","proto","Error","writable","hasLoaded","create","system","multiple","type","shaderNames","propertyToThreeMapping","number","vec4","vec3","vec2","color","Shader","vertexShader","fragmentShader","attributes","initVariables","uniforms","material","ShaderMaterial","is","varType","varValue","variables","self","parseValue","schemaKeys","updateVariables","processData","needsUpdate","dataKeys","Vector2","x","y","Vector3","z","Vector4","w","Color","r","g","NewShader","geometryNames","Geometry","geometry","NewGeometry","System","rawData","NewSystem","scenes","findAllScenes","document","initSystem","TextureLoader","crossOrigin","ImageLoader","Cache","enabled","ColladaLoader","MTLLoader","OBJLoader","createdCallback","isNode","mixinObservers","debug","attachedCallback","mixins","closestScene","updateMixins","attributeChangedCallback","oldVal","newVal","element","isScene","parentElement","closest","selector","matches","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","detachedCallback","load","childFilter","children","childrenLoaded","getChildren","filter","map","child","addEventListener","newMixins","oldMixins","newMixinsIds","split","oldMixinsIds","diff","unregisterMixin","registerMixin","mixinId","querySelector","attachMixinListener","removeMixinListener","observer","disconnect","currentObserver","MutationObserver","mutations","attributeName","config","observe","detail","bubbles","eventName","fireEvent","emitter","cloneValue","getAnimationValues","attribute","dataFrom","dataTo","currentValue","isColor","componentName","attributeSplit","propertyName","getForComponentAttribute","componentPropName","from","getComponentProperty","partialSetAttribute","getForCoordinateComponent","coordinates","getForBoolean","strToBool","boolToNum","getForColorComponent","rgbVectorToHex","getForNumber","isCoordinate","isNaN","str","bool","componentToHex","hex","convertToIntegerColor","min","abs","prop","join","animationConstants","entity","DEFAULTS","defaults","DIRECTIONS","directions","EASING_FUNCTIONS","easingFunctions","FILLS","fills","REPEATS","repeats","AAnimation","bindMethods","isRunning","parentNode","getTween","animationValues","toTemp","parseInt","direction","getDirection","fill","indefinite","Infinity","initialValue","count","forwards","alternate","alternateReverse","reverse","backwards","both","dur","onCompleted","warn","begin","evt","removeEventListeners","addEventListeners","none","prevDirection","normal","onStateAdded","onStateRemoved","evts","splitString","removeEventListener","state","getElData","checkComponentDefined","defaultComponents","isComponentMixedIn","getMixedInComponents","entityEl","addComponent","componentCache","inMixin","hasAttribute","MULTIPLE_COMPONENT_DELIMITER","position","rotation","scale","visible","isEntity","object3D","Group","object3DMap","parentEl","states","justInitialized","setEntityAttribute","assetsEl","addToParent","removeComponent","updateComponent","updateComponents","mapStateMixins","op","mixinIds","updateStateMixins","stateMixinsEls","querySelectorAll","getObject3D","setObject3D","obj","oldObj","Object3D","traverse","removeObject3D","getOrCreateObject3D","Constructor","attachedToParent","entityLoadCallback","getChildEntities","childEntities","initComponent","isDependency","componentInfo","componentId","isComponentDefined","initComponentDependencies","isDefault","isMixedIn","elComponents","updateComponentProperty","propertyValue","componentObj","removeAttribute","componentKeys","mixinUpdate","componentPropValue","isDebugMode","recursive","updateDOMAtrribute","getComputedAttribute","addState","removeState","stateIndex","mediaElementLoaded","checkProgress","secondsBuffered","buffered","readyState","error","setCrossOrigin","mediaEl","newMediaEl","src","extractDomain","location","host","cloneNode","appendChild","removeChild","url","domain","xhrLoader","XHRLoader","isAssets","mediaEls","imgEl","imgEls","timeout","loaded","onload","onerror","isAssetItem","textResponse","files","srcs","validate","elements","cacheAttribute","cacheAttributes","updateEntities","entities","addTagName","tagName","knownTags","toLowerCase","wrapANodeMethods","newObj","ANodeMethods","wrapMethods","copyProperties","wrapAEntityMethods","AEntityMethods","targetObj","methodList","derivedObj","baseObj","methodName","wrapMethod","derivedMethod","baseMethod","destination","props","getOwnPropertyNames","desc","getOwnPropertyDescriptor","node","getPrototypeOf","isANode","isAEntity","processPropertyDefinition","propDefinition","propType","defaultVal","typeName","propertyTypes","JSON","propName","propData","getPartialData","propNames","propValue","stringifiedData","o","u","code","l","1","_dereq_","lib$es6$promise$utils$$objectOrFunction","lib$es6$promise$utils$$isFunction","lib$es6$promise$asap$$setScheduler","scheduleFn","lib$es6$promise$asap$$customSchedulerFn","lib$es6$promise$asap$$setAsap","asapFn","lib$es6$promise$asap$$asap","lib$es6$promise$asap$$useNextTick","nextTick","lib$es6$promise$asap$$flush","lib$es6$promise$asap$$useVertxTimer","lib$es6$promise$asap$$vertxNext","lib$es6$promise$asap$$useMutationObserver","iterations","lib$es6$promise$asap$$BrowserMutationObserver","createTextNode","characterData","lib$es6$promise$asap$$useMessageChannel","channel","MessageChannel","port1","onmessage","port2","postMessage","lib$es6$promise$asap$$useSetTimeout","lib$es6$promise$asap$$len","lib$es6$promise$asap$$queue","arg","lib$es6$promise$asap$$attemptVertx","vertx","runOnLoop","runOnContext","lib$es6$promise$then$$then","onFulfillment","onRejection","parent","lib$es6$promise$$internal$$FULFILLED","lib$es6$promise$$internal$$REJECTED","lib$es6$promise$$internal$$noop","result","_result","lib$es6$promise$$internal$$invokeCallback","lib$es6$promise$$internal$$subscribe","lib$es6$promise$promise$resolve$$resolve","promise","lib$es6$promise$$internal$$resolve","lib$es6$promise$$internal$$selfFulfillment","lib$es6$promise$$internal$$cannotReturnOwn","lib$es6$promise$$internal$$getThen","lib$es6$promise$$internal$$GET_THEN_ERROR","lib$es6$promise$$internal$$tryThen","fulfillmentHandler","rejectionHandler","lib$es6$promise$$internal$$handleForeignThenable","thenable","sealed","lib$es6$promise$$internal$$fulfill","lib$es6$promise$$internal$$reject","_label","lib$es6$promise$$internal$$handleOwnThenable","lib$es6$promise$$internal$$handleMaybeThenable","maybeThenable","lib$es6$promise$then$$default","lib$es6$promise$promise$resolve$$default","lib$es6$promise$$internal$$publishRejection","_onerror","lib$es6$promise$$internal$$publish","lib$es6$promise$$internal$$PENDING","_subscribers","subscribers","settled","lib$es6$promise$$internal$$ErrorObject","lib$es6$promise$$internal$$tryCatch","lib$es6$promise$$internal$$TRY_CATCH_ERROR","succeeded","failed","hasCallback","lib$es6$promise$$internal$$initializePromise","resolver","lib$es6$promise$promise$all$$all","entries","lib$es6$promise$enumerator$$default","lib$es6$promise$promise$race$$race","lib$es6$promise$utils$$isArray","lib$es6$promise$promise$reject$$reject","lib$es6$promise$promise$$needsResolver","lib$es6$promise$promise$$needsNew","lib$es6$promise$promise$$Promise","_id","lib$es6$promise$promise$$counter","lib$es6$promise$enumerator$$Enumerator","input","_instanceConstructor","_input","_remaining","_enumerate","_validationError","lib$es6$promise$polyfill$$polyfill","local","Function","P","cast","lib$es6$promise$promise$$default","lib$es6$promise$utils$$_isArray","lib$es6$promise$asap$$scheduleFlush","lib$es6$promise$asap$$browserWindow","lib$es6$promise$asap$$browserGlobal","WebKitMutationObserver","lib$es6$promise$asap$$isNode","lib$es6$promise$asap$$isWorker","Uint8ClampedArray","importScripts","lib$es6$promise$promise$all$$default","lib$es6$promise$promise$race$$default","lib$es6$promise$promise$reject$$default","_setScheduler","_setAsap","_asap","catch","_eachEntry","entry","c","_settledAt","_willSettleAt","enumerator","lib$es6$promise$polyfill$$default","lib$es6$promise$umd$$ES6Promise","polyfill","_process","2","toObject","hasOwnProperty","propIsEnumerable","propertyIsEnumerable","assign","target","symbols","getOwnPropertySymbols","3","cleanUpNextTick","draining","currentQueue","queue","queueIndex","drainQueue","run","clearTimeout","Item","fun","array","noop","title","browser","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","binding","cwd","chdir","dir","umask","4","VRDisplay","isPolyfilled","displayId","nextDisplayId","displayName","isConnected","isPresenting","capabilities","hasPosition","hasOrientation","hasExternalDisplay","canPresent","maxLayers","stageParameters","waitingForPresent_","layer_","fullscreenElement_","fullscreenWrapper_","fullscreenElementCachedStyle_","fullscreenEventTarget_","fullscreenChangeHandler_","fullscreenErrorHandler_","wakelock_","WakeLock","VRDevice","hardwareUnitId","deviceId","deviceName","HMDVRDevice","PositionSensorVRDevice","Util","hasShowDeprecationWarning","getPose","getImmediatePose","requestAnimationFrame","cancelAnimationFrame","wrapForFullscreen","applyFullscreenElementStyle","cssProperties","max","screen","width","height","isIOS","createElement","classList","removeFullscreenWrapper","insertBefore","firstChild","requestPresent","layers","onFullscreenChange","actualFullscreenElement","getFullscreenElement","fullscreenElement","orientation","lock","beginPresent_","unlock","release","endPresent_","removeFullscreenListeners_","fireVRDisplayPresentChange_","onFullscreenError","addFullscreenListeners_","requestFullscreen","request","exitFullscreen","exitPresent","wasPresenting","getLayers","event","CustomEvent","vrdisplay","dispatchEvent","changeHandler","errorHandler","submitFrame","pose","getEyeParameters","whichEye","./util.js","./wakelock.js","5","CardboardDistorter","gl","ctxAttribs","getContextAttributes","meshWidth","meshHeight","bufferScale","bufferWidth","drawingBufferWidth","bufferHeight","drawingBufferHeight","realBindFramebuffer","bindFramebuffer","realEnable","enable","realDisable","disable","realColorMask","colorMask","realClearColor","clearColor","realViewport","viewport","realCanvasWidth","canvas","__proto__","realCanvasHeight","isPatched","lastBoundFramebuffer","cullFace","depthTest","blend","scissorTest","stencilTest","attribs","texCoord","program","linkProgram","distortionVS","distortionFS","getProgramUniforms","viewportOffsetScale","Float32Array","setTextureBounds","vertexBuffer","createBuffer","indexBuffer","indexCount","renderTarget","createTexture","framebuffer","createFramebuffer","depthStencilBuffer","depthBuffer","stencilBuffer","depth","stencil","createRenderbuffer","patch","onResize","cardboardUI","CardboardUI","WGLUPreserveGLState","destroy","unpatch","deleteProgram","deleteBuffer","deleteTexture","deleteFramebuffer","deleteRenderbuffer","glState","RENDERBUFFER_BINDING","TEXTURE_BINDING_2D","TEXTURE0","FRAMEBUFFER","SCISSOR_TEST","clear","COLOR_BUFFER_BIT","bindTexture","TEXTURE_2D","texImage2D","alpha","RGBA","RGB","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","framebufferTexture2D","COLOR_ATTACHMENT0","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","DEPTH_STENCIL","framebufferRenderbuffer","DEPTH_STENCIL_ATTACHMENT","DEPTH_COMPONENT16","DEPTH_ATTACHMENT","STENCIL_INDEX8","STENCIL_ATTACHMENT","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","getScreenWidth","getScreenHeight","defineProperty","configurable","enumerable","get","set","getParameter","FRAMEBUFFER_BINDING","CULL_FACE","DEPTH_TEST","BLEND","STENCIL_TEST","pname","COLOR_WRITEMASK","COLOR_CLEAR_VALUE","VIEWPORT","h","safariCssSizeWorkaround","leftBounds","rightBounds","DIRTY_SUBMIT_FRAME_BINDINGS","CURRENT_PROGRAM","ARRAY_BUFFER_BINDING","ELEMENT_ARRAY_BUFFER_BINDING","useProgram","bindBuffer","ELEMENT_ARRAY_BUFFER","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","activeTexture","uniform1i","diffuse","uniform4fv","drawElements","TRIANGLES","UNSIGNED_SHORT","renderNoState","preserveDrawingBuffer","updateDeviceInfo","deviceInfo","vertices","computeMeshVertices_","bufferData","STATIC_DRAW","indices","computeMeshIndices_","lensFrustum","getLeftEyeVisibleTanAngles","noLensFrustum","getLeftEyeNoLensTanAngles","getLeftEyeVisibleScreenRect","vidx","j","lerp","d","distortion","distortInverse","q","device","widthMeters","heightMeters","Uint16Array","halfwidth","halfheight","iidx","getOwnPropertyDescriptor_","descriptor","./cardboard-ui.js","./deps/wglu-preserve-state.js","6","uiVS","uiFS","gearOffset","gearVertexCount","arrowOffset","arrowVertexCount","projMat","listener","DEG2RAD","kAnglePerGearSection","kOuterRimEndAngle","kInnerRimBeginAngle","kOuterRadius","kMiddleRadius","kInnerRadius","kCenterLineThicknessDp","kButtonWidthDp","kTouchSlopFactor","listen","optionsCallback","backCallback","midline","clientWidth","buttonSize","clientX","clientY","clientHeight","addGearSegment","theta","angle","buttonScale","addArrowVertex","buttonBorder","dps","lineWidth","segmentTheta","angledLineWidth","render","uniform4f","orthoMatrix","uniformMatrix4fv","projectionMat","drawArrays","TRIANGLE_STRIP","7","CardboardVRDisplay","bufferScale_","poseSensor_","FusionPoseSensor","distorter_","cardboardUI_","dpdb_","Dpdb","onDeviceParamsUpdated_","deviceInfo_","DeviceInfo","getDeviceParams","viewerSelector_","ViewerSelector","onViewerChanged_","setViewer","getCurrentViewer","rotateInstructions_","RotateInstructions","onResize_","Eye","LEFT","RIGHT","getPosition","getOrientation","linearVelocity","linearAcceleration","angularVelocity","angularAcceleration","resetPose","fieldOfView","viewer","interLensDistance","getFieldOfViewLeftEye","getFieldOfViewRightEye","renderWidth","renderHeight","newParams","updateDeviceParams","distorter","getContext","predistorted","show","stopPropagation","preventDefault","isLandscapeMode","isMobile","showTemporarily","orientationHandler","onOrientationChange_","fireVRDisplayDeviceParamsChange_","hide","lastWidth","lastHeight","./base.js","./cardboard-distorter.js","./device-info.js","./dpdb/dpdb.js","./rotate-instructions.js","./sensor-fusion/fusion-pose-sensor.js","./viewer-selector.js","8","bindings","boundValues","TEXTURE_BINDING_CUBE_MAP","textureUnit","TEXTURE31","ACTIVE_TEXTURE","boundValue","TEXTURE_CUBE_MAP","9","Device","params","bevelMeters","deviceParams","Viewers","CardboardV2","Distortion","distortionCoefficients","CardboardViewer","label","fov","baselineLensDistance","screenLensDistance","inverseCoefficients","MathUtil","DEFAULT_ANDROID","DEFAULT_IOS","CardboardV1","determineDevice_","getDevice","METERS_PER_INCH","metersPerPixelX","xdpi","metersPerPixelY","ydpi","bevelMm","getDistortedFieldOfViewLeftEye","eyeToScreenDistance","outerDist","innerDist","bottomDist","topDist","outerAngle","radToDeg","atan","distort","innerAngle","bottomAngle","topAngle","leftDegrees","rightDegrees","downDegrees","upDegrees","fovLeft","tan","degToRad","fovTop","fovRight","fovBottom","halfWidth","halfHeight","verticalLensOffset","centerX","centerY","centerZ","screenLeft","screenTop","screenRight","screenBottom","undistortedFrustum","dist","eyeX","eyeY","left","top","right","bottom","opt_isUndistorted","getUndistortedFieldOfViewLeftEye","getUndistortedParams_","getUndistortedViewportLeftEye","screenWidth","screenHeight","xPxPerTanAngle","yPxPerTanAngle","round","eyePosX","eyePosY","halfLensDistance","maxFov","viewerMax","./distortion/distortion.js","./math-util.js","10","VRDisplayHMDDevice","display","VRDisplayPositionSensorDevice","eyeParameters","currentFieldOfView","maximumFieldOfView","minimumFieldOfView","recommendedFieldOfView","eyeTranslation","renderRect","setFieldOfView","opt_fovLeft","opt_fovRight","opt_zNear","opt_zFar","getState","resetState","positionDevice","11","coefficients","radius","r0","r1","dr0","dr1","r2","solveLinear_","solveLeastSquares_","matA","vecY","sum","numSamples","numCoefficients","Length","matATA","vecATY","approximateInverse","maxRadius","rp","12","DPDB_CACHE","format","last_updated","devices","rules","mdmh","ua","dpi","bw","ac","13","fetchOnline","onDeviceParamsUpdated","dpdb","recalculateDeviceParams_","xhr","XMLHttpRequest","open","ONLINE_DPDB_URL","loading","status","response","send","DeviceParams","newDeviceParams","calcDeviceParams_","db","vendor","opera","matched","rule","matchRule_","resX","resY","../util.js","./dpdb-cache.js","14","Emitter","callbacks","15","WebVRPolyfill","FORCE_ENABLE_VR","K_FILTER","PREDICTION_TIME_S","YAW_ONLY","DEFER_INITIALIZATION","ENABLE_DEPRECATED_API","InitializeWebVRPolyfill","./webvr-polyfill.js","16","copy","subVectors","normalize","scalar","invScalar","multiplyScalar","applyQuaternion","qx","qy","qz","qw","ix","iy","iz","iw","dot","crossVectors","ax","ay","az","bx","by","bz","Quaternion","quaternion","setFromEulerXYZ","c1","c2","c3","s1","s2","s3","setFromEulerYXZ","setFromAxisAngle","axis","halfAngle","multiply","multiplyQuaternions","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","inverse","slerp","qb","cosHalfTheta","halfTheta","acos","sinHalfTheta","ratioA","ratioB","setFromUnitVectors","EPS","vFrom","vTo","17","MouseKeyboardVRDisplay","onKeyDown_","onMouseMove_","onMouseDown_","onMouseUp_","phi_","theta_","targetAngle_","angleAnimation_","orientation_","rotateStart_","rotateEnd_","rotateDelta_","isDragging_","orientationOut_","KEY_SPEED","KEY_ANIMATION_DURATION","MOUSE_SPEED_X","MOUSE_SPEED_Y","keyCode","animatePhi_","animateTheta_","targetAngle","animateKeyTransitions_","clamp","angleName","startAngle","startTime","animate","percent","isPointerLocked_","movementX","mozMovementX","movementY","mozMovementY","pointerLockElement","mozPointerLockElement","webkitPointerLockElement","18","loadIcon_","overlay","style","backgroundColor","fontFamily","zIndex","img","icon","marginLeft","marginTop","text","textAlign","fontSize","lineHeight","margin","innerHTML","snackbar","padding","boxSizing","snackbarText","float","snackbarButton","href","fontWeight","textTransform","borderLeft","paddingLeft","textDecoration","body","ms","timer","disableShowTemporarily","base64","19","ComplementaryFilter","kFilter","currentAccelMeasurement","SensorSample","currentGyroMeasurement","previousGyroMeasurement","filterQ","previousFilterQ","accelQ","isOrientationInitialized","estimatedGravity","measuredGravity","gyroIntegralQ","DEBUG","addAccelMeasurement","vector","timestampS","addGyroMeasurement","deltaT","isTimestampDeltaValid","run_","accelToQuaternion_","sample","gyroDeltaQ","gyroToQuaternionDelta_","invFilterQ","deltaQ","getQuaternionAngle","toFixed","targetQ","accel","normAccel","quat","gyro","dt","../math-util.js","./sensor-sample.js","20","accelerometer","gyroscope","onDeviceMotionChange_","onScreenOrientationChange_","posePredictor","PosePredictor","touchPanner","TouchPanner","filterToWorldQ","inverseWorldToScreenQ","worldToScreenQ","originalPoseAdjustQ","setScreenTransform_","resetQ","isFirefoxAndroid","predictedQ","getPrediction","previousTimestampS","out","resetSensor","deviceMotion","accGravity","accelerationIncludingGravity","rotRate","rotationRate","timeStamp","deltaS","MIN_TIMESTEP","MAX_TIMESTEP","beta","gamma","screenOrientation","../touch-panner.js","./complementary-filter.js","./pose-predictor.js","21","predictionTimeS","previousQ","outQ","currentQ","angularSpeed","predictAngle","22","sensorSample","23","onTouchStart_","onTouchMove_","onTouchEnd_","isTouching","rotateStart","rotateEnd","rotateDelta","ROTATE_SPEED","touches","pageX","pageY","24","objectAssign","mimeType","platform","isSafari","timestampDeltaS","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","vertexSource","fragmentSource","attribLocationMap","createShader","VERTEX_SHADER","shaderSource","compileShader","FRAGMENT_SHADER","createProgram","attachShader","attribName","bindAttribLocation","deleteShader","uniformCount","getProgramParameter","ACTIVE_UNIFORMS","uniformName","uniformInfo","getActiveUniform","replace","getUniformLocation","near","far","lr","bt","nf","check","substr","object-assign","25","selectedKey","localStorage","getItem","VIEWER_KEY","DEFAULT_VIEWER","dialog","createDialog_","CLASS_NAME","selected","checked","contains","getSelectedKey_","onSave_","setItem","options","container","background","overflow","boxShadow","createH1_","createChoice_","createButton_","h1","marginBottom","div","onclick","button","letterSpacing","border","./emitter.js","26","AndroidWakeLock","video","paused","iOSWakeLock","setInterval","clearInterval","getWakeLock","match","27","displays","devicesPopulated","nativeWebVRAvailable","isWebVRAvailable","nativeLegacyWebVRAvailable","isDeprecatedWebVRAvailable","enablePolyfill","enableDeprecatedPolyfill","populateDevices","vrDisplay","isCardboardCompatible","getVRDDevices","mozGetVRDevices","./cardboard-vr-display.js","./display-wrappers.js","./mouse-keyboard-vr-display.js","es6-promise","keysA","keysB","deepAssign","checkHeadsetConnected","forceCanvasResizeSafariMobile","extendDeep","bKey","aVal","bVal","isComparingObjects","isGearVR","isLandscape","shouldCaptureKeyEvent","shiftKey","metaKey","altKey","ctrlKey","activeElement","delimiter","regex","RegExp","copyAttribute","getUrlParameter","results","exec","search","decodeURIComponent","isIframed","matchingElements","allElements","getElementsByTagName","srcLoader","getCanvasSize","canvasEl","embedded","offsetHeight","offsetWidth","innerHeight","innerWidth","requestFullScreen","webkitRequestFullScreen","initMetaTags","inject","initWakelock","re","initPostMessageAPI","inspector","keyboard-shortcuts","vr-mode-ui","Scene","behaviors","originalHTML","setupRenderer","resize","addFullScreenStyles","htmlEl","documentElement","removeFullScreenStyles","initSystems","animationFrameID","behavior","enterVR","enterVRSuccess","enterVRFailure","err","message","effect","exitVR","exitVRSuccess","exitVRFailure","index","size","camera","aspect","updateProjectionMatrix","renderer","setSize","antialias","WebGLRenderer","setPixelRatio","sortObjects","VREffect","renderStarted","startRender","mark","reload","doPause","timeDelta","setComponentProperty","defaultAttributes","primitive","defaultComponentsFromPrimitive","deprecated","deprecatedMappings","mappings","transforms","componentData","applyDefaultComponents","syncAttributeToComponent","defaultData","attrValues","getTransformedValue","metalness","opacity","roughness","shader","side","transparent","isAEvent","targetEls","targetSelector","attachEventListener","attributeValue","targetEl","VRControls","onError","gotVRDevices","vrInput","scope","standingMatrix","Matrix4","standing","userHeight","fromArray","updateMatrix","sittingToStandingTransform","applyMatrix","setY","zeroSensor","dispose","gotVRDisplays","vrDisplays","isWebVR1","eyeWidth","eyeHeight","eyeParamsL","rendererPixelRatio","getPixelRatio","rendererSize","getSize","fovToNDCScaleOffset","pxscale","leftTan","rightTan","pxoffset","pyscale","upTan","downTan","pyoffset","fovPortToProjection","rightHanded","zNear","zFar","handednessScale","mobj","scaleAndOffset","transpose","fovToProjection","fovPort","renderRectL","renderRectR","eyeFOVL","eyeFOVR","eyeTranslationL","eyeTranslationR","getVRDisplay","domElement","setFullScreen","boolean","autoSubmitFrame","cameraL","PerspectiveCamera","cameraR","scene","forceClear","autoUpdate","updateMatrixWorld","eyeParamsR","setRenderTarget","setScissorTest","autoClear","projectionMatrix","matrixWorld","decompose","translateOnAxis","scissor","setViewport","setScissor","segmentsHeight","segmentsWidth","segmentsDepth","BoxGeometry","segments","thetaLength","thetaStart","CircleGeometry","openEnded","radiusBottom","radiusTop","segmentsRadial","CylinderGeometry","DodecahedronGeometry","IcosahedronGeometry","OctahedronGeometry","PlaneGeometry","radiusInner","radiusOuter","segmentsPhi","segmentsTheta","RingGeometry","phiLength","phiStart","SphereGeometry","TetrahedronGeometry","arc","radiusTubular","segmentsTubular","TorusGeometry","TorusKnotGeometry","model","BlendCharacter","castShadow","receiveShadow","shading","FlatShading","computeBoundingBox","active","zoom","savedPose","onEnterVR","onExitVR","addHeightOffset","activeCameraEl","setActiveCamera","disableActiveCamera","saveCameraPose","removeHeightOffset","restoreCameraPose","oldOffset","currentPosition","userHeightOffset","headsetConnected","loader","convertUpAxis","colladaModel","EVENTS","CLICK","MOUSEENTER","MOUSEDOWN","MOUSELEAVE","MOUSEUP","STATES","FUSING","HOVERING","HOVERED","fuse","fuseTimeout","cursorEl","mouseDownEl","intersectedEl","onMouseDown","onMouseUp","onIntersection","onIntersectionCleared","twoWayEmit","els","evtName","dummyGeometry","buffer","mergeTo","oneOf","skipCache","previousData","mesh","Mesh","unuseGeometry","getOrCreateGeometry","toEl","toMesh","merge","mergeTarget","newGeometryType","currentGeometryType","LEFT_HAND_MODEL_URL","RIGHT_HAND_MODEL_URL","onGripDown","handleButton","onGripUp","onTrackpadDown","onTrackpadUp","onTriggerDown","onTriggerUp","modelUrl","hand","isPressed","trackpadPressed","playAnimation","triggerPressed","gripPressed","animation","animationActive","timeScale","mixer","clipAction","loop","clampWhenFinished","if","groundColor","decay","distance","intensity","penumbra","light","defaultTarget","registerLight","diffData","setLight","onSetTarget","newLight","getLight","translateY","getHex","AmbientLight","DirectionalLight","HemisphereLight","PointLight","SpotLight","target3D","lookAt","beginTracking","setFromMatrixPosition","isNullVector","PI_2","hmdEnabled","enableGrabCursor","previousHMDPosition","setupMouseControls","setupHMDControls","pitchObject","yawObject","controls","updateOrientation","updatePosition","onMouseMove","releaseMouse","onTouchStart","onTouchMove","onTouchEnd","mouseDown","dolly","euler","Euler","hmdEuler","currentRotation","deltaRotation","hmdQuaternion","calculateHMDQuaternion","setFromQuaternion","calculateDeltaRotation","previousRotationX","previousRotationY","currentRotationX","currentRotationY","deltaHMDPosition","currentHMDPosition","calculateHMDPosition","sub","matrix","previousMouseEvent","screenX","screenY","touchStart","touchStarted","deltaY","parseSide","BackSide","DoubleSide","FrontSide","disposeMaterial","unregisterMaterial","flatShading","updateShader","updateMaterial","newShader","currentShader","updateBehavior","tickProperties","delta","shaderName","shaderInstance","setMaterial","SmoothShading","defaultMaterial","MeshBasicMaterial","registerMaterial","mtl","objLoader","mtlLoader","manager","loadObj","objUrl","mtlUrl","setBaseUrl","lastIndexOf","materials","preload","setMaterials","objModel","scaleDummy","interval","objects","intersectedEls","prevCheckTime","raycaster","Raycaster","updateOriginDirection","refreshObjects","objectEls","intersections","prevIntersectedEls","intersectObjects","intersection","directionHelper","originVec3","order","zeroScale","autoplay","volume","audioLoader","AudioLoader","sound","playSound","srcChanged","setupSound","setLoop","setVolume","updateEventListener","setBuffer","oldEvt","stopSound","audioListener","AudioListener","cameraEl","PositionalAudio","onended","onEnded","controller","buttonStates","axisState","hasId","controllers","updatePose","updateButtons","controllerEuler","controllerPosition","controllerQuaternion","setFromRotationMatrix","buttonState","buttons","handleAxes","axes","controllerAxes","previousAxis","changed","handlePress","handleTouch","handleValue","previousButtonState","pressed","touched","VIVE_CONTROLLER_MODEL_OBJ_URL","VIVE_CONTROLLER_MODEL_OBJ_MTL","buttonColor","buttonHighlightColor","mapping","axis0","axis1","button0","button1","button2","button3","button4","onButtonChanged","onButtonDown","onButtonEvent","onButtonUp","onModelLoaded","buttonMeshes","trigger","controllerObject3D","grip","getObjectByName","menu","trackpad","buttonName","updateModel","MAX_DELTA","acceleration","fly","wsAxis","adAxis","wsInverted","wsEnabled","adInverted","adEnabled","velocity","onBlur","onFocus","onVisibilityChange","onKeyDown","onKeyUp","attachVisibilityEventListeners","movementVector","prevTime","adSign","wsSign","getMovementVector","translateX","translateZ","attachKeyEventListeners","removeKeyEventListeners","removeVisibilityEventListeners","hidden","elRotation","applyEuler","getMaterialData","fog","textureSrc","updateMap","CubeLoader","CubeTextureLoader","texturePromises","envMap","MeshStandardMaterial","updateEnvMap","isLoadingEnvMap","cube","validateCubemapSrc","urls","removeDefaultCamera","defaultCamera","DEFAULT_CAMERA_ATTR","constants","DEFAULT_USER_HEIGHT","setupDefaultCamera","defaultCameraEl","AFRAME_INJECTED","removeDefaultOffset","addDefaultOffset","cameraEls","newActiveCameraEl","newCameraEl","newCamera","previousCamera","defaultCameraWrapper","createGeometry","geometryType","GeometryClass","geometryInstance","toBufferGeometry","decrementCacheCount","cacheCount","hash","incrementCacheCount","doBuffer","bufferGeometry","BufferGeometry","fromGeometry","metadata","parameters","cache","clearCache","cachedGeometry","DEFAULT_LIGHT_ATTR","defaultLights","userDefinedLights","setupDefaultLights","removeDefaultLights","ambientLight","directionalLight","calculateVideoCacheHash","videoEl","videoAttributes","sort","loadImageTexture","doLoadImageTexture","resolveTexture","texture","setTextureProperties","isEl","Texture","statusText","repeatXY","wrapS","RepeatWrapping","wrapT","createVideoEl","fixVideoAttributes","textureCache","clearTextureCache","loadTexture","loadImageCb","loadImage","loadVideoCb","loadVideo","loadCanvasCb","loadCanvas","validateSrc","handleImageTextureLoaded","HAVE_CURRENT_DATA","handleVideoTextureLoaded","videoTextureResult","hashVideo","VideoTexture","minFilter","LinearFilter","uuid","updateMaterials","gamepad","gamepads","getGamepads","linear","ease","ease-in","ease-out","ease-in-out","ease-cubic","ease-in-cubic","ease-out-cubic","ease-in-out-cubic","ease-quad","ease-in-quad","ease-out-quad","ease-in-out-quad","ease-quart","ease-in-quart","ease-out-quart","ease-in-out-quart","ease-quint","ease-in-quint","ease-out-quint","ease-in-out-quint","ease-sine","ease-in-sine","ease-out-sine","ease-in-out-sine","ease-expo","ease-in-expo","ease-out-expo","ease-in-out-expo","ease-circ","ease-in-circ","ease-out-circ","ease-in-out-circ","ease-elastic","ease-in-elastic","ease-out-elastic","ease-in-out-elastic","ease-back","ease-in-back","ease-out-back","ease-in-out-back","ease-bounce","ease-in-bounce","ease-out-bounce","ease-in-out-bounce","getDebugNamespaceType","namespace","chunks","getDebugNamespaceColor","settings","colors","storage","debugLib","info","ls","logs","registerPropertyType","defaultValue","defaultParse","defaultStringify","arrayParse","trim","arrayStringify","boolParse","intParse","numberParse","selectorParse","selectorAllParse","selectorStringify","selectorAllStringify","srcParse","parsedUrl","vecParse","defaultVec","coordinate","vec","vecParseFloat","toVector3","dummyDolly","_x","_y","_z","splitName","handleTextureEvents","image","setMap","toCamelCase","camelCase","toUpperCase","transformKeysToCamelCase","camelCaseObj","camelCaseKey","parsedData","isImageCb","isVideoCb","isCanvasCb","textureEl","isImage","isVideo","isCanvas","parseUrl","validateImageUrl","validateAndGetQuerySelector","validatedUrls","aCubemap","cubemapSrcRegex","parsedSrc","onResult","onLoad","tester","Image","createLink","head","link","rel","createStyle","cssText","sheet","styleSheet","register","addFullscreenClass","removeFullscreenClass","onFullScreenChange","fullscreenEl","blur","focus","dataset","aframeCanvas","enterVREl","INSPECTOR_URL","homepage","onKeydown","shortcutPressed","injectInspector","script","INSPECTOR","inspectorInjected","getFog","FogExp2","density","Fog","enterVREnabled","resetSensorEnabled","createEnterVRButton","enterVRHandler","vrButton","wrapper","ENTER_VR_CLASS","className","ENTER_VR_BTN_CLASS","createOrientationModal","exitVRHandler","modal","ORIENTATION_MODAL_CLASS","HIDDEN_CLASS","exit","insideLoader","orientationModalEl","updateEnterVRInterface","toggleOrientationModalIfNeeded","uiElement","toggleEnterVRButtonIfNeeded","createStats","threeStats","ThreeStats","aframeStats","AFrameStats","plugins","RStats","css","fps","caption","below","groups","stats","statsEl","hideBound","showBound","frame","st","gt","ot","it","at","ut","F","E","R","nodeName","ft","lt","currentTarget","attrChange","Y","prevValue","ct","$","ht","G","vt","pt","U","Z","nt","X","Q","tt","created","I","S","mt","rt","et","random","T","N","C","isPrototypeOf","L","A","O","M","setPrototypeOf","_","D","yt","H","B","Element","Node","nodeType","W","attributeOldValue","V","J","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","K","addedNodes","removedNodes","oldValue","childList","subtree","innerHTMLHelper","assignKey","isObj","Wakelock","wakelock","postMessageAPIHandler","Meta","attrs","exists","Link","createTag","tagObj","meta","MOBILE_HEAD_TAGS","content","MOBILE_IOS_HEAD_TAGS","createAndInjectTag","tag","headScriptEl","headEl","headTags","originalPosition","originalRotation","originalParent","originalGroup","outerGroup","Number","EPSILON","sign","nextSource","keysArray","nextIndex","nextKey","MOUSE","MIDDLE","CullFaceNone","CullFaceBack","CullFaceFront","CullFaceFrontBack","FrontFaceDirectionCW","FrontFaceDirectionCCW","BasicShadowMap","PCFShadowMap","PCFSoftShadowMap","NoColors","FaceColors","VertexColors","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","Uncharted2ToneMapping","CineonToneMapping","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","SphericalReflectionMapping","CubeUVReflectionMapping","CubeUVRefractionMapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipMapNearestFilter","NearestMipMapLinearFilter","LinearMipMapNearestFilter","LinearMipMapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedShort565Type","AlphaFormat","RGBFormat","RGBAFormat","LuminanceFormat","LuminanceAlphaFormat","RGBEFormat","DepthFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","LoopOnce","LoopRepeat","LoopPingPong","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","LinearEncoding","sRGBEncoding","GammaEncoding","RGBEEncoding","LogLuvEncoding","RGBM7Encoding","RGBM16Encoding","RGBDEncoding","BasicDepthPacking","RGBADepthPacking","setHex","setStyle","setScalar","setRGB","setHSL","hue2rgb","euclideanModulo","handleAlpha","string","charAt","ColorKeywords","clone","copyGammaToLinear","gammaFactor","copyLinearToGamma","safeInverse","convertGammaToLinear","convertLinearToGamma","getHexString","getHSL","optionalTarget","hue","saturation","hsl","lightness","getStyle","offsetHSL","addColors","color1","color2","addScalar","equals","toArray","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","_w","onChangeCallback","setFromEuler","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","conjugate","lengthSq","atan2","onChange","qa","qm","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","sqrSin","tDir","setX","setComponent","getComponent","addVectors","addScaledVector","subScalar","divide","divideScalar","clampScalar","minVal","maxVal","clampLength","ceil","roundToZero","negate","lengthManhattan","distanceTo","distanceToSquared","dx","dy","setLength","lerpVectors","v2","fromAttribute","itemSize","rotateAround","center","setZ","multiplyVectors","applyAxisAngle","applyMatrix3","applyMatrix4","applyProjection","project","multiplyMatrices","getInverse","unproject","transformDirection","cross","projectOnVector","projectOnPlane","planeNormal","reflect","angleTo","dz","setFromSpherical","sinPhiRadius","phi","setFromMatrixColumn","setFromMatrixScale","sx","sy","sz","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","xx","yy","zz","xy","xz","yz","_order","DefaultOrder","RotationOrders","makeRotationFromQuaternion","setFromVector3","reorder","newOrder","optionalResult","Line3","line","distanceSq","closestPointToPointParameter","startP","startEnd","point","clampToLine","startEnd2","startEnd_startP","closestPointToPoint","Box2","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","halfSize","box","isEmpty","expandByVector","expandByScalar","containsPoint","containsBox","intersectsBox","clampPoint","distanceToPoint","clampedPoint","intersect","union","translate","Box3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromObject","positions","intersectsSphere","closestPoint","sphere","intersectsPlane","plane","constant","getBoundingSphere","Sphere","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","identity","setFromMatrix4","applyToVector3Array","applyToBuffer","getX","getY","getZ","setXYZ","determinant","throwOnDegenerate","t11","t12","t13","det","msg","flattenToArrayOffset","getNormalMatrix","matrix4","transposeIntoArray","n14","n24","n34","n41","n42","n43","n44","copyPosition","extractBasis","xAxis","yAxis","zAxis","makeBasis","extractRotation","scaleX","scaleY","scaleZ","makeRotationFromEuler","ae","af","be","bf","ce","cf","de","df","ad","bc","bd","x2","y2","z2","wx","wy","wz","eye","up","premultiply","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","multiplyToArray","setPosition","t14","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","tx","ty","makeScale","compose","invSX","invSY","invSZ","makeFrustum","makePerspective","ymax","ymin","xmin","xmax","makeOrthographic","Ray","origin","ray","recast","directionDistance","distanceSqToPoint","distanceSqToSegment","segCenter","segDir","optionalPointOnRay","optionalPointOnSegment","s0","sqrDist","extDet","segExtent","a01","b0","b1","invDet","intersectSphere","tca","d2","radius2","thc","t0","t1","distanceToPlane","denominator","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","edge1","edge2","backfaceCulling","DdN","DdQxE2","DdE1xQ","QdN","optionalCenter","maxRadiusSq","empty","radiusSum","deltaLengthSq","getBoundingBox","Frustum","p4","p5","planes","Plane","frustum","setFromMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","setComponents","intersectsObject","boundingSphere","computeBoundingSphere","negRadius","d1","setFromNormalAndCoplanarPoint","setFromCoplanarPoints","inverseNormalLength","distanceToSphere","projectPoint","orthoPoint","perpendicularMagnitude","intersectLine","intersectsLine","startSign","endSign","coplanarPoint","m1","optionalNormalMatrix","referencePoint","normalMatrix","Spherical","other","makeSafe","RAD2DEG","generateUUID","chars","rnd","mapLinear","a1","a2","b2","smoothstep","smootherstep","random16","randInt","low","high","randFloat","randFloatSpread","range","degrees","radians","isPowerOfTwo","nearestPowerOfTwo","LN2","nextPowerOfTwo","Spline","interpolate","intPoint","weight","w2","w3","pa","pb","pc","pd","v3","initFromArray","getPoint","getControlPointsArray","coords","getLength","nSubDivisions","nSamples","oldIntPoint","oldPosition","tmpVec","chunkLengths","totalLength","total","reparametrizeByArcLength","samplingCoef","indexCurrent","indexNext","realDistance","sampling","newpoints","sl","Triangle","resultLengthSq","barycoordFromPoint","dot00","dot01","dot02","dot11","dot12","denom","invDenom","setFromPointsAndIndices","i0","i1","i2","triangle","area","midpoint","edgeList","projectedPoint","minDistance","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","_cachedIndex","valueSize","evaluate","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","afterEnd_","t1global","beforeStart_","mid","intervalChanged_","interpolate_","DefaultSettings_","getSettings_","copySampleValue_","stride","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o1","o0","oP","oN","wP","wN","ppp","sP","sN","DiscreteInterpolant","LinearInterpolant","offset1","offset0","weight1","weight0","QuaternionLinearInterpolant","Clock","autoStart","oldTime","elapsedTime","running","getElapsedTime","getDelta","newTime","EventDispatcher","hasEventListener","_listeners","listeners","listenerArray","Layers","mask","toggle","ascSort","intersectObject","intersects","raycast","Line","LOD","Points","threshold","Sprite","defineProperties","PointCloud","linePrecision","setFromCamera","OrthographicCamera","onRotationChange","onQuaternionChange","Object3DIdCount","DefaultUp","modelViewMatrix","rotationAutoUpdate","matrixAutoUpdate","DefaultMatrixAutoUpdate","matrixWorldNeedsUpdate","frustumCulled","renderOrder","userData","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","q1","rotateX","rotateY","rotateZ","localToWorld","worldToLocal","getObjectById","getObjectByProperty","getWorldPosition","getWorldQuaternion","getWorldRotation","getWorldScale","getWorldDirection","traverseVisible","traverseAncestors","force","toJSON","extractFromCache","isRootObject","output","textures","images","generator","Face3","materialIndex","vertexNormals","vertexColors","BufferAttribute","normalized","dynamic","updateRange","setDynamic","copyAt","index1","index2","copyArray","copyColorsArray","copyIndicesArray","copyVector2sArray","vectors","copyVector3sArray","copyVector4sArray","getW","setXY","setXYZW","Int8Attribute","Int8Array","Uint8Attribute","Uint8Array","Uint8ClampedAttribute","Int16Attribute","Int16Array","Uint16Attribute","Int32Attribute","Int32Array","Uint32Attribute","Uint32Array","Float32Attribute","Float64Attribute","Float64Array","DynamicBufferAttribute","InstancedBufferAttribute","meshPerAttribute","InterleavedBuffer","InstancedInterleavedBuffer","InterleavedBufferAttribute","interleavedBuffer","GeometryIdCount","faces","faceVertexUvs","morphTargets","morphNormals","skinWeights","skinIndices","lineDistances","boundingBox","verticesNeedUpdate","elementsNeedUpdate","uvsNeedUpdate","normalsNeedUpdate","colorsNeedUpdate","lineDistancesNeedUpdate","groupsNeedUpdate","vertex","face","jl","fromBufferGeometry","addFace","normals","tempNormals","uvs","tempUVs","uvs2","tempUVs2","uv","uv2","group","computeFaceNormals","ab","fl","vA","vB","vC","computeVertexNormals","areaWeighted","vl","computeMorphNormals","__originalFaceNormal","__originalVertexNormals","tmpGeo","faceNormals","faceNormal","dstNormalsFace","dstNormalsVertex","computeTangents","computeLineDistances","materialIndexOffset","vertexOffset","vertices1","vertices2","faces1","faces2","uvs1","vertexCopy","faceCopy","faceVertexNormals","faceVertexColors","uvCopy","mergeMesh","mergeVertices","verticesMap","unique","changes","precisionPoints","precision","faceIndicesToRemove","dupIndex","idx","sortFacesByMaterialIndex","materialIndexSort","newUvs1","newUvs2","setBit","getNormalIndex","normalsHash","getColorIndex","colorsHash","getUvIndex","uvsHash","hasMaterial","hasFaceUv","hasFaceVertexUv","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","faceType","uvsCopy","kl","DirectGeometry","computeGroups","morphTargetsPosition","hasFaceVertexUv2","morphTargetsLength","morphTargetsNormal","morphNormalsLength","hasSkinIndices","hasSkinWeights","vertexUvs","morphTarget","morphNormal","morphAttributes","drawRange","getIndex","setIndex","addAttribute","addGroup","clearGroups","setDrawRange","updateFromObject","direct","__directGeometry","lineDistance","fromDirectGeometry","TypeArray","pA","pB","pC","normalizeNormals","attribute1","attributeArray1","attribute2","attributeArray2","attributeSize","toNonIndexed","geometry2","array2","MaxIndex","InstancedBufferGeometry","maxInstancedCount","instances","Uniform","onUpdateCallback","AnimationClip","tracks","resetDuration","optimize","track","json","jsonTracks","frameTime","KeyframeTrack","clip","clipTracks","CreateFromMorphTargetSequence","morphTargetSequence","noLoop","numMorphTargets","AnimationUtils","getKeyframeOrder","sortedArray","NumberKeyframeTrack","findByName","clipArray","CreateClipsFromMorphTargetSequences","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","parseAnimation","bones","addNonemptyTrack","trackType","trackName","animationKeys","destTracks","flattenJSON","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","VectorKeyframeTrack","QuaternionKeyframeTrack","AnimationMixer","_root","_initMemoryManager","_accuIndex","optionalRoot","prototypeAction","rootUuid","clipObject","actionsForClip","_actionsByClip","existingAction","actionByRoot","knownActions","_clip","newAction","_Action","_bindAction","_addInactiveAction","stopAllAction","actions","_actions","nActions","_nActiveActions","_bindings","nBindings","_nActiveBindings","reset","useCount","deltaTime","timeDirection","accuIndex","action","_update","getRoot","uncacheClip","actionsByClip","actionsToRemove","_deactivateAction","cacheIndex","_cacheIndex","lastInactiveAction","_byClipCacheIndex","pop","_removeInactiveBindingsForAction","uncacheRoot","_removeInactiveAction","bindingsByRoot","_bindingsByRootAndName","bindingByName","restoreOriginalState","_removeInactiveBinding","uncacheAction","localRoot","_mixer","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","createInterpolant","_interpolantSettings","_interpolants","_propertyBindings","_timeScaleInterpolant","_weightInterpolant","_loopCount","_effectiveTimeScale","_effectiveWeight","repetitions","zeroSlopeAtStart","zeroSlopeAtEnd","_activateAction","stopFading","stopWarping","_isActiveAction","isScheduled","startAt","mode","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","halt","_currentTimeScale","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","timeRunning","_updateTimeScale","clipTime","_updateTime","_updateWeight","propertyMixers","accumulate","interpolantValue","loopCount","pingPong","_setEndings","loopDelta","pending","atStart","atEnd","weightNow","weightThen","bindingsByName","referenceCount","_addInactiveBinding","path","parsedPath","PropertyMixer","PropertyBinding","ValueTypeName","getValueSize","_lendBinding","saveOriginalState","_lendAction","_takeBackBinding","_takeBackAction","_controlInterpolants","_nActiveControlInterpolants","inUse","controlInterpolants","knownActionsForClip","lastKnownAction","byClipCacheIndex","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","propBinding","rootNode","lastInactiveBinding","remove_empty_map","firstInactiveBinding","lastActiveBinding","_controlInterpolantsResultBuffer","__cacheIndex","lastActiveInterpolant","AnimationObjectGroup","var_args","_objects","nCachedObjects_","_indicesByUUID","_paths","_parsedPaths","_bindingsIndicesByPath","bindingsPerObject","nObjects","nCachedObjects","indicesByUUID","paths","parsedPaths","knownObject","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","uncache","lastIndex","lastObject","last","subscribe_","indicesByPath","unsubscribe_","lastBindingsIndex","lastBindings","lastBindingsPath","arraySlice","isTypedArray","subarray","convertArray","forceClone","BYTES_PER_ELEMENT","ArrayBuffer","isView","DataView","compareTime","nValues","srcOffset","jsonKeys","valuePropertyName","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","InterpolantFactoryMethodDiscrete","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","getInterpolation","timeOffset","endTime","nKeys","valid","currTime","writeIndex","keep","timeNext","offsetP","offsetN","readOffset","writeOffset","_getTrackTypeForValueTypeName","ColorKeyframeTrack","BooleanKeyframeTrack","StringKeyframeTrack","parseTrackName","findNode","getValue","targetArray","setValue","sourceArray","targetObject","objectName","propertyIndex","_getValue_unavailable","_setValue_unavailable","objectIndex","skeleton","nodeProperty","versioning","Versioning","NeedsUpdate","MatrixWorldNeedsUpdate","bindingType","BindingType","Direct","ArrayElement","resolvedProperty","HasFromToArray","EntireArray","GetterByBindingType","SetterByBindingTypeAndVersioning","unbind","_getValue_unbound","_setValue_unbound","Composite","targetGroup","optionalParsedPath","_targetGroup","firstValidIndex","searchSkeleton","bone","searchNodeSubtree","childNode","subTreeNode","mixFunction","bufferType","_slerp","_select","_lerp","_mixBufferRegion","cumulativeWeight","currentWeight","mix","originalValueOffset","Audio","context","createBufferSource","gain","createGain","connect","getInput","playbackRate","hasPlaybackControl","sourceType","getOutput","setNodeSource","audioNode","audioBuffer","currentTime","getFilter","setFilter","setPlaybackRate","getPlaybackRate","getLoop","getVolume","AudioAnalyser","audio","fftSize","analyser","createAnalyser","frequencyBinCount","getByteFrequencyData","AudioContext","webkitAudioContext","panner","createPanner","setRefDistance","refDistance","getRefDistance","setRolloffFactor","rolloffFactor","getRolloffFactor","setDistanceModel","distanceModel","getDistanceModel","setMaxDistance","maxDistance","getMaxDistance","removeFilter","setMasterVolume","getMasterVolume","setOrientation","Camera","matrixWorldInverse","CubeCamera","cubeResolution","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","magFilter","WebGLRenderTargetCube","updateCubeMap","generateMipmaps","activeCubeFace","cx","cy","view","filmGauge","filmOffset","setLens","focalLength","setFocalLength","vExtentSlope","getFilmHeight","getFocalLength","getEffectiveFOV","getFilmWidth","setViewOffset","fullWidth","fullHeight","offsetX","offsetY","skew","StereoCamera","eyeRight","eyeLeft","eyeSep","eyeSepOnProjection","Light","LightShadow","bias","mapSize","shadow","DirectionalLightShadow","skyColor","power","SpotLightShadow","DefaultLoadingManager","onProgress","setResponseType","decodeAudioData","file","Loader","onLoadStart","onLoadProgress","onLoadComplete","extractUrlBase","initMaterials","texturePath","createMaterial","textureLoader","materialLoader","wrap","anisotropy","fullPath","Handlers","MaterialLoader","blending","specular","emissive","shininess","mapDiffuseRepeat","mapDiffuseOffset","mapDiffuseWrap","mapDiffuseAnisotropy","lightMap","mapLightRepeat","mapLightOffset","mapLightWrap","mapLightAnisotropy","aoMap","mapAORepeat","mapAOOffset","mapAOWrap","mapAOAnisotropy","bumpMap","mapBumpRepeat","mapBumpOffset","mapBumpWrap","mapBumpAnisotropy","bumpScale","normalMap","mapNormalRepeat","mapNormalOffset","mapNormalWrap","mapNormalAnisotropy","normalScale","specularMap","mapSpecularRepeat","mapSpecularOffset","mapSpecularWrap","mapSpecularAnisotropy","alphaMap","mapAlphaRepeat","mapAlphaOffset","mapAlphaWrap","mapAlphaAnisotropy","setTextures","handlers","cached","overrideMimeType","itemEnd","itemError","responseType","withCredentials","itemStart","setPath","setWithCredentials","FontLoader","Font","substring","JSONLoader","statusDomElement","_statusDomElement","setTexturePath","parseModel","isBitSet","fi","zLength","colorIndex","normalIndex","uvIndex","isQuad","faceA","faceB","uvLayer","nUvLayers","parseSkin","influencesPerVertex","parseMorphing","dstVertices","srcVertices","morphColors","parseAnimations","outputAnimations","animations","morphAnimationClips","LoadingManager","isLoading","itemsLoaded","itemsTotal","BufferGeometryLoader","TYPED_ARRAYS","typedArray","drawcalls","offsets","getTexture","alphaTest","depthWrite","colorWrite","wireframe","wireframeLinewidth","sizeAttenuation","displacementMap","displacementScale","displacementBias","roughnessMap","metalnessMap","emissiveMap","emissiveIntensity","combine","reflectivity","lightMapIntensity","aoMapIntensity","ObjectLoader","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","geometryLoader","bufferGeometryLoader","widthSegments","heightSegments","depthSegments","radialSegments","innerRadius","outerRadius","thetaSegments","phiSegments","tube","tubularSegments","parseConstant","getGeometry","getMaterial","SkinnedMesh","levels","level","addLevel","CubeTexture","DataTextureLoader","BinaryTextureLoader","_parser","DataTexture","texData","mipmaps","mipmapCount","CompressedTextureLoader","texDatas","CompressedTexture","isCubemap","Material","MaterialIdCount","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","clippingPlanes","clipShadows","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","premultipliedAlpha","overdraw","_needsUpdate","setValues","isRoot","srcPlanes","dstPlanes","LineBasicMaterial","linewidth","linecap","linejoin","LineDashedMaterial","dashSize","gapSize","refractionRatio","wireframeLinecap","wireframeLinejoin","skinning","MeshDepthMaterial","depthPacking","MeshLambertMaterial","MeshNormalMaterial","MeshPhongMaterial","defines","STANDARD","envMapIntensity","MeshPhysicalMaterial","PHYSICAL","MultiMaterial","PointsMaterial","lights","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","UniformsUtils","RawShaderMaterial","SpriteMaterial","encoding","TextureIdCount","sourceFile","DEFAULT_IMAGE","DEFAULT_MAPPING","premultiplyAlpha","flipY","unpackAlignment","getDataURL","toDataURL","drawImage","transformUv","DepthTexture","CanvasTexture","inverseMatrix","testPoint","rayPointDistanceSq","localThresholdSq","intersectPoint","distanceToRay","localThreshold","LineSegments","precisionSq","vStart","vEnd","interSegment","interRay","step","distSq","faceIndex","nbVertices","LineStrip","LinePieces","drawMode","updateMorphTargets","setDrawMode","morphTargetBase","morphTargetInfluences","morphTargetDictionary","ml","getMorphTargetIndexByName","uvIntersection","uv1","uv3","barycoord","checkIntersection","intersectionPointWorld","checkBufferGeometryIntersection","intersectionPoint","uvA","uvB","uvC","tempA","tempB","tempC","fvA","fvB","fvC","isFaceMaterial","faceMaterial","morphInfluences","tl","influence","targets","uvs_f","Bone","skin","Skeleton","boneInverses","useVertexTexture","identityMatrix","boneTextureWidth","boneTextureHeight","boneMatrices","boneTexture","calculateInverses","bl","offsetMatrix","bindMode","bindMatrix","bindMatrixInverse","gbone","pos","rotq","scl","normalizeSkinWeights","sw","skinWeight","getObjectForDistance","matrixPosition","guessSizeSq","Particle","LensFlare","lensFlares","positionScreen","customUpdateCallback","updateLensFlares","flare","vecX","wantedRotation","overrideMaterial","ShaderChunk","merged","uniforms_src","uniforms_dst","parameter_src","UniformsLib","common","offsetRepeat","flipEnvMap","aomap","lightmap","emissivemap","bumpmap","normalmap","displacementmap","roughnessmap","metalnessmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","directionalLights","shadowBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","spotShadowMap","spotShadowMatrix","pointLights","pointShadowMap","pointShadowMatrix","hemisphereLights","ShaderLib","basic","lambert","phong","standard","dashed","totalSize","tCube","tFlip","equirect","tEquirect","distanceRGBA","lightPos","getTargetPixelRatio","_currentRenderTarget","_pixelRatio","glClearColor","_premultipliedAlpha","setDefaultGLState","_currentScissor","_scissor","_currentViewport","_viewport","_clearColor","_clearAlpha","resetGLState","_currentProgram","_currentCamera","_currentGeometryProgram","_currentMaterialId","onContextLost","onTextureDispose","deallocateTexture","_infoMemory","onRenderTargetDispose","deallocateRenderTarget","onMaterialDispose","deallocateMaterial","textureProperties","__image__webglTextureCube","_gl","__webglInit","__webglTexture","delete","renderTargetProperties","depthTexture","__webglFramebuffer","__webglDepthbuffer","releaseMaterialProgramReference","programInfo","programCache","releaseProgram","setupVertexAttributes","startIndex","extension","initAttributes","geometryAttributes","programAttributes","getAttributes","materialDefaultAttributeValues","programAttribute","geometryAttribute","SHORT","UNSIGNED_INT","INT","BYTE","getAttributeBuffer","enableAttributeAndDivisor","enableAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","disableUnusedAttributes","absNumericalSort","painterSortStable","reversePainterSortStable","pushRenderItem","transparentObjects","transparentObjectsLastIndex","opaqueObjects","opaqueObjectsLastIndex","renderItem","_vector3","isObjectViewable","_sphere","_frustum","_numClippingPlanes","_this","negRad","projectObject","sprites","ImmediateRenderObject","_projScreenMatrix","groupMaterial","renderObjects","renderList","setProgram","renderBufferImmediate","renderBufferDirect","initMaterial","materialProperties","getParameters","_lights","getProgramCode","programChange","shaderID","__webglShader","acquireProgram","numSupportedMorphTargets","maxMorphTargets","numSupportedMorphNormals","maxMorphNormals","numClippingPlanes","_clippingPlanesUniform","lightsHash","ambient","directional","spot","hemi","progUniforms","getUniforms","uniformsList","WebGLUniforms","seqWithValue","seq","dynamicUniforms","splitDynamic","setMaterialFaces","setBlending","setDepthFunc","setDepthTest","setDepthWrite","setColorWrite","setPolygonOffset","setFlipSided","_usedTextureUnits","_clippingEnabled","_localClippingEnabled","useCache","setClippingState","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","logarithmicDepthBuffer","uCamPos","cameraPosition","setOptional","floatVertexTextures","markUniformsLightsNeedsUpdate","refreshUniformsFog","refreshUniformsCommon","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsLambert","refreshUniformsPhong","refreshUniformsPhysical","refreshUniformsStandard","upload","dynUniforms","evalDynamic","uvScaleMap","WebGLRenderTarget","_canvas","setupShadows","lightShadowsLength","shadows","setupLights","ll","viewMatrix","directionalLength","pointLength","spotLength","hemiLength","lightCache","setupGlobalClippingPlanes","localClippingEnabled","_numGlobalClippingPlanes","_globalClippingState","setupClippingPlanes","skipTransform","nPlanes","dstArray","flatSize","viewNormalMatrix","_matrix3","i4","_plane","resetGlobalClippingState","fromCache","_clipRenderingShadows","nGlobal","lGlobal","clippingState","allocTextureUnit","maxTextures","setTextureParameters","textureType","isPowerOfTwoImage","paramThreeToGL","filterFallback","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","getMaxAnisotropy","uploadTexture","slot","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","clampToMaxSize","maxTextureSize","textureNeedsPowerOfTwo","makePowerOfTwo","glFormat","glType","mipmap","internalFormat","DEPTH_COMPONENT","_isWebGL2","DEPTH_COMPONENT32F","getCompressedTextureFormats","compressedTexImage2D","generateMipmap","__version","setTexture2D","complete","maxSize","HTMLImageElement","HTMLCanvasElement","setCubeTexture","isCompressed","isDataTexture","cubeImage","autoScaleCubemaps","maxCubemapSize","TEXTURE_CUBE_MAP_POSITIVE_X","setCubeTextureDynamic","setupFrameBufferTexture","attachment","textureTarget","setupRenderBufferStorage","renderbuffer","RGBA4","setupDepthTexture","isCube","setTexture","webglDepthTexture","setupDepthRenderbuffer","setupRenderTarget","isTargetPowerOfTwo","updateRenderTargetMipmap","NEAREST","REPEAT","MIRRORED_REPEAT","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","UNSIGNED_SHORT_4_4_4_4","UNSIGNED_SHORT_5_5_5_1","UNSIGNED_SHORT_5_6_5","HALF_FLOAT_OES","ALPHA","LUMINANCE","LUMINANCE_ALPHA","FUNC_ADD","FUNC_SUBTRACT","FUNC_REVERSE_SUBTRACT","ZERO","ONE","SRC_COLOR","ONE_MINUS_SRC_COLOR","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","DST_ALPHA","ONE_MINUS_DST_ALPHA","DST_COLOR","ONE_MINUS_DST_COLOR","SRC_ALPHA_SATURATE","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","MIN_EXT","MAX_EXT","_context","_alpha","_depth","_stencil","_antialias","_preserveDrawingBuffer","autoClearColor","autoClearDepth","autoClearStencil","gammaInput","gammaOutput","physicallyCorrectLights","toneMapping","toneMappingExposure","toneMappingWhitePoint","_currentFramebuffer","_currentScissorTest","_width","_height","_scissorTest","_infoRender","calls","memory","programs","getShaderPrecisionFormat","rangeMin","rangeMax","WebGL2RenderingContext","WebGLExtensions","WebGLCapabilities","WebGLState","WebGLProperties","WebGLObjects","WebGLPrograms","WebGLLights","bufferRenderer","WebGLBufferRenderer","indexedBufferRenderer","WebGLIndexedBufferRenderer","shadowMap","WebGLShadowMap","spritePlugin","SpritePlugin","lensFlarePlugin","LensFlarePlugin","forceContextLoss","loseContext","MAX_TEXTURE_MAX_ANISOTROPY_EXT","getPrecision","updateStyle","getClearColor","setClearColor","getClearAlpha","setClearAlpha","bits","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","clearDepth","clearStencil","clearTarget","buffers","hasPositions","hasNormals","hasUvs","hasColors","positionArray","DYNAMIC_DRAW","normalArray","nx","ny","nz","uvArray","colorArray","updateBuffers","geometryProgram","activeInfluences","getWireframeAttribute","dataStart","dataCount","rangeStart","rangeCount","groupStart","groupCount","drawStart","drawEnd","drawCount","setLineWidth","setMode","LINES","TRIANGLE_FAN","LINE_STRIP","POINTS","renderInstances","setFaceCulling","frontFaceDirection","frontFace","CW","CCW","BACK","FRONT","FRONT_AND_BACK","setTextureWarned","setTextureCube","getCurrentRenderTarget","activeMipMapLevel","readRenderTargetPixels","restore","IMPLEMENTATION_COLOR_READ_FORMAT","IMPLEMENTATION_COLOR_READ_TYPE","readPixels","drawArraysInstancedANGLE","drawElementsInstancedANGLE","getExtension","getMaxPrecision","HIGH_FLOAT","MEDIUM_FLOAT","MAX_TEXTURE_IMAGE_UNITS","maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_TEXTURE_SIZE","MAX_CUBE_MAP_TEXTURE_SIZE","maxAttributes","MAX_VERTEX_ATTRIBS","maxVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","maxVaryings","MAX_VARYING_VECTORS","maxFragmentUniforms","MAX_FRAGMENT_UNIFORM_VECTORS","vertexTextures","floatFragmentTextures","_maxPrecision","WebGLGeometries","onGeometryDispose","buffergeometry","_bufferGeometry","deleteAttribute","deleteAttributes","bufferproperty","__webglBuffer","removeAttributeBuffer","updateAttribute","attributeProperties","updateBuffer","usage","bufferSubData","edges","checkEdge","list","WebGLProgram","getEncodingComponents","getTexelDecodingFunction","functionName","getTexelEncodingFunction","getToneMappingFunction","toneMappingName","generateExtensions","rendererExtensions","envMapCubeUV","filterEmptyLine","generateDefines","fetchAttributeLocations","identifiers","ACTIVE_ATTRIBUTES","getActiveAttrib","getAttribLocation","replaceLightNums","numDirLights","numSpotLights","numPointLights","numHemiLights","parseIncludes","include","unrollLoops","snippet","unroll","programIdCount","shadowMapTypeDefine","shadowMapType","envMapTypeDefine","envMapModeDefine","envMapBlendingDefine","prefixVertex","prefixFragment","gammaFactorDefine","customExtensions","customDefines","supportsVertexTextures","maxBones","doubleSided","flipSided","shadowMapEnabled","useFog","fogExp","outputEncoding","mapEncoding","envMapEncoding","emissiveMapEncoding","vertexGlsl","fragmentGlsl","glVertexShader","WebGLShader","glFragmentShader","programLog","getProgramInfoLog","vertexLog","getShaderInfoLog","fragmentLog","runnable","haveDiagnostics","LINK_STATUS","getError","VALIDATE_STATUS","diagnostics","prefix","cachedUniforms","cachedAttributes","usedTimes","allocateBones","nVertexUniforms","nVertexMatrices","getTextureEncodingFromMap","gammaOverrideLinear","shaderIDs","parameterNames","nClipPlanes","envMapMode","pl","addLineNumbers","lines","getShaderParameter","COMPILE_STATUS","_renderer","getDepthMaterial","isPointLight","lightPositionWorld","materialVariants","_depthMaterials","customMaterial","customDepthMaterial","_distanceMaterials","customDistanceMaterial","useMorphing","useSkinning","variantIndex","_MorphingFlag","_SkinningFlag","keyA","keyB","materialsForVariant","_materialCache","cachedMaterial","shadowCamera","_renderList","_lightShadows","_shadowMapSize","_lookTarget","_lightPositionWorld","_NumberOfMaterialVariants","cubeDirections","cubeUps","cube2DViewPorts","depthMaterialTemplate","distanceShader","distanceUniforms","depthMaterial","distanceMaterial","USE_SHADOWMAP","faceCount","vpWidth","vpHeight","pars","shadowMatrix","vpDimensions","clearAlpha","maxVertexAttributes","newAttributes","enabledAttributes","attributeDivisors","compressedTextureFormats","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentDepthFunc","currentDepthWrite","currentColorWrite","currentStencilWrite","currentStencilFunc","currentStencilRef","currentStencilMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentFlipSided","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","currentScissorTest","currentTextureSlot","currentBoundTextures","currentClearColor","currentClearDepth","currentClearStencil","currentScissor","currentViewport","LEQUAL","blendFunc","vertexAttribDivisorANGLE","disableVertexAttribArray","formats","COMPRESSED_TEXTURE_FORMATS","blendEquationSeparate","blendFuncSeparate","NEVER","ALWAYS","LESS","EQUAL","GEQUAL","GREATER","NOTEQUAL","depthMask","setStencilFunc","stencilFunc","stencilRef","stencilMask","setStencilOp","stencilFail","stencilZFail","stencilZPass","stencilOp","setStencilTest","setStencilWrite","stencilWrite","factor","units","POLYGON_OFFSET_FILL","getScissorTest","webglSlot","webglType","webglTexture","boundTexture","UniformContainer","arrayCacheF32","arrayCacheI32","flatten","nBlocks","blockSize","firstElem","allocTexUnits","setValue1f","uniform1f","addr","setValue1i","setValue2fv","uniform2fv","uniform2f","setValue3fv","uniform3f","uniform3fv","setValue4fv","setValue2fm","uniformMatrix2fv","setValue3fm","uniformMatrix3fv","setValue4fm","setValueT1","unit","setValueT6","setValue2iv","uniform2iv","setValue3iv","uniform3iv","setValue4iv","uniform4iv","getSingularSetter","setValue1fv","uniform1fv","setValue1iv","uniform1iv","setValueV2a","setValueV3a","setValueV4a","setValueM2a","setValueM3a","setValueM4a","setValueT1a","tex","setValueT6a","getPureArraySetter","SingleUniform","activeInfo","PureArrayUniform","StructuredUniform","RePathPart","addUniform","uniformObject","parseUniform","pathLength","matchEnd","idIsIndex","subscript","next","flares","elementBuffer","tempTexture","occlusionTexture","renderType","occlusionMap","screenPosition","tempPosition","invAspect","halfViewportWidth","halfViewportHeight","screenPositionPixels","validArea","TEXTURE1","copyTexImage2D","sprite","uvOffset","uvScale","fogType","fillStyle","fillRect","spritePosition","spriteRotation","spriteScale","oldFogType","sceneFogType","isIntersectionBox","isIntersectionSphere","multiplyVector3","multiplyVector3Array","extractPosition","multiplyVector4","rotateAxis","crossVector","rotateByAxis","isIntersectionLine","isIntersectionPlane","setEulerFromRotationMatrix","setEulerFromQuaternion","getPositionFromMatrix","getScaleFromMatrix","getColumnFromMatrix","Face4","Vertex","eulerOrder","getChildByName","renderDepth","useQuaternion","ParticleSystem","onlyShadow","shadowCameraFov","shadowCameraLeft","shadowCameraRight","shadowCameraTop","shadowCameraBottom","shadowCameraNear","shadowCameraFar","shadowCameraVisible","shadowDarkness","shadowMapWidth","shadowMapHeight","addIndex","addDrawCall","indexOffset","clearDrawCalls","computeOffsets","wrapAround","wrapRGB","PointCloudMaterial","ParticleBasicMaterial","ParticleSystemMaterial","metal","supportsFloatTextures","supportsHalfFloatTextures","supportsStandardDerivatives","supportsCompressedTextureS3TC","supportsCompressedTexturePVRTC","supportsBlendMinMax","supportsInstancedArrays","enableScissorTest","addPrePlugin","addPostPlugin","updateShadowMap","shadowMapCullFace","GeometryUtils","geometry1","ImageUtils","loadTextureCube","loadCompressedTexture","loadCompressedTextureCube","Projector","projectVector","unprojectVector","pickingRay","CanvasRenderer","MeshFaceMaterial","CurveUtils","tangentQuadraticBezier","tangentCubicBezier","tangentSpline","h00","h10","h01","h11","SceneUtils","createMultiMaterialObject","detach","attach","ShapeUtils","contour","triangulate","snip","verts","px","py","aX","aY","bX","bY","cX","cY","apx","apy","bpx","bpy","cpx","cpy","cCROSSap","bCROSScp","aCROSSbp","vertIndices","nv","triangulateShape","holes","point_in_segment_2D_colin","inSegPt1","inSegPt2","inOtherPt","intersect_segments_2D","inSeg1Pt1","inSeg1Pt2","inSeg2Pt1","inSeg2Pt2","inExcludeAdjacentSegs","seg1dx","seg1dy","seg2dx","seg2dy","seg1seg2dx","seg1seg2dy","limit","perpSeg1","perpSeg2","factorSeg1","seg1Pt","seg2Pt","seg1min","seg1max","seg1minVal","seg1maxVal","seg2min","seg2max","seg2minVal","seg2maxVal","isPointInsideAngle","inVertex","inLegFromPt","inLegToPt","legFromPtX","legFromPtY","legToPtX","legToPtY","otherPtX","otherPtY","from2toAngle","from2otherAngle","other2toAngle","removeHoles","isCutLineInsideAngles","inShapeIdx","inHoleIdx","lastShapeIdx","shape","prevShapeIdx","nextShapeIdx","insideAngle","hole","lastHoleIdx","prevHoleIdx","nextHoleIdx","intersectsShapeEdge","inShapePt","inHolePt","sIdx","nextIdx","intersectsHoleEdge","ihIdx","chkHole","hIdx","indepHoles","holeIndex","shapeIndex","shapePt","holePt","holeIdx","cutKey","tmpShape1","tmpShape2","tmpHole1","tmpHole2","failedCuts","hl","minShapeIndex","counter","h2","allPointsMap","allpoints","shapeWithoutHoles","triangles","isClockWise","pts","b2p0","b2p1","b2p2","b3","b3p0","b3p1","b3p2","b3p3","Curve","getPointAt","getUtoTmapping","getPoints","divisions","getSpacedPoints","lengths","getLengths","cacheArcLengths","current","updateArcLengths","targetArcLength","arcLengths","comparison","lengthBefore","lengthAfter","segmentLength","segmentFraction","getTangent","pt1","pt2","getTangentAt","getPointFunc","CurvePath","curves","autoClose","curve","closePath","startPoint","endPoint","LineCurve","curveLengths","getCurveLengths","lens","cacheLengths","sums","createPointsGeometry","createSpacedPointsGeometry","generateShapes","createPaths","String","resolution","createPath","glyph","glyphs","cpx0","cpy0","cpx1","cpy1","cpx2","cpy2","laste","Path","outline","_cachedOutline","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","ha","shapes","toShapes","fromPoints","lastargs","aCPx","aCPy","QuadraticBezierCurve","aCP1x","aCP1y","aCP2x","aCP2y","CubicBezierCurve","splineThru","npts","SplineCurve","aRadius","aStartAngle","aEndAngle","aClockwise","absarc","absellipse","ellipse","xRadius","yRadius","aRotation","EllipseCurve","lastPoint","item","spts","spline","deltaAngle","tdivisions","isCCW","noHoles","extractSubpaths","inActions","subPaths","lastPath","toShapesNoHoles","inSubpaths","tmpPath","tmpShape","Shape","isPointInsidePolygon","inPt","inPolygon","polyLen","inside","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","solid","holesFirst","tmpPoints","betterShapeHoles","newShapes","newShapeHoles","mainIdx","ambiguous","toChange","sLen","sho","ho","hole_unassigned","s2Idx","froms","tos","tmpHoles","extrude","ExtrudeGeometry","makeGeometry","ShapeGeometry","getPointsHoles","holesPts","extractAllPoints","extractPoints","tangent","point0","point1","point2","point3","ArcCurve","LineCurve3","QuadraticBezierCurve3","CubicBezierCurve3","SplineCurve3","CatmullRomCurve3","CubicPoly","pz","c0","initNonuniformCatmullRom","x3","dt0","dt1","dt2","initCatmullRom","tension","calc","closed","ClosedSplineCurve3","BoxBufferGeometry","CubeGeometry","calculateVertexCount","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","vertexBufferOffset","uvBufferOffset","numberOfVertices","indexBufferOffset","vertexCount","CircleBufferGeometry","ii","segment","CylinderBufferGeometry","calculateIndexCount","generateTorso","tanTheta","indexRow","indexArray","i3","generateCap","centerIndexStart","centerIndexEnd","EdgesGeometry","thresholdAngle","sortFunction","thresholdDot","edge","vert1","vert2","face1","face2","addShapeList","addShape","scalePt2","getBevelVec","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","buildLidFaces","bevelEnabled","layer","vlen","flen","f3","steps","bevelSegments","buildSideFaces","layeroffset","sidewalls","ahole","slen1","slen2","f4","shapesOffset","uvgen","generateTopUV","wallContour","stepIndex","stepsLength","contourIndex1","contourIndex2","generateSideWallUV","extrudePts","splineTube","binormal","position2","bevelThickness","bevelSize","curveSegments","extrudePath","extrudeByPath","UVGenerator","WorldUVGenerator","frames","TubeGeometry","FrenetFrames","shapePoints","bs","vert","contourMovements","oneHoleMovements","holesMovements","verticesMovements","binormals","indexA","indexB","indexC","indexD","LatheBufferGeometry","base","inverseSegments","n1","n2","LatheGeometry","PlaneBufferGeometry","width_half","height_half","segment_width","segment_height","offset2","RingBufferGeometry","radiusStep","thetaSegmentLevel","SphereBufferGeometry","thetaEnd","verticesRow","v4","TextGeometry","font","TorusBufferGeometry","TorusKnotBufferGeometry","calculatePositionOnCurve","cu","su","quOverP","cs","P1","P2","heightScale","taper","NoTaper","ip","jp","uva","uvb","uvc","uvd","grid","numpoints","pos2","tangents","SinusoidalTaper","initialNormal3","smallest","MAX_VALUE","tz","mat","PolyhedronGeometry","prepare","that","azimuth","inclination","make","centroid","azi","correctUV","subdivide","cols","aj","bj","rows","ParametricGeometry","func","slices","stacks","sliceCount","WireframeGeometry","numEdges","ol","numTris","AxisHelper","ArrowHelper","lineGeometry","coneGeometry","headLength","headWidth","cone","setDirection","setColor","BoxHelper","BoundingBoxHelper","CameraHelper","addLine","addPoint","pointMap","hexFrustum","hexCone","hexUp","hexTarget","hexCross","setPoint","DirectionalLightHelper","lightPlane","targetLine","EdgesHelper","FaceNormalsHelper","nNormals","objGeometry","GridHelper","setColors","colorCenterLine","colorGrid","HemisphereLightHelper","sphereSize","lightSphere","PointLightHelper","SkeletonHelper","getBoneList","boneList","matrixWorldInv","boneMatrix","SpotLightHelper","vector2","coneLength","coneWidth","VertexNormalsHelper","objPos","objNorm","WireframeHelper","renderCallback","MorphBlendMesh","animationsMap","animationsList","numFrames","startFrame","endFrame","createAnimation","setAnimationWeight","lastFrame","currentFrame","directionBackwards","mirroredLoop","autoCreateAnimations","firstAnimation","frameRanges","morph","setAnimationDirectionForward","setAnimationDirectionBackward","setAnimationFPS","setAnimationDuration","setAnimationTime","getAnimationTime","getAnimationDuration","stopAnimation","keyframe","runTimeout","cachedSetTimeout","runClearTimeout","marker","cachedClearTimeout","look-controls","wasd-controls","look-controls-enabled","wasd-controls-enabled","user-height","cursor-color","cursor-maxdistance","cursor-offset","cursor-opacity","cursor-scale","cursor-visible","cursor","fuse-timeout","open-ended","theta-length","theta-start","ground-color","meshMixin","segments-width","segments-height","unCamelCase","meshPrimitives","geometryName","geometryHyphened","nowOffset","measure","rStats","iterateKeys","importCSS","Graph","_dom","_defArg","_init","_elWidth","_elHeight","_ctx","_draw","alarm","_current","_max","_alarmCanvas","_dotCanvas","_def","_dotCtx","globalAlpha","_alarmCtx","draw","StackGraph","_num","th","_colours","PerfCounter","_average","average","_accumValue","_accumSamples","_accumStart","avgMs","_averageValue","_start","_time","_settings","userTimingAPI","_started","_end","_tick","_spanValueText","nodeValue","over","_graph","_frame","_total","_set","_spanId","_spanValue","textContent","_div","_perf","idArg","_perfCounters","fractions","_base","legend","graph","colours","_cssFont","_cssRStats","CSSPath","_css","uri","glStats","_h","_rS","_totalDrawArraysCalls","_totalDrawElementsCalls","_totalBindTexures","_totalUseProgramCalls","_totalFaces","_totalVertices","_totalPoints","_attach","WebGLRenderingContext","_values","allcalls","drawelements","drawarrays","_groups","_fractions","renderer.info.memory.geometries","renderer.info.memory.textures","renderer.info.programs","renderer.info.render.calls","renderer.info.render.faces","renderer.info.render.points","renderer.info.render.vertices","BrowserStats","_size","log1024","_usedJSHeapSize","usedJSHeapSize","_totalJSHeapSize","totalJSHeapSize","useColors","firebug","exception","table","$1","formatArgs","humanize","lastC","save","namespaces","removeItem","localstorage","chrome","formatters","getEntityCount","getEntriesByName","_scene","weightSchedule","warpSchedule","loadedObject","skinnedMesh","animName","crossfade","fromAnimName","toAnimName","fromAction","toAction","applyWeight","getWeight","pauseAll","unPauseAll","stopAll","showModel","getForward","forward","raw","getKeyValueChunks","Boolean","nextSplit","sep","hasUnclosedUrl","chunk","regexp","vertex_pattern","normal_pattern","uv_pattern","face_vertex","face_vertex_uv","face_vertex_uv_normal","face_vertex_normal","object_pattern","smoothing_pattern","material_library_pattern","material_use_pattern","_createParserState","materialLibraries","startObject","fromDeclaration","smooth","parseVertexIndex","parseNormalIndex","parseUVIndex","addVertex","addVertexLine","addNormal","addUV","addUVLine","ub","uc","ud","na","nb","nc","nd","vLen","ia","ib","ic","uvLen","nLen","addLineGeometry","vi","uvi","lineFirstChar","lineSecondChar","lineLength","trimLeft","lineParts","lineVertices","lineUVs","li","llen","isLine","materialLine","timeEnd","baseUrl","setMaterialOptions","materialOptions","delimiter_pattern","materialsInfo","ss","materialCreator","MaterialCreator","setManager","materialsArray","nameLookup","convert","converted","mn","covmat","lprop","normalizeRGB","ignoreZeroRGBs","materialName","getAsArray","createMaterial_","selectColor","prevColor","disabled","curr","prev","coerce","formatter","logFn","skips","stack","readyCallback","progressCallback","failCallback","implementation","createDocument","onreadystatechange","readyCallbackFunc","getResponseHeader","responseText","alert","callBack","COLLADA","DOMParser","parseFromString","parseAsset","setUpConversion","parseLib","_Image","effects","Effect","cameras","Controller","Animation","visualScenes","VisualScene","kinematicsModels","KinematicsModel","morphs","skins","visualScene","parseScene","nodes","createSceneGraph","colladaUnit","createAnimations","kinematicsModel","parseKinematicsModel","createKinematics","animData","kinematics","dae","setPreferredShading","preferredShading","childNodes","meter","colladaUp","classSpec","lib","elementsLength","daeElement","sceneElement","kinematicsModelElement","recurseHierarchy","getChildById","colladaId","sids","calcAnimationBounds","ID","sampler","createMorph","ctrl","morphCtrl","InstanceController","target_id","daeGeometry","setupSkeleton","world","localworld","channels","setupSkinningMatrices","found","joints","sid","inv","invBindMatrices","invBindMatrix","skinningMatrix","animatrix","weights","joint","flattenSkeleton","walk","parentid","skinToBindPose","skinController","skinned","applySkin","instanceCtrl","animationBounds","getChildBySid","bonelist","sortedbones","bindShapeMatrix","indicies","animationdata","rot","jointMap","_addToMap","jointIndex","parentVisualElement","parentVisualElementId","colladaNode","zeroPosition","getJointValue","jointData","setJointValue","limits","static","threejsNode","transform","elementsFloat32Arr","elementsRowMajor","visualTarget","visualTargetElement","morphController","inst_geom","InstanceGeometry","instance_material","second","double_sided_materials","first_material","instance_geometry","instance_materials","used_materials","used_materials_array","num_materials","effect_id","instance_effect","material3js","symbol","_copied_material","geom","geometry3js","daeMaterial","isLineStrip","instance_camera","cparams","cam","yfov","aspect_ratio","znear","zfar","instance_light","lparams","technique","falloff_angle","centerGeometry","getLibraryNode","attObj","getNamedItem","getChannelsForNode","bakeAnimations","member","fullSid","getTransformBySid","arrIndices","getConvertedIndex","getConvertedMember","findKey","Key","timeNdx","findTimeNdx","addTarget","hasTarget","interpolateKeys","retVal","ndx","prevKey","getPrevKeyWith","getNextKeyWith","prevTarget","getTarget","nextData","init_from","Morph","method","Skin","Transform","InstanceMaterial","Polygons","inputs","vcount","Polylist","LineStrips","Triangles","Accessor","Vertices","Input","semantic","Source","ColorOrTexture","texcoord","texOpts","Surface","Sampler2D","wrap_s","wrap_t","minfilter","magfilter","mipfilter","surface","InstanceEffect","Channel","dotSyntax","arrSyntax","Sampler","strideOut","InstanceCamera","InstanceLight","links","Joint","middlePosition","attachments","Attachment","_source","sources","_bools","_strings","_floats","_ints","_trimString","_attr_as_int","loadTextureImage","extractDoubleSided","upAxis","upConversion","fixCoords","getConvertedTranslation","getConvertedVec3","arr","getConvertedMat4","members","subdivideFaces","defaultEnvMap","parseInputs","read","parseJoints","parseWeights","numBones","vertex_weights","getChannelForTransform","transformSid","iNode","instance","vertexData","setVertices","handlePrimitive","calcNormals","idx32","numParams","pList","vcIndex","maxOffset","texture_sets","pCount","vs","ns","ts","accessor","NORMAL","TEXCOORD","COLOR","uvArr","clr","param","isTexture","opaque","rgba","offsetU","offsetV","repeatU","repeatV","wrapU","wrapV","parseTexture","bumpType","transparencyLevel","transparency","emission","bump","cot","samplerId","surfaceId","parseTechnique","parseProfileCOMMON","parseNewparam","_image","parseExtra","parseExtraTechnique","anim","opt_sid","nextTarget","parseOptics","perspective","xfov","orthographic","xmag","ymag","parseCommon","profile","axisElement","_axis","jointTypes","jointElement","isIFrame","appendQueryParameter","getQueryParameter","short","long","plural"],"mappings":"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","file":"bundle.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o dist/aframe.js\",\"dist:min\":\"npm run browserify -s -- --debug -p [minifyify --map aframe.min.js.map --output dist/aframe.min.js.map] -o dist/aframe.min.js\",\"dist:release\":\"npm run dist:release:min && npm run dist:release:max\",\"dist:release:max\":\"npm run browserify -s -- --debug | exorcist dist/aframe-v0.3.0.js.map > dist/aframe-v0.3.0.js\",\"dist:release:min\":\"npm run browserify -s -- --debug -p [minifyify --map aframe-v0.3.0.min.js.map --output dist/aframe-v0.3.0.min.js.map] -o dist/aframe-v0.3.0.min.js\",\"gh-pages\":\"npm run ghpages\",\"ghpages\":\"node ./scripts/gh-pages\",\"lint\":\"semistandard -v | snazzy\",\"precommit\":\"npm run lint\",\"preghpages\":\"npm run dist && rimraf gh-pages && mkdirp gh-pages && cp -r {.nojekyll,dist,lib,examples,index.html,style} gh-pages/. 2>/dev/null || : && git checkout dist/ && replace 'build/aframe.js' 'dist/aframe.min.js' gh-pages/ -r --silent\",\"release:bump\":\"npm run dist && git commit -am 'bump dist' && npm version patch --preminor\",\"release:push\":\"npm login && npm publish && git push --follow-tags\",\"start\":\"npm run dev\",\"test\":\"karma start ./tests/karma.conf.js\",\"test:firefox\":\"karma start ./tests/karma.conf.js --browsers Firefox\",\"test:chrome\":\"karma start ./tests/karma.conf.js --browsers Chrome\",\"test:ci\":\"TEST_ENV=ci karma start ./tests/karma.conf.js --single-run --browsers Firefox\",\"version\":\"npm run dist\"},\"repository\":\"aframevr/aframe\",\"license\":\"MIT\",\"dependencies\":{\"debug\":\"^2.2.0\",\"deep-assign\":\"^2.0.0\",\"document-register-element\":\"dmarcos/document-register-element#8ccc532b7\",\"promise-polyfill\":\"^3.1.0\",\"object-assign\":\"^4.0.1\",\"present\":\"0.0.6\",\"style-attr\":\"^1.0.2\",\"three\":\"^0.76.1\",\"tween.js\":\"^15.0.0\",\"webvr-polyfill\":\"0.9.15\"},\"devDependencies\":{\"browserify\":\"^13.1.0\",\"browserify-css\":\"^0.8.2\",\"browserify-derequire\":\"^0.9.4\",\"browserify-istanbul\":\"^2.0.0\",\"budo\":\"^8.1.0\",\"chai\":\"^3.5.0\",\"chai-shallow-deep-equal\":\"^1.3.0\",\"codecov\":\"^1.0.1\",\"exorcist\":\"^0.4.0\",\"gh-pages\":\"^0.6.0\",\"husky\":\"^0.10.1\",\"istanbul\":\"^0.4.4\",\"karma\":\"^1.2.0\",\"karma-browserify\":\"^5.1.0\",\"karma-chai-shallow-deep-equal\":\"0.0.4\",\"karma-chrome-launcher\":\"^1.0.1\",\"karma-coverage\":\"^1.1.1\",\"karma-env-preprocessor\":\"^0.1.1\",\"karma-firefox-launcher\":\"^1.0.0\",\"karma-mocha\":\"^1.1.1\",\"karma-mocha-reporter\":\"^2.1.0\",\"karma-sinon-chai\":\"^1.2.3\",\"lolex\":\"^1.5.1\",\"minifyify\":\"^7.3.3\",\"mkdirp\":\"0.5.1\",\"mocha\":\"^3.0.2\",\"mozilla-download\":\"^1.0.5\",\"open\":\"0.0.5\",\"replace\":\"^0.3.0\",\"rimraf\":\"2.5.0\",\"semistandard\":\"^7.0.2\",\"sinon\":\"^1.17.5\",\"sinon-chai\":\"^2.8.0\",\"snazzy\":\"^3.0.0\",\"uglifyjs\":\"^2.4.10\"},\"link\":true,\"browserify\":{\"transform\":[\"browserify-css\"]},\"semistandard\":{\"ignore\":[\"build/**\",\"dist/**\",\"examples/**/shaders/*.js\",\"**/vendor/**\"]},\"keywords\":[\"3d\",\"aframe\",\"cardboard\",\"components\",\"oculus\",\"three\",\"three.js\",\"rift\",\"vive\",\"vr\",\"web-components\",\"webvr\"],\"browserify-css\":{\"minify\":true},\"engines\":{\"node\":\">= 0.12.7\",\"npm\":\"^2.12.1\"}}","var css = \".a-html{bottom:0;left:0;position:fixed;right:0;top:0}.a-body{height:100%;margin:0;overflow:hidden;padding:0;width:100%}:-webkit-full-screen{background-color:transparent}.a-hidden{display:none!important}.a-canvas{height:100%;left:0;position:absolute;top:0;width:100%}.a-canvas.a-grab-cursor:hover{cursor:grab;cursor:-moz-grabbing;cursor:-webkit-grab}.a-canvas.a-grab-cursor:active,.a-grabbing{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}// Class is removed when doing . .a-canvas.fullscreen{width:100%!important;height:100%!important;top:0!important;left:0!important;right:0!important;bottom:0!important;z-index:999999!important;position:fixed!important}a-scene{display:block;position:relative;height:100%;width:100%}a-assets,a-scene audio,a-scene img,a-scene video{display:none}.a-enter-vr-modal,.a-orientation-modal{font-family:Consolas,Andale Mono,Courier New,monospace}.a-enter-vr-modal a{border-bottom:1px solid #fff;padding:2px 0;text-decoration:none;transition:.1s color ease-in}.a-enter-vr-modal a:hover{background-color:#fff;color:#111;padding:2px 4px;position:relative;left:-4px}.a-enter-vr{font-family:sans-serif,monospace;font-size:13px;width:100%;font-weight:200;line-height:16px;height:10%;position:absolute;right:20px;bottom:20px}.a-enter-vr.embedded{right:5px;bottom:5px}.a-enter-vr-button,.a-enter-vr-modal,.a-enter-vr-modal a{color:#fff}.a-enter-vr-button{background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20245.82%20141.73%22%3E%3Cdefs%3E%3Cstyle%3E.a%7Bfill%3A%23fff%3Bfill-rule%3Aevenodd%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Ctitle%3Emask%3C%2Ftitle%3E%3Cpath%20class%3D%22a%22%20d%3D%22M175.56%2C111.37c-22.52%2C0-40.77-18.84-40.77-42.07S153%2C27.24%2C175.56%2C27.24s40.77%2C18.84%2C40.77%2C42.07S198.08%2C111.37%2C175.56%2C111.37ZM26.84%2C69.31c0-23.23%2C18.25-42.07%2C40.77-42.07s40.77%2C18.84%2C40.77%2C42.07-18.26%2C42.07-40.77%2C42.07S26.84%2C92.54%2C26.84%2C69.31ZM27.27%2C0C11.54%2C0%2C0%2C12.34%2C0%2C28.58V110.9c0%2C16.24%2C11.54%2C30.83%2C27.27%2C30.83H99.57c2.17%2C0%2C4.19-1.83%2C5.4-3.7L116.47%2C118a8%2C8%2C0%2C0%2C1%2C12.52-.18l11.51%2C20.34c1.2%2C1.86%2C3.22%2C3.61%2C5.39%2C3.61h72.29c15.74%2C0%2C27.63-14.6%2C27.63-30.83V28.58C245.82%2C12.34%2C233.93%2C0%2C218.19%2C0H27.27Z%22%2F%3E%3C%2Fsvg%3E) 50% 50%/70% 70% no-repeat rgba(0,0,0,.35);border:0;bottom:0;cursor:pointer;min-width:50px;min-height:30px;padding-right:5%;padding-top:4%;position:absolute;right:0;transition:background-color .05s ease;-webkit-transition:background-color .05s ease;z-index:9999}.a-enter-vr-button:active,.a-enter-vr-button:hover{background-color:#666}[data-a-enter-vr-no-webvr] .a-enter-vr-button{border-color:#666;opacity:.65}[data-a-enter-vr-no-webvr] .a-enter-vr-button:active,[data-a-enter-vr-no-webvr] .a-enter-vr-button:hover{background-color:rgba(0,0,0,.35);cursor:not-allowed}.a-enter-vr-modal{background-color:#666;border-radius:0;display:none;min-height:32px;margin-right:70px;padding:9px;width:280px;right:2%;position:absolute}.a-enter-vr-modal:after{border-bottom:10px solid transparent;border-left:10px solid #666;border-top:10px solid transparent;display:inline-block;content:'';position:absolute;right:-5px;top:5px;width:0;height:0}.a-enter-vr-modal a,.a-enter-vr-modal p{display:inline}.a-enter-vr-modal p{margin:0}.a-enter-vr-modal p:after{content:' '}[data-a-enter-vr-no-headset].a-enter-vr:hover .a-enter-vr-modal,[data-a-enter-vr-no-webvr].a-enter-vr:hover .a-enter-vr-modal{display:block}.a-orientation-modal{background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20version%3D%221.1%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2090%2090%22%20enable-background%3D%22new%200%200%2090%2090%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%220%2C0%200%2C0%200%2C0%20%22%3E%3C/polygon%3E%3Cg%3E%3Cpath%20d%3D%22M71.545%2C48.145h-31.98V20.743c0-2.627-2.138-4.765-4.765-4.765H18.456c-2.628%2C0-4.767%2C2.138-4.767%2C4.765v42.789%20%20%20c0%2C2.628%2C2.138%2C4.766%2C4.767%2C4.766h5.535v0.959c0%2C2.628%2C2.138%2C4.765%2C4.766%2C4.765h42.788c2.628%2C0%2C4.766-2.137%2C4.766-4.765V52.914%20%20%20C76.311%2C50.284%2C74.173%2C48.145%2C71.545%2C48.145z%20M18.455%2C16.935h16.344c2.1%2C0%2C3.808%2C1.708%2C3.808%2C3.808v27.401H37.25V22.636%20%20%20c0-0.264-0.215-0.478-0.479-0.478H16.482c-0.264%2C0-0.479%2C0.214-0.479%2C0.478v36.585c0%2C0.264%2C0.215%2C0.478%2C0.479%2C0.478h7.507v7.644%20%20%20h-5.534c-2.101%2C0-3.81-1.709-3.81-3.81V20.743C14.645%2C18.643%2C16.354%2C16.935%2C18.455%2C16.935z%20M16.96%2C23.116h19.331v25.031h-7.535%20%20%20c-2.628%2C0-4.766%2C2.139-4.766%2C4.768v5.828h-7.03V23.116z%20M71.545%2C73.064H28.757c-2.101%2C0-3.81-1.708-3.81-3.808V52.914%20%20%20c0-2.102%2C1.709-3.812%2C3.81-3.812h42.788c2.1%2C0%2C3.809%2C1.71%2C3.809%2C3.812v16.343C75.354%2C71.356%2C73.645%2C73.064%2C71.545%2C73.064z%22%3E%3C/path%3E%3Cpath%20d%3D%22M28.919%2C58.424c-1.466%2C0-2.659%2C1.193-2.659%2C2.66c0%2C1.466%2C1.193%2C2.658%2C2.659%2C2.658c1.468%2C0%2C2.662-1.192%2C2.662-2.658%20%20%20C31.581%2C59.617%2C30.387%2C58.424%2C28.919%2C58.424z%20M28.919%2C62.786c-0.939%2C0-1.703-0.764-1.703-1.702c0-0.939%2C0.764-1.704%2C1.703-1.704%20%20%20c0.94%2C0%2C1.705%2C0.765%2C1.705%2C1.704C30.623%2C62.022%2C29.858%2C62.786%2C28.919%2C62.786z%22%3E%3C/path%3E%3Cpath%20d%3D%22M69.654%2C50.461H33.069c-0.264%2C0-0.479%2C0.215-0.479%2C0.479v20.288c0%2C0.264%2C0.215%2C0.478%2C0.479%2C0.478h36.585%20%20%20c0.263%2C0%2C0.477-0.214%2C0.477-0.478V50.939C70.131%2C50.676%2C69.917%2C50.461%2C69.654%2C50.461z%20M69.174%2C51.417V70.75H33.548V51.417H69.174z%22%3E%3C/path%3E%3Cpath%20d%3D%22M45.201%2C30.296c6.651%2C0%2C12.233%2C5.351%2C12.551%2C11.977l-3.033-2.638c-0.193-0.165-0.507-0.142-0.675%2C0.048%20%20%20c-0.174%2C0.198-0.153%2C0.501%2C0.045%2C0.676l3.883%2C3.375c0.09%2C0.075%2C0.198%2C0.115%2C0.312%2C0.115c0.141%2C0%2C0.273-0.061%2C0.362-0.166%20%20%20l3.371-3.877c0.173-0.2%2C0.151-0.502-0.047-0.675c-0.194-0.166-0.508-0.144-0.676%2C0.048l-2.592%2C2.979%20%20%20c-0.18-3.417-1.629-6.605-4.099-9.001c-2.538-2.461-5.877-3.817-9.404-3.817c-0.264%2C0-0.479%2C0.215-0.479%2C0.479%20%20%20C44.72%2C30.083%2C44.936%2C30.296%2C45.201%2C30.296z%22%3E%3C/path%3E%3C/g%3E%3C/svg%3E) center/50% 50% no-repeat rgba(244,244,244,1);bottom:0;font-size:14px;font-weight:600;left:0;line-height:20px;right:0;position:fixed;top:0;z-index:9999999}.a-orientation-modal:after{color:#666;content:\\\"Insert phone into Cardboard holder.\\\";display:block;position:absolute;text-align:center;top:70%;transform:translateY(-70%);width:100%}.a-orientation-modal button{background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20version%3D%221.1%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%20100%20100%22%20enable-background%3D%22new%200%200%20100%20100%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M55.209%2C50l17.803-17.803c1.416-1.416%2C1.416-3.713%2C0-5.129c-1.416-1.417-3.713-1.417-5.129%2C0L50.08%2C44.872%20%20L32.278%2C27.069c-1.416-1.417-3.714-1.417-5.129%2C0c-1.417%2C1.416-1.417%2C3.713%2C0%2C5.129L44.951%2C50L27.149%2C67.803%20%20c-1.417%2C1.416-1.417%2C3.713%2C0%2C5.129c0.708%2C0.708%2C1.636%2C1.062%2C2.564%2C1.062c0.928%2C0%2C1.856-0.354%2C2.564-1.062L50.08%2C55.13l17.803%2C17.802%20%20c0.708%2C0.708%2C1.637%2C1.062%2C2.564%2C1.062s1.856-0.354%2C2.564-1.062c1.416-1.416%2C1.416-3.713%2C0-5.129L55.209%2C50z%22%3E%3C/path%3E%3C/svg%3E) no-repeat;border:none;height:50px;text-indent:-9999px;width:50px}\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"src/style/aframe.css\"})); module.exports = css;","var css = \".rs-base{background-color:#333;border-radius:0;font:10px monospace;left:5px;line-height:1em;opacity:.85;overflow:hidden;padding:10px;position:fixed;top:5px;width:300px;z-index:10000}.rs-base div.hidden{display:none}.rs-base h1{color:#fff;cursor:pointer;font-size:1.4em;font-weight:300;margin:0 0 5px;padding:0}.rs-group{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column-reverse;flex-direction:column-reverse;margin-bottom:5px}.rs-group:last-child{margin-bottom:0}.rs-counter-base{align-items:center;display:-webkit-box;display:-webkit-flex;display:flex;height:10px;-webkit-justify-content:space-between;justify-content:space-between;margin:2px 0}.rs-counter-id{font-weight:300;-webkit-box-ordinal-group:0;-webkit-order:0;order:0;width:54px}.rs-counter-value{font-weight:300;-webkit-box-ordinal-group:1;-webkit-order:1;order:1;text-align:right;width:35px}.rs-canvas{-webkit-box-ordinal-group:2;-webkit-order:2;order:2}@media (min-width:480px){.rs-base{left:20px;top:20px}}\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"src/style/rStats.css\"})); module.exports = css;","// Polyfill `Promise`.\nwindow.Promise = window.Promise || require('promise-polyfill');\n\n// Check before the polyfill runs\nwindow.hasNativeWebVRImplementation = !!navigator.getVRDisplays || !!navigator.getVRDevices;\n\nwindow.WebVRConfig = window.WebVRConfig || {\n BUFFER_SCALE: 1,\n CARDBOARD_UI_DISABLED: true,\n ROTATE_INSTRUCTIONS_DISABLED: true,\n TOUCH_PANNER_DISABLED: true,\n MOUSE_KEYBOARD_CONTROLS_DISABLED: true\n};\n\n// Workaround for iOS Safari canvas sizing issues in stereo (webvr-polyfill/issues/102).\n// Should be fixed in iOS 10.\nif (/(iphone|ipod|ipad).*os.*(7|8|9)/i.test(navigator.userAgent)) {\n window.WebVRConfig.BUFFER_SCALE = 1 / window.devicePixelRatio;\n}\n\n// WebVR polyfill\nrequire('webvr-polyfill');\n\nrequire('present'); // Polyfill `performance.now()`.\n// CSS.\nrequire('./style/aframe.css');\nrequire('./style/rStats.css');\n\n// Required before `AEntity` so that all components are registered.\nvar AScene = require('./core/scene/a-scene');\nvar components = require('./core/component').components;\nvar registerComponent = require('./core/component').registerComponent;\nvar registerGeometry = require('./core/geometry').registerGeometry;\nvar registerPrimitive = require('./extras/primitives/primitives').registerPrimitive;\nvar registerShader = require('./core/shader').registerShader;\nvar registerSystem = require('./core/system').registerSystem;\nvar shaders = require('./core/shader').shaders;\nvar systems = require('./core/system').systems;\n// Exports THREE to window so three.js can be used without alteration.\nvar THREE = window.THREE = require('./lib/three');\nvar TWEEN = window.TWEEN = require('tween.js');\n\nvar pkg = require('../package');\nvar utils = require('./utils/');\n\nrequire('./components/index'); // Register standard components.\nrequire('./geometries/index'); // Register standard geometries.\nrequire('./shaders/index'); // Register standard shaders.\nrequire('./systems/index'); // Register standard systems.\nvar ANode = require('./core/a-node');\nvar AEntity = require('./core/a-entity'); // Depends on ANode and core components.\n\nrequire('./core/a-animation');\nrequire('./core/a-assets');\nrequire('./core/a-cubemap');\nrequire('./core/a-mixin');\n\n// Extras.\nrequire('./extras/components/');\nrequire('./extras/declarative-events/');\nrequire('./extras/primitives/');\n\nconsole.log('A-Frame Version:', pkg.version);\nconsole.log('three Version:', pkg.dependencies['three']);\nconsole.log('WebVR Polyfill Version:', pkg.dependencies['webvr-polyfill']);\n\nmodule.exports = window.AFRAME = {\n AEntity: AEntity,\n ANode: ANode,\n AScene: AScene,\n components: components,\n geometries: require('./core/geometry').geometries,\n registerComponent: registerComponent,\n registerElement: require('./core/a-register-element').registerElement,\n registerGeometry: registerGeometry,\n registerPrimitive: registerPrimitive,\n registerShader: registerShader,\n registerSystem: registerSystem,\n primitives: {\n getMeshMixin: require('./extras/primitives/getMeshMixin'),\n primitives: require('./extras/primitives/primitives').primitives\n },\n schema: require('./core/schema'),\n shaders: shaders,\n systems: systems,\n THREE: THREE,\n TWEEN: TWEEN,\n utils: utils,\n version: pkg.version\n};\n","(function(root) {\n\n\t// Store setTimeout reference so promise-polyfill will be unaffected by\n\t// other code modifying setTimeout (like sinon.useFakeTimers())\n\tvar setTimeoutFunc = setTimeout;\n\n\t// Use polyfill for setImmediate for performance gains\n\tvar asap = (typeof setImmediate === 'function' && setImmediate) ||\n\t\tfunction(fn) { setTimeoutFunc(fn, 1); };\n\n\t// Polyfill for Function.prototype.bind\n\tfunction bind(fn, thisArg) {\n\t\treturn function() {\n\t\t\tfn.apply(thisArg, arguments);\n\t\t}\n\t}\n\n\tvar isArray = Array.isArray || function(value) { return Object.prototype.toString.call(value) === \"[object Array]\" };\n\n\tfunction Promise(fn) {\n\t\tif (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');\n\t\tif (typeof fn !== 'function') throw new TypeError('not a function');\n\t\tthis._state = null;\n\t\tthis._value = null;\n\t\tthis._deferreds = []\n\n\t\tdoResolve(fn, bind(resolve, this), bind(reject, this))\n\t}\n\n\tfunction handle(deferred) {\n\t\tvar me = this;\n\t\tif (this._state === null) {\n\t\t\tthis._deferreds.push(deferred);\n\t\t\treturn\n\t\t}\n\t\tasap(function() {\n\t\t\tvar cb = me._state ? deferred.onFulfilled : deferred.onRejected\n\t\t\tif (cb === null) {\n\t\t\t\t(me._state ? deferred.resolve : deferred.reject)(me._value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar ret;\n\t\t\ttry {\n\t\t\t\tret = cb(me._value);\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\tdeferred.reject(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdeferred.resolve(ret);\n\t\t})\n\t}\n\n\tfunction resolve(newValue) {\n\t\ttry { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n\t\t\tif (newValue === this) throw new TypeError('A promise cannot be resolved with itself.');\n\t\t\tif (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n\t\t\t\tvar then = newValue.then;\n\t\t\t\tif (typeof then === 'function') {\n\t\t\t\t\tdoResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._state = true;\n\t\t\tthis._value = newValue;\n\t\t\tfinale.call(this);\n\t\t} catch (e) { reject.call(this, e); }\n\t}\n\n\tfunction reject(newValue) {\n\t\tthis._state = false;\n\t\tthis._value = newValue;\n\t\tfinale.call(this);\n\t}\n\n\tfunction finale() {\n\t\tfor (var i = 0, len = this._deferreds.length; i < len; i++) {\n\t\t\thandle.call(this, this._deferreds[i]);\n\t\t}\n\t\tthis._deferreds = null;\n\t}\n\n\tfunction Handler(onFulfilled, onRejected, resolve, reject){\n\t\tthis.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n\t\tthis.onRejected = typeof onRejected === 'function' ? onRejected : null;\n\t\tthis.resolve = resolve;\n\t\tthis.reject = reject;\n\t}\n\n\t/**\n\t * Take a potentially misbehaving resolver function and make sure\n\t * onFulfilled and onRejected are only called once.\n\t *\n\t * Makes no guarantees about asynchrony.\n\t */\n\tfunction doResolve(fn, onFulfilled, onRejected) {\n\t\tvar done = false;\n\t\ttry {\n\t\t\tfn(function (value) {\n\t\t\t\tif (done) return;\n\t\t\t\tdone = true;\n\t\t\t\tonFulfilled(value);\n\t\t\t}, function (reason) {\n\t\t\t\tif (done) return;\n\t\t\t\tdone = true;\n\t\t\t\tonRejected(reason);\n\t\t\t})\n\t\t} catch (ex) {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tonRejected(ex);\n\t\t}\n\t}\n\n\tPromise.prototype['catch'] = function (onRejected) {\n\t\treturn this.then(null, onRejected);\n\t};\n\n\tPromise.prototype.then = function(onFulfilled, onRejected) {\n\t\tvar me = this;\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\thandle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));\n\t\t})\n\t};\n\n\tPromise.all = function () {\n\t\tvar args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments);\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (args.length === 0) return resolve([]);\n\t\t\tvar remaining = args.length;\n\t\t\tfunction res(i, val) {\n\t\t\t\ttry {\n\t\t\t\t\tif (val && (typeof val === 'object' || typeof val === 'function')) {\n\t\t\t\t\t\tvar then = val.then;\n\t\t\t\t\t\tif (typeof then === 'function') {\n\t\t\t\t\t\t\tthen.call(val, function (val) { res(i, val) }, reject);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\targs[i] = val;\n\t\t\t\t\tif (--remaining === 0) {\n\t\t\t\t\t\tresolve(args);\n\t\t\t\t\t}\n\t\t\t\t} catch (ex) {\n\t\t\t\t\treject(ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var i = 0; i < args.length; i++) {\n\t\t\t\tres(i, args[i]);\n\t\t\t}\n\t\t});\n\t};\n\n\tPromise.resolve = function (value) {\n\t\tif (value && typeof value === 'object' && value.constructor === Promise) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn new Promise(function (resolve) {\n\t\t\tresolve(value);\n\t\t});\n\t};\n\n\tPromise.reject = function (value) {\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\treject(value);\n\t\t});\n\t};\n\n\tPromise.race = function (values) {\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tfor(var i = 0, len = values.length; i < len; i++) {\n\t\t\t\tvalues[i].then(resolve, reject);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Set the immediate function to execute callbacks\n\t * @param fn {function} Function to execute\n\t * @private\n\t */\n\tPromise._setImmediateFn = function _setImmediateFn(fn) {\n\t\tasap = fn;\n\t};\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = Promise;\n\t} else if (!root.Promise) {\n\t\troot.Promise = Promise;\n\t}\n\n})(this);\n","var performance = global.performance || {};\n\nvar present = (function () {\n var names = ['now', 'webkitNow', 'msNow', 'mozNow', 'oNow'];\n while (names.length) {\n var name = names.shift();\n if (name in performance) {\n return performance[name].bind(performance);\n }\n }\n\n var dateNow = Date.now || function () { return new Date().getTime(); };\n var navigationStart = (performance.timing || {}).navigationStart || dateNow();\n return function () {\n return dateNow() - navigationStart;\n };\n}());\n\npresent.performanceNow = performance.now;\npresent.noConflict = function () {\n performance.now = present.performanceNow;\n};\npresent.conflict = function () {\n performance.now = present;\n};\npresent.conflict();\n\nmodule.exports = present;\n","/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/sole/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/sole/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\n\n// performance.now polyfill\n( function ( root ) {\n\n\tif ( 'performance' in root === false ) {\n\t\troot.performance = {};\n\t}\n\n\t// IE 8\n\tDate.now = ( Date.now || function () {\n\t\treturn new Date().getTime();\n\t} );\n\n\tif ( 'now' in root.performance === false ) {\n\t\tvar offset = root.performance.timing && root.performance.timing.navigationStart ? performance.timing.navigationStart\n\t\t : Date.now();\n\n\t\troot.performance.now = function () {\n\t\t\treturn Date.now() - offset;\n\t\t};\n\t}\n\n} )( this );\n\nvar TWEEN = TWEEN || ( function () {\n\n\tvar _tweens = [];\n\n\treturn {\n\n\t\tREVISION: '14',\n\n\t\tgetAll: function () {\n\n\t\t\treturn _tweens;\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\t_tweens = [];\n\n\t\t},\n\n\t\tadd: function ( tween ) {\n\n\t\t\t_tweens.push( tween );\n\n\t\t},\n\n\t\tremove: function ( tween ) {\n\n\t\t\tvar i = _tweens.indexOf( tween );\n\n\t\t\tif ( i !== -1 ) {\n\n\t\t\t\t_tweens.splice( i, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: function ( time ) {\n\n\t\t\tif ( _tweens.length === 0 ) return false;\n\n\t\t\tvar i = 0;\n\n\t\t\ttime = time !== undefined ? time : window.performance.now();\n\n\t\t\twhile ( i < _tweens.length ) {\n\n\t\t\t\tif ( _tweens[ i ].update( time ) ) {\n\n\t\t\t\t\ti++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_tweens.splice( i, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\t};\n\n} )();\n\nTWEEN.Tween = function ( object ) {\n\n\tvar _object = object;\n\tvar _valuesStart = {};\n\tvar _valuesEnd = {};\n\tvar _valuesStartRepeat = {};\n\tvar _duration = 1000;\n\tvar _repeat = 0;\n\tvar _yoyo = false;\n\tvar _isPlaying = false;\n\tvar _reversed = false;\n\tvar _delayTime = 0;\n\tvar _startTime = null;\n\tvar _easingFunction = TWEEN.Easing.Linear.None;\n\tvar _interpolationFunction = TWEEN.Interpolation.Linear;\n\tvar _chainedTweens = [];\n\tvar _onStartCallback = null;\n\tvar _onStartCallbackFired = false;\n\tvar _onUpdateCallback = null;\n\tvar _onCompleteCallback = null;\n\tvar _onStopCallback = null;\n\n\t// Set all starting values present on the target object\n\tfor ( var field in object ) {\n\n\t\t_valuesStart[ field ] = parseFloat(object[field], 10);\n\n\t}\n\n\tthis.to = function ( properties, duration ) {\n\n\t\tif ( duration !== undefined ) {\n\n\t\t\t_duration = duration;\n\n\t\t}\n\n\t\t_valuesEnd = properties;\n\n\t\treturn this;\n\n\t};\n\n\tthis.start = function ( time ) {\n\n\t\tTWEEN.add( this );\n\n\t\t_isPlaying = true;\n\n\t\t_onStartCallbackFired = false;\n\n\t\t_startTime = time !== undefined ? time : window.performance.now();\n\t\t_startTime += _delayTime;\n\n\t\tfor ( var property in _valuesEnd ) {\n\n\t\t\t// check if an Array was provided as property value\n\t\t\tif ( _valuesEnd[ property ] instanceof Array ) {\n\n\t\t\t\tif ( _valuesEnd[ property ].length === 0 ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// create a local copy of the Array with the start value at the front\n\t\t\t\t_valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );\n\n\t\t\t}\n\n\t\t\t_valuesStart[ property ] = _object[ property ];\n\n\t\t\tif( ( _valuesStart[ property ] instanceof Array ) === false ) {\n\t\t\t\t_valuesStart[ property ] *= 1.0; // Ensures we're using numbers, not strings\n\t\t\t}\n\n\t\t\t_valuesStartRepeat[ property ] = _valuesStart[ property ] || 0;\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tthis.stop = function () {\n\n\t\tif ( !_isPlaying ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tTWEEN.remove( this );\n\t\t_isPlaying = false;\n\n\t\tif ( _onStopCallback !== null ) {\n\n\t\t\t_onStopCallback.call( _object );\n\n\t\t}\n\n\t\tthis.stopChainedTweens();\n\t\treturn this;\n\n\t};\n\n\tthis.stopChainedTweens = function () {\n\n\t\tfor ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {\n\n\t\t\t_chainedTweens[ i ].stop();\n\n\t\t}\n\n\t};\n\n\tthis.delay = function ( amount ) {\n\n\t\t_delayTime = amount;\n\t\treturn this;\n\n\t};\n\n\tthis.repeat = function ( times ) {\n\n\t\t_repeat = times;\n\t\treturn this;\n\n\t};\n\n\tthis.yoyo = function( yoyo ) {\n\n\t\t_yoyo = yoyo;\n\t\treturn this;\n\n\t};\n\n\n\tthis.easing = function ( easing ) {\n\n\t\t_easingFunction = easing;\n\t\treturn this;\n\n\t};\n\n\tthis.interpolation = function ( interpolation ) {\n\n\t\t_interpolationFunction = interpolation;\n\t\treturn this;\n\n\t};\n\n\tthis.chain = function () {\n\n\t\t_chainedTweens = arguments;\n\t\treturn this;\n\n\t};\n\n\tthis.onStart = function ( callback ) {\n\n\t\t_onStartCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.onUpdate = function ( callback ) {\n\n\t\t_onUpdateCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.onComplete = function ( callback ) {\n\n\t\t_onCompleteCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.onStop = function ( callback ) {\n\n\t\t_onStopCallback = callback;\n\t\treturn this;\n\n\t};\n\n\tthis.update = function ( time ) {\n\n\t\tvar property;\n\n\t\tif ( time < _startTime ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tif ( _onStartCallbackFired === false ) {\n\n\t\t\tif ( _onStartCallback !== null ) {\n\n\t\t\t\t_onStartCallback.call( _object );\n\n\t\t\t}\n\n\t\t\t_onStartCallbackFired = true;\n\n\t\t}\n\n\t\tvar elapsed = ( time - _startTime ) / _duration;\n\t\telapsed = elapsed > 1 ? 1 : elapsed;\n\n\t\tvar value = _easingFunction( elapsed );\n\n\t\tfor ( property in _valuesEnd ) {\n\n\t\t\tvar start = _valuesStart[ property ] || 0;\n\t\t\tvar end = _valuesEnd[ property ];\n\n\t\t\tif ( end instanceof Array ) {\n\n\t\t\t\t_object[ property ] = _interpolationFunction( end, value );\n\n\t\t\t} else {\n\n\t\t\t\t// Parses relative end values with start as base (e.g.: +10, -3)\n\t\t\t\tif ( typeof(end) === \"string\" ) {\n\t\t\t\t\tend = start + parseFloat(end, 10);\n\t\t\t\t}\n\n\t\t\t\t// protect against non numeric properties.\n\t\t\t\tif ( typeof(end) === \"number\" ) {\n\t\t\t\t\t_object[ property ] = start + ( end - start ) * value;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( _onUpdateCallback !== null ) {\n\n\t\t\t_onUpdateCallback.call( _object, value );\n\n\t\t}\n\n\t\tif ( elapsed == 1 ) {\n\n\t\t\tif ( _repeat > 0 ) {\n\n\t\t\t\tif( isFinite( _repeat ) ) {\n\t\t\t\t\t_repeat--;\n\t\t\t\t}\n\n\t\t\t\t// reassign starting values, restart by making startTime = now\n\t\t\t\tfor( property in _valuesStartRepeat ) {\n\n\t\t\t\t\tif ( typeof( _valuesEnd[ property ] ) === \"string\" ) {\n\t\t\t\t\t\t_valuesStartRepeat[ property ] = _valuesStartRepeat[ property ] + parseFloat(_valuesEnd[ property ], 10);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_yoyo) {\n\t\t\t\t\t\tvar tmp = _valuesStartRepeat[ property ];\n\t\t\t\t\t\t_valuesStartRepeat[ property ] = _valuesEnd[ property ];\n\t\t\t\t\t\t_valuesEnd[ property ] = tmp;\n\t\t\t\t\t}\n\n\t\t\t\t\t_valuesStart[ property ] = _valuesStartRepeat[ property ];\n\n\t\t\t\t}\n\n\t\t\t\tif (_yoyo) {\n\t\t\t\t\t_reversed = !_reversed;\n\t\t\t\t}\n\n\t\t\t\t_startTime = time + _delayTime;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\tif ( _onCompleteCallback !== null ) {\n\n\t\t\t\t\t_onCompleteCallback.call( _object );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {\n\n\t\t\t\t\t_chainedTweens[ i ].start( time );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n};\n\n\nTWEEN.Easing = {\n\n\tLinear: {\n\n\t\tNone: function ( k ) {\n\n\t\t\treturn k;\n\n\t\t}\n\n\t},\n\n\tQuadratic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn k * ( 2 - k );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * k * k;\n\t\t\treturn - 0.5 * ( --k * ( k - 2 ) - 1 );\n\n\t\t}\n\n\t},\n\n\tCubic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn --k * k * k + 1;\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;\n\t\t\treturn 0.5 * ( ( k -= 2 ) * k * k + 2 );\n\n\t\t}\n\n\t},\n\n\tQuartic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k * k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn 1 - ( --k * k * k * k );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;\n\t\t\treturn - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );\n\n\t\t}\n\n\t},\n\n\tQuintic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k * k * k * k * k;\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn --k * k * k * k * k + 1;\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;\n\t\t\treturn 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );\n\n\t\t}\n\n\t},\n\n\tSinusoidal: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn 1 - Math.cos( k * Math.PI / 2 );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn Math.sin( k * Math.PI / 2 );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\treturn 0.5 * ( 1 - Math.cos( Math.PI * k ) );\n\n\t\t}\n\n\t},\n\n\tExponential: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn k === 0 ? 0 : Math.pow( 1024, k - 1 );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );\n\t\t\treturn 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );\n\n\t\t}\n\n\t},\n\n\tCircular: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn 1 - Math.sqrt( 1 - k * k );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\treturn Math.sqrt( 1 - ( --k * k ) );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);\n\t\t\treturn 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);\n\n\t\t}\n\n\t},\n\n\tElastic: {\n\n\t\tIn: function ( k ) {\n\n\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\treturn - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\tif ( k === 0 ) return 0;\n\t\t\tif ( k === 1 ) return 1;\n\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\tif ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n\t\t\treturn a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;\n\n\t\t}\n\n\t},\n\n\tBack: {\n\n\t\tIn: function ( k ) {\n\n\t\t\tvar s = 1.70158;\n\t\t\treturn k * k * ( ( s + 1 ) * k - s );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\tvar s = 1.70158;\n\t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tvar s = 1.70158 * 1.525;\n\t\t\tif ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );\n\t\t\treturn 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );\n\n\t\t}\n\n\t},\n\n\tBounce: {\n\n\t\tIn: function ( k ) {\n\n\t\t\treturn 1 - TWEEN.Easing.Bounce.Out( 1 - k );\n\n\t\t},\n\n\t\tOut: function ( k ) {\n\n\t\t\tif ( k < ( 1 / 2.75 ) ) {\n\n\t\t\t\treturn 7.5625 * k * k;\n\n\t\t\t} else if ( k < ( 2 / 2.75 ) ) {\n\n\t\t\t\treturn 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;\n\n\t\t\t} else if ( k < ( 2.5 / 2.75 ) ) {\n\n\t\t\t\treturn 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;\n\n\t\t\t} else {\n\n\t\t\t\treturn 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;\n\n\t\t\t}\n\n\t\t},\n\n\t\tInOut: function ( k ) {\n\n\t\t\tif ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;\n\t\t\treturn TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;\n\n\t\t}\n\n\t}\n\n};\n\nTWEEN.Interpolation = {\n\n\tLinear: function ( v, k ) {\n\n\t\tvar m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;\n\n\t\tif ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );\n\t\tif ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );\n\n\t\treturn fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );\n\n\t},\n\n\tBezier: function ( v, k ) {\n\n\t\tvar b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;\n\n\t\tfor ( i = 0; i <= n; i++ ) {\n\t\t\tb += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );\n\t\t}\n\n\t\treturn b;\n\n\t},\n\n\tCatmullRom: function ( v, k ) {\n\n\t\tvar m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;\n\n\t\tif ( v[ 0 ] === v[ m ] ) {\n\n\t\t\tif ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );\n\n\t\t\treturn fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );\n\n\t\t} else {\n\n\t\t\tif ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );\n\t\t\tif ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );\n\n\t\t\treturn fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );\n\n\t\t}\n\n\t},\n\n\tUtils: {\n\n\t\tLinear: function ( p0, p1, t ) {\n\n\t\t\treturn ( p1 - p0 ) * t + p0;\n\n\t\t},\n\n\t\tBernstein: function ( n , i ) {\n\n\t\t\tvar fc = TWEEN.Interpolation.Utils.Factorial;\n\t\t\treturn fc( n ) / fc( i ) / fc( n - i );\n\n\t\t},\n\n\t\tFactorial: ( function () {\n\n\t\t\tvar a = [ 1 ];\n\n\t\t\treturn function ( n ) {\n\n\t\t\t\tvar s = 1, i;\n\t\t\t\tif ( a[ n ] ) return a[ n ];\n\t\t\t\tfor ( i = n; i > 1; i-- ) s *= i;\n\t\t\t\treturn a[ n ] = s;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tCatmullRom: function ( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n};\n\n// UMD (Universal Module Definition)\n( function ( root ) {\n\n\tif ( typeof define === 'function' && define.amd ) {\n\n\t\t// AMD\n\t\tdefine( [], function () {\n\t\t\treturn TWEEN;\n\t\t} );\n\n\t} else if ( typeof exports === 'object' ) {\n\n\t\t// Node.js\n\t\tmodule.exports = TWEEN;\n\n\t} else {\n\n\t\t// Global variable\n\t\troot.TWEEN = TWEEN;\n\n\t}\n\n} )( this );\n","/* global HTMLElement */\nvar schema = require('./schema');\nvar systems = require('./system');\nvar utils = require('../utils/');\n\nvar components = module.exports.components = {}; // Keep track of registered components.\nvar parseProperties = schema.parseProperties;\nvar parseProperty = schema.parseProperty;\nvar processSchema = schema.process;\nvar isSingleProp = schema.isSingleProperty;\nvar stringifyProperties = schema.stringifyProperties;\nvar stringifyProperty = schema.stringifyProperty;\nvar styleParser = utils.styleParser;\n\n/**\n * Component class definition.\n *\n * Components configure appearance, modify behavior, or add functionality to\n * entities. The behavior and appearance of an entity can be changed at runtime\n * by adding, removing, or updating components. Entities do not share instances\n * of components.\n *\n * @member {object} el - Reference to the entity element.\n * @member {string} attr - Component name exposed as an HTML attribute.\n * @member {object} data - Component data populated by parsing the\n * mapped attribute of the component plus applying defaults and mixins.\n */\nvar Component = module.exports.Component = function (el, attr, id) {\n this.el = el;\n this.id = id;\n this.attrName = this.name + (id ? '__' + id : '');\n this.updateCachedAttrValue(attr);\n};\n\nComponent.prototype = {\n /**\n * Contains the type schema and defaults for the data values.\n * Data is coerced into the types of the values of the defaults.\n */\n schema: { },\n\n /**\n * Init handler. Similar to attachedCallback.\n * Called during component initialization and is only run once.\n * Components can use this to set initial state.\n */\n init: function () { /* no-op */ },\n\n /**\n * Update handler. Similar to attributeChangedCallback.\n * Called whenever component's data changes.\n * Also called on component initialization when the component receives initial data.\n *\n * @param {object} prevData - Previous attributes of the component.\n */\n update: function (prevData) { /* no-op */ },\n\n updateSchema: undefined,\n\n /**\n * Tick handler.\n * Called on each tick of the scene render loop.\n * Affected by play and pause.\n *\n * @param {number} time - Scene tick time.\n * @param {number} timeDelta - Difference in current render time and previous render time.\n */\n tick: undefined,\n\n /**\n * Called to start any dynamic behavior (e.g., animation, AI, events, physics).\n */\n play: function () { /* no-op */ },\n\n /**\n * Called to stop any dynamic behavior (e.g., animation, AI, events, physics).\n */\n pause: function () { /* no-op */ },\n\n /**\n * Remove handler. Similar to detachedCallback.\n * Called whenever component is removed from the entity (i.e., removeAttribute).\n * Components can use this to reset behavior on the entity.\n */\n remove: function () { /* no-op */ },\n\n /**\n * Parses each property based on property type.\n * If component is single-property, then parses the single property value.\n *\n * @param {string} value - HTML attribute value.\n * @param {boolean} silent - Suppress warning messages.\n * @returns {object} Component data.\n */\n parse: function (value, silent) {\n var schema = this.schema;\n if (isSingleProp(schema)) { return parseProperty(value, schema); }\n return parseProperties(styleParser.parse(value), schema, true, this.name, silent);\n },\n\n /**\n * Stringify properties if necessary.\n *\n * Only called from `Entity.setAttribute` for properties whose parsers accept a non-string\n * value (e.g., selector, vec3 property types).\n *\n * @param {object} data - Complete component data.\n * @returns {string}\n */\n stringify: function (data) {\n var schema = this.schema;\n if (typeof data === 'string') { return data; }\n if (isSingleProp(schema)) { return stringifyProperty(data, schema); }\n data = stringifyProperties(data, schema);\n return styleParser.stringify(data);\n },\n\n /**\n * Returns a copy of data such that we don't expose the private this.data.\n *\n * @returns {object} data\n */\n getData: function () {\n var data = this.data;\n if (typeof data !== 'object') { return data; }\n return utils.extend({}, data);\n },\n\n /**\n * Update the cache of the pre-parsed attribute value.\n *\n * @param {string} value - HTML attribute value.\n */\n updateCachedAttrValue: function (value) {\n var isSinglePropSchema = isSingleProp(this.schema);\n var attrValue = this.parseAttrValueForCache(value);\n this.attrValue = extendProperties({}, attrValue, isSinglePropSchema);\n },\n\n /**\n * Given an HTML attribute value parses the string\n * based on the component schema. To avoid double parsings of\n * strings into strings we store the original instead\n * of the parsed one\n *\n * @param {string} value - HTML attribute value\n */\n parseAttrValueForCache: function (value) {\n var parsedValue;\n if (typeof value !== 'string') { return value; }\n if (isSingleProp(this.schema)) {\n parsedValue = this.schema.parse(value);\n // To avoid bogus double parsings. The cached values will\n // be parsed when building the component data.\n // For instance when parsing a src id to it's url.\n // We want to cache the original string and not the parsed\n // one (#monster -> models/monster.dae) so when building\n // data we parse the expected value.\n if (typeof parsedValue === 'string') { parsedValue = value; }\n } else {\n // We just parse using the style parser to avoid double parsing\n // of individual properties.\n parsedValue = styleParser.parse(value);\n }\n return parsedValue;\n },\n\n /**\n * Writes cached attribute data to the entity DOM element.\n */\n flushToDOM: function () {\n var attrValue = this.attrValue;\n if (!attrValue) { return; }\n HTMLElement.prototype.setAttribute.call(this.el, this.attrName, this.stringify(attrValue));\n },\n\n /**\n * Apply new component data if data has changed.\n *\n * @param {string} value - HTML attribute value.\n * If undefined, use the cached attribute value and continue updating properties.\n */\n updateProperties: function (value) {\n var el = this.el;\n var isSinglePropSchema = isSingleProp(this.schema);\n var oldData = extendProperties({}, this.data, isSinglePropSchema);\n\n if (value !== undefined) { this.updateCachedAttrValue(value); }\n\n if (this.updateSchema) {\n this.updateSchema(buildData(el, this.name, this.schema, this.attrValue, true));\n }\n this.data = buildData(el, this.name, this.schema, this.attrValue);\n\n // Don't update if properties haven't changed\n if (!isSinglePropSchema && utils.deepEqual(oldData, this.data)) { return; }\n\n if (!this.initialized) {\n this.init();\n this.initialized = true;\n // Play the component if the entity is playing.\n this.update(oldData);\n if (el.isPlaying) { this.play(); }\n } else {\n this.update(oldData);\n }\n\n el.emit('componentchanged', {\n id: this.id,\n name: this.name,\n newData: this.getData(),\n oldData: oldData\n }, false);\n },\n\n /**\n * Extend schema of component given a partial schema.\n *\n * Some components might want to mutate their schema based on certain properties.\n * e.g., Material component changes its schema based on `shader` to account for different\n * uniforms\n *\n * @param {object} schemaAddon - Schema chunk that extend base schema.\n */\n extendSchema: function (schemaAddon) {\n // Clone base schema.\n var extendedSchema = utils.extend({}, components[this.name].schema);\n // Extend base schema with new schema chunk.\n utils.extend(extendedSchema, schemaAddon);\n this.schema = processSchema(extendedSchema);\n this.el.emit('schemachanged', { component: this.name });\n }\n};\n\n/**\n * Registers a component to A-Frame.\n *\n * @param {string} name - Component name.\n * @param {object} definition - Component schema and lifecycle method handlers.\n * @returns {object} Component.\n */\nmodule.exports.registerComponent = function (name, definition) {\n var NewComponent;\n var proto = {};\n\n if (name.indexOf('__') !== -1) {\n throw new Error('The component name `' + name + '` is not allowed. ' +\n 'The sequence __ (double underscore) is reserved to specify an id' +\n ' for multiple components of the same type');\n }\n\n // Format definition object to prototype object.\n Object.keys(definition).forEach(function (key) {\n proto[key] = {\n value: definition[key],\n writable: true\n };\n });\n\n if (components[name]) {\n throw new Error('The component `' + name + '` has been already registered. ' +\n 'Check that you are not loading two versions of the same component ' +\n 'or two different components of the same name.');\n }\n NewComponent = function (el, attr, id) {\n Component.call(this, el, attr, id);\n if (!el.hasLoaded) { return; }\n this.updateProperties(this.attrValue);\n };\n\n NewComponent.prototype = Object.create(Component.prototype, proto);\n NewComponent.prototype.name = name;\n NewComponent.prototype.constructor = NewComponent;\n NewComponent.prototype.system = systems && systems.systems[name];\n NewComponent.prototype.play = wrapPlay(NewComponent.prototype.play);\n NewComponent.prototype.pause = wrapPause(NewComponent.prototype.pause);\n\n components[name] = {\n Component: NewComponent,\n dependencies: NewComponent.prototype.dependencies,\n multiple: NewComponent.prototype.multiple,\n parse: NewComponent.prototype.parse,\n parseAttrValueForCache: NewComponent.prototype.parseAttrValueForCache,\n schema: utils.extend(processSchema(NewComponent.prototype.schema)),\n stringify: NewComponent.prototype.stringify,\n type: NewComponent.prototype.type\n };\n return NewComponent;\n};\n\n/**\n * Builds component data from the current state of the entity, ultimately\n * updating this.data.\n *\n * If the component was detached completely, set data to null.\n *\n * Precedence:\n * 1. Defaults data\n * 2. Mixin data.\n * 3. Attribute data.\n *\n * Finally coerce the data to the types of the defaults.\n *\n * @param {object} el - Element to build data from.\n * @param {object} name - Component name.\n * @param {object} schema - Component schema.\n * @param {object} elData - Element current data.\n * @param {boolean} silent - Suppress warning messages.\n * @return {object} The component data\n */\nfunction buildData (el, name, schema, elData, silent) {\n var componentDefined = elData !== undefined && elData !== null;\n var data;\n var isSinglePropSchema = isSingleProp(schema);\n var mixinEls = el.mixinEls;\n\n // 1. Default values (lowest precendence).\n if (isSinglePropSchema) {\n data = schema.default;\n } else {\n data = {};\n Object.keys(schema).forEach(function applyDefault (key) {\n data[key] = schema[key].default;\n });\n }\n\n // 2. Mixin values.\n mixinEls.forEach(handleMixinUpdate);\n function handleMixinUpdate (mixinEl) {\n var mixinData = mixinEl.getAttribute(name);\n if (mixinData) {\n data = extendProperties(data, mixinData, isSinglePropSchema);\n }\n }\n\n // 3. Attribute values (highest precendence).\n if (componentDefined) {\n if (isSinglePropSchema) { return parseProperty(elData, schema); }\n data = extendProperties(data, elData, isSinglePropSchema);\n return parseProperties(data, schema, undefined, name, silent);\n } else {\n // Parse and coerce using the schema.\n if (isSinglePropSchema) { return parseProperty(data, schema); }\n return parseProperties(data, schema, undefined, name, silent);\n }\n}\nmodule.exports.buildData = buildData;\n\n/**\n* Object extending with checking for single-property schema.\n*\n* @param dest - Destination object or value.\n* @param source - Source object or value\n* @param {boolean} isSinglePropSchema - Whether or not schema is only a single property.\n* @returns Overridden object or value.\n*/\nfunction extendProperties (dest, source, isSinglePropSchema) {\n if (isSinglePropSchema) { return source; }\n return utils.extend(dest, source);\n}\n\n/**\n * Wrapper for user defined pause method\n * Pause component by removing tick behavior and calling user's pause method.\n *\n * @param pauseMethod {function} - user defined pause method\n */\nfunction wrapPause (pauseMethod) {\n return function pause () {\n var sceneEl = this.el.sceneEl;\n if (!this.isPlaying) { return; }\n pauseMethod.call(this);\n this.isPlaying = false;\n // Remove tick behavior.\n if (!this.tick) { return; }\n sceneEl.removeBehavior(this);\n };\n}\n\n/**\n * Wrapper for user defined play method\n * Play component by adding tick behavior and calling user's play method.\n *\n * @param playMethod {function} - user defined play method\n *\n */\nfunction wrapPlay (playMethod) {\n return function play () {\n var sceneEl = this.el.sceneEl;\n var shouldPlay = this.el.isPlaying && !this.isPlaying;\n if (!this.initialized || !shouldPlay) { return; }\n playMethod.call(this);\n this.isPlaying = true;\n // Add tick behavior.\n if (!this.tick) { return; }\n sceneEl.addBehavior(this);\n };\n}\n","var schema = require('./schema');\n\nvar processSchema = schema.process;\nvar shaders = module.exports.shaders = {}; // Keep track of registered shaders.\nvar shaderNames = module.exports.shaderNames = []; // Keep track of the names of registered shaders.\nvar THREE = require('../lib/three');\n\nvar propertyToThreeMapping = {\n number: 'f',\n time: 'f',\n vec4: 'v4',\n vec3: 'v3',\n vec2: 'v2',\n color: 'v3'\n};\n\n/**\n * Shader class definition.\n *\n * Shaders extend the material component API so you can create your own library\n * of customized materials\n *\n */\nvar Shader = module.exports.Shader = function () {};\n\nShader.prototype = {\n /**\n * Contains the type schema and defaults for the data values.\n * Data is coerced into the types of the values of the defaults.\n */\n schema: { },\n\n vertexShader:\n 'void main() {' +\n 'gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);' +\n '}',\n\n fragmentShader:\n 'void main() {' +\n 'gl_FragColor = vec4(1.0,0.0,1.0,1.0);' +\n '}',\n\n /**\n * Init handler. Similar to attachedCallback.\n * Called during shader initialization and is only run once.\n */\n init: function (data) {\n this.attributes = this.initVariables(data, 'attribute');\n this.uniforms = this.initVariables(data, 'uniform');\n this.material = new THREE.ShaderMaterial({\n // attributes: this.attributes,\n uniforms: this.uniforms,\n vertexShader: this.vertexShader,\n fragmentShader: this.fragmentShader\n });\n return this.material;\n },\n\n initVariables: function (data, type) {\n var self = this;\n var variables = {};\n var schema = this.schema;\n var schemaKeys = Object.keys(schema);\n schemaKeys.forEach(processSchema);\n function processSchema (key) {\n if (schema[key].is !== type) { return; }\n var varType = propertyToThreeMapping[schema[key].type];\n var varValue = schema[key].parse(data[key] || schema[key].default);\n variables[key] = {\n type: varType,\n value: self.parseValue(schema[key].type, varValue)\n };\n }\n return variables;\n },\n\n /**\n * Update handler. Similar to attributeChangedCallback.\n * Called whenever the associated material data changes.\n *\n * @param {object} data - New material data.\n */\n update: function (data) {\n this.updateVariables(data, 'attribute');\n this.updateVariables(data, 'uniform');\n },\n\n updateVariables: function (data, type) {\n var self = this;\n var variables = type === 'uniform' ? this.uniforms : this.attributes;\n var dataKeys = Object.keys(data);\n var schema = this.schema;\n dataKeys.forEach(processData);\n function processData (key) {\n if (!schema[key] || schema[key].is !== type) { return; }\n if (variables[key].value === data[key]) { return; }\n variables[key].value = self.parseValue(schema[key].type, data[key]);\n variables[key].needsUpdate = true;\n }\n },\n\n parseValue: function (type, value) {\n var color;\n switch (type) {\n case 'vec2': {\n return new THREE.Vector2(value.x, value.y);\n }\n case 'vec3': {\n return new THREE.Vector3(value.x, value.y, value.z);\n }\n case 'vec4': {\n return new THREE.Vector4(value.x, value.y, value.z, value.w);\n }\n case 'color': {\n color = new THREE.Color(value);\n return new THREE.Vector3(color.r, color.g, color.b);\n }\n default: {\n return value;\n }\n }\n }\n};\n\n/**\n * Registers a shader to A-Frame.\n *\n * @param {string} name - shader name.\n * @param {object} definition - shader property and methods.\n * @returns {object} Shader.\n */\nmodule.exports.registerShader = function (name, definition) {\n var NewShader;\n var proto = {};\n\n // Format definition object to prototype object.\n Object.keys(definition).forEach(function (key) {\n proto[key] = {\n value: definition[key],\n writable: true\n };\n });\n\n if (shaders[name]) {\n throw new Error('The shader ' + name + ' has been already registered');\n }\n NewShader = function () { Shader.call(this); };\n NewShader.prototype = Object.create(Shader.prototype, proto);\n NewShader.prototype.name = name;\n NewShader.prototype.constructor = NewShader;\n shaders[name] = {\n Shader: NewShader,\n schema: processSchema(NewShader.prototype.schema)\n };\n shaderNames.push(name);\n return NewShader;\n};\n","var schema = require('./schema');\n\nvar processSchema = schema.process;\nvar geometries = module.exports.geometries = {}; // Registered geometries.\nvar geometryNames = module.exports.geometryNames = []; // Names of registered geometries.\nvar THREE = require('../lib/three');\n\n/**\n * Geometry class definition.\n *\n * Geometries extend the geometry component API to create and register geometry types.\n */\nvar Geometry = module.exports.Geometry = function () {};\n\nGeometry.prototype = {\n /**\n * Contains the type schema and defaults for the data values.\n * Data is coerced into the types of the values of the defaults.\n */\n schema: {},\n\n /**\n * Init handler. Similar to attachedCallback.\n * Called during shader initialization and is only run once.\n */\n init: function (data) {\n this.geometry = new THREE.Geometry();\n return this.geometry;\n },\n\n /**\n * Update handler. Similar to attributeChangedCallback.\n * Called whenever the associated geometry data changes.\n *\n * @param {object} data - New geometry data.\n */\n update: function (data) { /* no-op */ }\n};\n\n/**\n * Registers a geometry to A-Frame.\n *\n * @param {string} name - Geometry name.\n * @param {object} definition - Geometry property and methods.\n * @returns {object} Geometry.\n */\nmodule.exports.registerGeometry = function (name, definition) {\n var NewGeometry;\n var proto = {};\n\n // Format definition object to prototype object.\n Object.keys(definition).forEach(function expandDefinition (key) {\n proto[key] = {\n value: definition[key],\n writable: true\n };\n });\n\n if (geometries[name]) {\n throw new Error('The geometry `' + name + '` has been already registered');\n }\n NewGeometry = function () { Geometry.call(this); };\n NewGeometry.prototype = Object.create(Geometry.prototype, proto);\n NewGeometry.prototype.name = name;\n NewGeometry.prototype.constructor = NewGeometry;\n geometries[name] = {\n Geometry: NewGeometry,\n schema: processSchema(NewGeometry.prototype.schema)\n };\n geometryNames.push(name);\n return NewGeometry;\n};\n","/* global HTMLElement */\r\nvar components = require('./component');\r\nvar schema = require('./schema');\r\nvar utils = require('../utils/');\r\n\r\nvar parseProperties = schema.parseProperties;\r\nvar parseProperty = schema.parseProperty;\r\nvar processSchema = schema.process;\r\nvar isSingleProp = schema.isSingleProperty;\r\nvar styleParser = utils.styleParser;\r\n\r\nvar systems = module.exports.systems = {}; // Keep track of registered systems.\r\n\r\n/**\r\n * System class definition.\r\n *\r\n * Systems provide global scope and services to a group of instantiated components of the\r\n * same class. They can also help abstract logic away from components such that components\r\n * only have to worry about data.\r\n * For example, a physics component that creates a physics world that oversees\r\n * all entities with a physics or rigid body component.\r\n *\r\n * @member {string} name - Name that system is registered under.\r\n * @member {Element} sceneEl - Handle to the scene element where system applies to.\r\n */\r\nvar System = module.exports.System = function (sceneEl) {\r\n var component = components && components.components[this.name];\r\n var schema = this.schema;\r\n var rawData;\r\n\r\n // Set reference to scene.\r\n this.sceneEl = sceneEl;\r\n\r\n // Set reference to matching component (if exists).\r\n if (component) { component.Component.prototype.system = this; }\r\n\r\n // Process system configuration.\r\n if (!Object.keys(schema).length) { return; }\r\n rawData = HTMLElement.prototype.getAttribute.call(sceneEl, this.name);\r\n if (isSingleProp(schema)) {\r\n this.data = parseProperty(rawData, schema);\r\n return;\r\n }\r\n this.data = parseProperties(styleParser.parse(rawData) || {}, schema, false, this.name);\r\n};\r\n\r\nSystem.prototype = {\r\n /**\r\n * Schema to configure system.\r\n */\r\n schema: {},\r\n\r\n /**\r\n * Init handler. Called during scene initialization and is only run once.\r\n * Systems can use this to set initial state.\r\n */\r\n init: function () { /* no-op */ },\r\n\r\n /**\r\n * Tick handler.\r\n * Called on each tick of the scene render loop.\r\n * Affected by play and pause.\r\n *\r\n * @param {number} time - Scene tick time.\r\n * @param {number} timeDelta - Difference in current render time and previous render time.\r\n */\r\n tick: undefined,\r\n\r\n /**\r\n * Called to start any dynamic behavior (e.g., animation, AI, events, physics).\r\n */\r\n play: function () { /* no-op */ },\r\n\r\n /**\r\n * Called to stop any dynamic behavior (e.g., animation, AI, events, physics).\r\n */\r\n pause: function () { /* no-op */ }\r\n};\r\n\r\n/**\r\n * Registers a system to A-Frame.\r\n *\r\n * @param {string} name - Component name.\r\n * @param {object} definition - Component property and methods.\r\n * @returns {object} Component.\r\n */\r\nmodule.exports.registerSystem = function (name, definition) {\r\n var i;\r\n var NewSystem;\r\n var proto = {};\r\n var scenes = utils.findAllScenes(document);\r\n\r\n // Format definition object to prototype object.\r\n Object.keys(definition).forEach(function (key) {\r\n proto[key] = {\r\n value: definition[key],\r\n writable: true\r\n };\r\n });\r\n\r\n if (systems[name]) {\r\n throw new Error('The system `' + name + '` has been already registered. ' +\r\n 'Check that you are not loading two versions of the same system ' +\r\n 'or two different systems of the same name.');\r\n }\r\n NewSystem = function (sceneEl) { System.call(this, sceneEl); };\r\n NewSystem.prototype = Object.create(System.prototype, proto);\r\n NewSystem.prototype.name = name;\r\n NewSystem.prototype.constructor = NewSystem;\r\n NewSystem.prototype.schema = utils.extend(processSchema(NewSystem.prototype.schema));\r\n systems[name] = NewSystem;\r\n\r\n // Initialize systems for existing scenes\r\n for (i = 0; i < scenes.length; i++) { scenes[i].initSystem(name); }\r\n};\r\n","var THREE = global.THREE = require('three');\n\n// Allow cross-origin images to be loaded.\n\n// This should not be on `THREE.Loader` nor `THREE.ImageUtils`.\n// Must be on `THREE.TextureLoader`.\nif (THREE.TextureLoader) {\n THREE.TextureLoader.prototype.crossOrigin = 'anonymous';\n}\n\n// This is for images loaded from the model loaders.\nif (THREE.ImageLoader) {\n THREE.ImageLoader.prototype.crossOrigin = 'anonymous';\n}\n\n// In-memory caching for XHRs (for images, audio files, textures, etc.).\nif (THREE.Cache) {\n THREE.Cache.enabled = true;\n}\n\n// TODO: Eventually include these only if they are needed by a component.\nrequire('three/examples/js/loaders/OBJLoader'); // THREE.OBJLoader\nrequire('three/examples/js/loaders/MTLLoader'); // THREE.MTLLoader\nrequire('three/examples/js/BlendCharacter'); // THREE.BlendCharacter\nrequire('three/examples/js/loaders/ColladaLoader'); // THREE.ColladaLoader\nrequire('../../vendor/VRControls'); // THREE.VRControls\nrequire('../../vendor/VREffect'); // THREE.VREffect\n\nTHREE.ColladaLoader.prototype.crossOrigin = 'anonymous';\nTHREE.MTLLoader.prototype.crossOrigin = 'anonymous';\nTHREE.OBJLoader.prototype.crossOrigin = 'anonymous';\n\nmodule.exports = THREE;\n","require('./blend-character-model');\nrequire('./camera');\nrequire('./collada-model');\nrequire('./cursor');\nrequire('./geometry');\nrequire('./hand-controls');\nrequire('./light');\nrequire('./look-at');\nrequire('./look-controls');\nrequire('./material');\nrequire('./obj-model');\nrequire('./position');\nrequire('./raycaster');\nrequire('./rotation');\nrequire('./scale');\nrequire('./sound');\nrequire('./tracked-controls');\nrequire('./visible');\nrequire('./vive-controls');\nrequire('./wasd-controls');\n\nrequire('./scene/canvas');\nrequire('./scene/debug');\nrequire('./scene/embedded');\nrequire('./scene/inspector');\nrequire('./scene/fog');\nrequire('./scene/keyboard-shortcuts');\nrequire('./scene/stats');\nrequire('./scene/vr-mode-ui');\n","require('./box.js');\nrequire('./circle.js');\nrequire('./cone.js');\nrequire('./cylinder.js');\nrequire('./dodecahedron.js');\nrequire('./icosahedron.js');\nrequire('./octahedron.js');\nrequire('./plane.js');\nrequire('./ring.js');\nrequire('./sphere.js');\nrequire('./tetrahedron.js');\nrequire('./torus.js');\nrequire('./torusKnot.js');\n","require('./flat');\nrequire('./standard');\n","require('./camera');\nrequire('./geometry');\nrequire('./light');\nrequire('./material');\nrequire('./tracked-controls');\n\n","/* global HTMLElement, MutationObserver */\nvar registerElement = require('./a-register-element').registerElement;\nvar utils = require('../utils/');\n\n/**\n * Base class for A-Frame that manages loading of objects.\n *\n * Nodes can be modified using mixins.\n * Nodes emit a `loaded` event when they and their children have initialized.\n */\nmodule.exports = registerElement('a-node', {\n prototype: Object.create(HTMLElement.prototype, {\n createdCallback: {\n value: function () {\n this.hasLoaded = false;\n this.isNode = true;\n this.mixinEls = [];\n this.mixinObservers = {};\n },\n writable: window.debug\n },\n\n attachedCallback: {\n value: function () {\n var mixins = this.getAttribute('mixin');\n this.sceneEl = this.closestScene();\n this.emit('nodeready', {}, false);\n if (mixins) { this.updateMixins(mixins); }\n },\n writable: window.debug\n },\n\n attributeChangedCallback: {\n value: function (attr, oldVal, newVal) {\n if (attr === 'mixin') { this.updateMixins(newVal, oldVal); }\n }\n },\n\n /**\n * Returns the first scene by traversing up the tree starting from and\n * including receiver element.\n */\n closestScene: {\n value: function closest () {\n var element = this;\n while (element) {\n if (element.isScene) { break; }\n element = element.parentElement;\n }\n return element;\n }\n },\n\n /**\n * Returns first element matching a selector by traversing up the tree starting\n * from and including receiver element.\n *\n * @param {string} selector - Selector of element to find.\n */\n closest: {\n value: function closest (selector) {\n var matches = this.matches || this.mozMatchesSelector ||\n this.msMatchesSelector || this.oMatchesSelector || this.webkitMatchesSelector;\n var element = this;\n while (element) {\n if (matches.call(element, selector)) { break; }\n element = element.parentElement;\n }\n return element;\n }\n },\n\n detachedCallback: {\n value: function () { /* no-op */ }\n },\n\n /**\n * Wait for children to load, if any.\n * Then emit `loaded` event and set `hasLoaded`.\n */\n load: {\n value: function (cb, childFilter) {\n var children;\n var childrenLoaded;\n var self = this;\n\n if (this.hasLoaded) { return; }\n\n // Default to waiting for all nodes.\n childFilter = childFilter || function (el) { return el.isNode; };\n\n // Wait for children to load (if any), then load.\n children = this.getChildren();\n childrenLoaded = children.filter(childFilter).map(function (child) {\n return new Promise(function waitForLoaded (resolve) {\n if (child.hasLoaded) { return resolve(); }\n child.addEventListener('loaded', resolve);\n });\n });\n\n Promise.all(childrenLoaded).then(function emitLoaded () {\n self.hasLoaded = true;\n if (cb) { cb(); }\n self.emit('loaded', {}, false);\n });\n },\n writable: true\n },\n\n getChildren: {\n value: function () {\n return Array.prototype.slice.call(this.children, 0);\n }\n },\n\n updateMixins: {\n value: function (newMixins, oldMixins) {\n var newMixinsIds = newMixins.split(' ');\n var oldMixinsIds = oldMixins ? oldMixins.split(' ') : [];\n // To determine what listeners will be removed\n var diff = oldMixinsIds.filter(function (i) { return newMixinsIds.indexOf(i) < 0; });\n this.mixinEls = [];\n diff.forEach(this.unregisterMixin.bind(this));\n newMixinsIds.forEach(this.registerMixin.bind(this));\n }\n },\n\n registerMixin: {\n value: function (mixinId) {\n if (!this.sceneEl) { return; }\n var mixinEl = this.sceneEl.querySelector('a-mixin#' + mixinId);\n if (!mixinEl) { return; }\n this.attachMixinListener(mixinEl);\n this.mixinEls.push(mixinEl);\n }\n },\n\n setAttribute: {\n value: function (attr, newValue) {\n if (attr === 'mixin') { this.updateMixins(newValue); }\n HTMLElement.prototype.setAttribute.call(this, attr, newValue);\n }\n },\n\n unregisterMixin: {\n value: function (mixinId) {\n var mixinEls = this.mixinEls;\n var mixinEl;\n var i;\n for (i = 0; i < mixinEls.length; ++i) {\n mixinEl = mixinEls[i];\n if (mixinId === mixinEl.id) {\n mixinEls.splice(i, 1);\n break;\n }\n }\n this.removeMixinListener(mixinId);\n }\n },\n\n removeMixinListener: {\n value: function (mixinId) {\n var observer = this.mixinObservers[mixinId];\n if (!observer) { return; }\n observer.disconnect();\n this.mixinObservers[mixinId] = null;\n }\n },\n\n attachMixinListener: {\n value: function (mixinEl) {\n var self = this;\n var mixinId = mixinEl.id;\n var currentObserver = this.mixinObservers[mixinId];\n if (!mixinEl) { return; }\n if (currentObserver) { return; }\n var observer = new MutationObserver(function (mutations) {\n var attr = mutations[0].attributeName;\n self.handleMixinUpdate(attr);\n });\n var config = { attributes: true };\n observer.observe(mixinEl, config);\n this.mixinObservers[mixinId] = observer;\n }\n },\n\n handleMixinUpdate: {\n value: function () { /* no-op */ }\n },\n\n /**\n * Emits a DOM event.\n *\n * @param {String} name\n * Name of event (use a space-delimited string for multiple events).\n * @param {Object=} [detail={}]\n * Custom data to pass as `detail` to the event.\n * @param {Boolean=} [bubbles=true]\n * Whether the event should bubble.\n */\n emit: {\n value: function (name, detail, bubbles) {\n var self = this;\n detail = detail || {};\n if (bubbles === undefined) { bubbles = true; }\n var data = { bubbles: !!bubbles, detail: detail };\n return name.split(' ').map(function (eventName) {\n return utils.fireEvent(self, eventName, data);\n });\n }\n },\n\n /**\n * Returns a closure that emits a DOM event.\n *\n * @param {String} name\n * Name of event (use a space-delimited string for multiple events).\n * @param {Object} detail\n * Custom data (optional) to pass as `detail` if the event is to\n * be a `CustomEvent`.\n * @param {Boolean} bubbles\n * Whether the event should be bubble.\n */\n emitter: {\n value: function (name, detail, bubbles) {\n var self = this;\n return function () {\n self.emit(name, detail, bubbles);\n };\n }\n }\n })\n});\n","var ANode = require('./a-node');\nvar animationConstants = require('../constants/animation');\nvar coordinates = require('../utils/').coordinates;\nvar parseProperty = require('./schema').parseProperty;\nvar registerElement = require('./a-register-element').registerElement;\nvar TWEEN = require('tween.js');\nvar THREE = require('../lib/three');\nvar utils = require('../utils/');\n\nvar getComponentProperty = utils.entity.getComponentProperty;\nvar DEFAULTS = animationConstants.defaults;\nvar DIRECTIONS = animationConstants.directions;\nvar EASING_FUNCTIONS = animationConstants.easingFunctions;\nvar FILLS = animationConstants.fills;\nvar REPEATS = animationConstants.repeats;\nvar isCoordinate = coordinates.isCoordinate;\n\n/**\n * Animation element that applies Tween animation to parent element (entity).\n * Takes after the Web Animations spec.\n *\n * @member {number} count - Decrementing counter for how many cycles of animations left to\n * run.\n * @member {Element} el - Entity which the animation is modifying.\n * @member initialValue - Value before animation started. Used to restore state.\n * @member {bool} isRunning - Whether animation is currently running.\n * @member {function} partialSetAttribute -\n * setAttribute function that is agnostic to whether we are setting an attribute value\n * or a component property value. The el and the attribute names are bundled with\n * the function.\n * @member {object} tween - tween.js object.\n */\nmodule.exports.AAnimation = registerElement('a-animation', {\n prototype: Object.create(ANode.prototype, {\n createdCallback: {\n value: function () {\n this.bindMethods();\n this.isRunning = false;\n this.partialSetAttribute = function () { /* no-op */ };\n this.tween = null;\n }\n },\n\n attachedCallback: {\n value: function () {\n this.el = this.parentNode;\n this.handleMixinUpdate();\n this.update();\n this.load();\n }\n },\n\n attributeChangedCallback: {\n value: function (attr, oldVal, newVal) {\n if (!this.hasLoaded || !this.isRunning) { return; }\n this.stop();\n this.handleMixinUpdate();\n this.update();\n }\n },\n\n detachedCallback: {\n value: function () {\n if (!this.isRunning) { return; }\n this.stop();\n }\n },\n\n /**\n * Builds a Tween object to handle animations.\n * Uses tween.js's from, to, delay, easing, repeat, onUpdate, and onComplete.\n * Note: tween.js takes objects for its `from` and `to` values.\n *\n * @returns {object}\n */\n getTween: {\n value: function () {\n var self = this;\n var data = self.data;\n var el = self.el;\n var animationValues;\n var attribute = data.attribute;\n var delay = parseInt(data.delay, 10);\n var currentValue = getComponentProperty(el, attribute);\n var direction = self.getDirection(data.direction);\n var easing = EASING_FUNCTIONS[data.easing];\n var fill = data.fill;\n var from;\n var repeat = data.repeat === REPEATS.indefinite ? Infinity : 0;\n var to;\n var toTemp;\n var yoyo = false;\n\n animationValues = getAnimationValues(el, attribute, data.from || self.initialValue, data.to, currentValue);\n from = animationValues.from;\n to = animationValues.to;\n self.partialSetAttribute = animationValues.partialSetAttribute;\n\n if (self.count === undefined) {\n self.count = repeat === Infinity ? 0 : parseInt(data.repeat, 10);\n }\n\n if (isNaN(delay)) { delay = 0; }\n\n // Store initial state.\n self.initialValue = self.initialValue || cloneValue(currentValue);\n\n // Handle indefinite + forwards + alternate yoyo edge-case (#405).\n if (repeat === Infinity && fill === FILLS.forwards &&\n [DIRECTIONS.alternate,\n DIRECTIONS.alternateReverse].indexOf(data.direction) !== -1) {\n yoyo = true;\n }\n\n // If reversing, swap from and to.\n if (direction === DIRECTIONS.reverse) {\n toTemp = to;\n to = cloneValue(from);\n from = cloneValue(toTemp);\n }\n\n // If fill is backwards or both, start animation at the specified from.\n if ([FILLS.backwards, FILLS.both].indexOf(fill) !== -1) {\n self.partialSetAttribute(from);\n }\n\n // Create Tween.\n return new TWEEN.Tween(cloneValue(from))\n .to(to, data.dur)\n .delay(delay)\n .easing(easing)\n .repeat(repeat)\n .yoyo(yoyo)\n .onUpdate(function () {\n self.partialSetAttribute(this);\n })\n .onComplete(self.onCompleted.bind(self));\n }\n },\n\n /**\n * Animation parameters changed. Stop current animation, get a new one, and start it.\n */\n update: {\n value: function () {\n var data = this.data;\n // Terminology warning if infinite used instead of indefinite\n if (data.repeat === 'infinite') {\n console.warn(\"Using 'infinite' as 'repeat' value is invalid. Use 'indefinite' instead.\");\n }\n // Deprecation warning for begin when used as a delay.\n if (data.begin !== '' && !isNaN(data.begin)) {\n console.warn(\"Using 'begin' to specify a delay is deprecated. Use 'delay' instead.\");\n data.delay = data.begin;\n data.begin = '';\n }\n var begin = data.begin;\n var end = data.end;\n // Cancel previous event listeners\n if (this.evt) { this.removeEventListeners(this.evt); }\n // Store new event name.\n this.evt = { begin: begin, end: end };\n // Add new event listeners\n this.addEventListeners(this.evt);\n // If `begin` is not defined, start the animation right away.\n if (begin === '') {\n this.stop();\n this.start();\n }\n },\n writable: window.debug\n },\n\n /**\n * Callback for when a cycle of an animation is complete. Handles when to completely\n * finish the animation.\n *\n * If `repeat` is set to a value, this method is called after each repeat. Repeats are\n * handled by ending the current animation and creating a new one with `count` updated.\n * Note that this method is *not* called if repeat is set to `indefinite`.\n */\n onCompleted: {\n value: function () {\n var data = this.data;\n this.isRunning = false;\n if ([FILLS.backwards, FILLS.none].indexOf(data.fill) !== -1) {\n this.partialSetAttribute(this.initialValue);\n }\n if (this.count === 0) {\n this.count = undefined;\n this.emit('animationend');\n return;\n }\n this.isRunning = false;\n this.count--;\n this.start();\n }\n },\n\n start: {\n value: function () {\n var self = this;\n // Postpone animation start until the entity has loaded\n if (!this.el.hasLoaded) {\n this.el.addEventListener('loaded', function () { self.start(); });\n return;\n }\n if (this.isRunning || !this.el.isPlaying) { return; }\n this.tween = this.getTween();\n this.isRunning = true;\n this.tween.start();\n this.emit('animationstart');\n },\n writable: true\n },\n\n stop: {\n value: function () {\n var tween = this.tween;\n if (!tween) { return; }\n tween.stop();\n this.isRunning = false;\n if ([FILLS.backwards, FILLS.none].indexOf(this.data.fill) !== -1) {\n this.partialSetAttribute(this.initialValue);\n }\n this.emit('animationstop');\n },\n writable: true\n },\n\n /**\n * Handle alternating directions. Given the current direction, calculate the next one,\n * and store the current one.\n *\n * @param {string} direction\n * @returns {string} Direction that the next individual cycle of the animation will go\n * towards.\n */\n getDirection: {\n value: function (direction) {\n if (direction === DIRECTIONS.alternate) {\n this.prevDirection =\n this.prevDirection === DIRECTIONS.normal ? DIRECTIONS.reverse : DIRECTIONS.normal;\n return this.prevDirection;\n }\n if (direction === DIRECTIONS.alternateReverse) {\n this.prevDirection =\n this.prevDirection === DIRECTIONS.reverse ? DIRECTIONS.normal : DIRECTIONS.reverse;\n return this.prevDirection;\n }\n return direction;\n }\n },\n\n /**\n * Preemptive binding to attach/detach event listeners (see `update`).\n */\n bindMethods: {\n value: function () {\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.onStateAdded = this.onStateAdded.bind(this);\n this.onStateRemoved = this.onStateRemoved.bind(this);\n }\n },\n\n addEventListeners: {\n value: function (evts) {\n var el = this.el;\n var self = this;\n utils.splitString(evts.begin).forEach(function (evt) {\n el.addEventListener(evt, self.start);\n });\n utils.splitString(evts.end).forEach(function (evt) {\n el.addEventListener(evt, self.stop);\n });\n // If \"begin\" is an event name, wait. If it is not defined, start.\n if (evts.begin === '') { el.addEventListener('play', this.start); }\n el.addEventListener('pause', this.stop);\n el.addEventListener('stateadded', this.onStateAdded);\n el.addEventListener('stateremoved', this.onStateRemoved);\n }\n },\n\n removeEventListeners: {\n value: function (evts) {\n var el = this.el;\n var start = this.start;\n var stop = this.stop;\n utils.splitString(evts.begin).forEach(function (evt) {\n el.removeEventListener(evt, start);\n });\n utils.splitString(evts.end).forEach(function (evt) {\n el.removeEventListener(evt, stop);\n });\n el.removeEventListener('stateadded', this.onStateAdded);\n el.removeEventListener('stateremoved', this.onStateRemoved);\n }\n },\n\n onStateAdded: {\n value: function (evt) {\n if (evt.detail.state === this.data.begin) { this.start(); }\n },\n writable: true\n },\n\n onStateRemoved: {\n value: function (evt) {\n if (evt.detail.state === this.data.begin) { this.stop(); }\n },\n writable: true\n },\n\n /**\n * Applies animation data from a mixin element.\n * Works the same as component mixins but reimplemented because animations\n * aren't components.\n */\n handleMixinUpdate: {\n value: function () {\n var data = {};\n var elData;\n var mixinData;\n var mixinEl;\n\n // Get mixin data.\n mixinEl = document.querySelector('#' + this.getAttribute('mixin'));\n mixinData = mixinEl ? utils.getElData(mixinEl, DEFAULTS) : {};\n\n elData = utils.getElData(this, DEFAULTS);\n utils.extend(data, DEFAULTS, mixinData, elData);\n this.data = data;\n }\n }\n })\n});\n\nfunction cloneValue (val) {\n return utils.extend({}, val);\n}\n\n/**\n * Deduces different animation values based on whether we are:\n * - animating an inner attribute of a component.\n * - animating a coordinate component.\n * - animating a boolean.\n * - animating a number.\n *\n * @param {Element} el\n * @param {string} attribute - Tells what to animate based on whether it is dot-separated.\n * @param {string} dataFrom - Data `from` value.\n * @param {string} dataTo - Data `to` value.\n * @param currentValue\n * @returns {object}\n * Object with keys [from, to, partialSetAttribute].\n * `from` and `to`\n * Objects where key is attribute being animated and value is value.\n * `partialSetAttribute`\n * Closured-function that tells tween how to update the component.\n */\nfunction getAnimationValues (el, attribute, dataFrom, dataTo, currentValue) {\n var attributeSplit = attribute.split('.');\n var schema;\n var component;\n var componentPropName;\n var componentName;\n var from = {};\n var partialSetAttribute;\n var to = {};\n if (attributeSplit.length === 2) {\n if (isColor()) {\n getForColorComponent();\n } else {\n getForComponentAttribute();\n }\n } else if (dataTo && isCoordinate(dataTo)) {\n getForCoordinateComponent();\n } else if (['true', 'false'].indexOf(dataTo) !== -1) {\n getForBoolean();\n } else if (isNaN(dataTo)) {\n getForColorComponent();\n } else {\n getForNumber();\n }\n return {\n from: from,\n partialSetAttribute: partialSetAttribute,\n to: to\n };\n\n /**\n * Match the schema type to color\n * @return {bool} if the schema is of type color\n */\n function isColor () {\n var componentName = attributeSplit[0];\n var propertyName = attributeSplit[1];\n var component = el.components[componentName];\n var schema = component && component.schema;\n return schema && schema[propertyName] && schema[propertyName].type === 'color';\n }\n\n /**\n * Animating a component that has multiple attributes (e.g., geometry.width).\n */\n function getForComponentAttribute () {\n componentName = attributeSplit[0];\n componentPropName = attributeSplit[1];\n component = el.components[componentName];\n if (!component) {\n el.setAttribute(componentName, '');\n component = el.components[componentName];\n }\n schema = component.schema;\n if (dataFrom === undefined) { // dataFrom can be 0.\n from[attribute] = getComponentProperty(el, attribute);\n } else {\n from[attribute] = dataFrom;\n }\n from[attribute] = parseProperty(from[attribute], schema[componentPropName]);\n to[attribute] = parseProperty(dataTo, schema[componentPropName]);\n partialSetAttribute = function (value) {\n if (!(attribute in value)) { return; }\n el.setAttribute(componentName, componentPropName, value[attribute]);\n };\n }\n\n /**\n * Animating a component that is an XYZ coordinate (e.g., position).\n * Will be tweening {x, y, z} all at once.\n */\n function getForCoordinateComponent () {\n from = dataFrom ? coordinates.parse(dataFrom) : currentValue;\n to = coordinates.parse(dataTo);\n partialSetAttribute = function (value) {\n el.setAttribute(attribute, value);\n };\n }\n\n /**\n * Animation a boolean (e.g., visible).\n * Have to convert from boolean to an integer (0 is false, > 0 is true) for tween.\n */\n function getForBoolean () {\n if (dataFrom === undefined) {\n from[attribute] = false;\n } else {\n from[attribute] = strToBool(dataFrom);\n }\n from[attribute] = boolToNum(from[attribute]);\n to[attribute] = boolToNum(strToBool(dataTo));\n partialSetAttribute = function (value) {\n el.setAttribute(attribute, !!value[attribute]);\n };\n }\n\n /**\n * Animating a color component\n * Will convert a hex value to a THREE.Color\n * Then converts to hex for the setAttribute\n */\n function getForColorComponent () {\n from = new THREE.Color(dataFrom);\n to = new THREE.Color(dataTo);\n partialSetAttribute = function (value) {\n if (attributeSplit.length > 1) {\n el.setAttribute(attributeSplit[0], attributeSplit[1], rgbVectorToHex(value));\n }\n el.setAttribute(attribute, rgbVectorToHex(value));\n };\n }\n\n /**\n * Animating a numbered attribute (e.g., opacity).\n */\n function getForNumber () {\n if (dataFrom === undefined) { // dataFrom can be 0.\n from[attribute] = parseFloat(el.getAttribute(attribute));\n } else {\n from[attribute] = parseFloat(dataFrom);\n }\n to[attribute] = parseFloat(dataTo);\n partialSetAttribute = function (value) {\n el.setAttribute(attribute, value[attribute]);\n };\n }\n}\nmodule.exports.getAnimationValues = getAnimationValues;\n\n/**\n * Converts string to bool.\n *\n * @param {string} str - `true` or `false`.\n * @returns {bool}\n */\nfunction strToBool (str) {\n if (str === 'true') { return true; }\n return false;\n}\n\n/**\n * Converts boolean to number.\n *\n * @param {bool}\n * @returns {number}\n */\nfunction boolToNum (bool) {\n return bool ? 1 : 0;\n}\n\n/**\n * Converts a number 0-255 to hex\n * @param {number} color number 0 - 255\n * @returns {string} hex value of number bassed\n */\nfunction componentToHex (color) {\n var hex = color.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n}\n\n/**\n * Clamps a number to 0-1\n * Then converts that number to 0-255\n * @param {number} color number 0 - 1\n * @returns {number} color number 0 - 255\n */\nfunction convertToIntegerColor (color) {\n return Math.floor(Math.min(Math.abs(color), 1) * 255);\n}\n\n/**\n * Converts a rgb object into a hex string\n * @param {object} color { r: 1, g: 1, b: 1 }\n * @returns {string} hex value #ffffff\n */\nfunction rgbVectorToHex (color) {\n return '#' + ['r', 'g', 'b'].map(function (prop) {\n return componentToHex(convertToIntegerColor(color[prop]));\n }).join('');\n}\n","/* global HTMLElement */\nvar ANode = require('./a-node');\nvar components = require('./component').components;\nvar registerElement = require('./a-register-element').registerElement;\nvar THREE = require('../lib/three');\nvar utils = require('../utils/');\n\nvar AEntity;\nvar debug = utils.debug('core:a-entity:debug');\n\nvar MULTIPLE_COMPONENT_DELIMITER = '__';\n\n/**\n * Entity is a container object that components are plugged into to comprise everything in\n * the scene. In A-Frame, they inherently have position, rotation, and scale.\n *\n * To be able to take components, the scene element inherits from the entity definition.\n *\n * @member {object} components - entity's currently initialized components.\n * @member {object} object3D - three.js object.\n * @member {array} states\n * @member {boolean} isPlaying - false if dynamic behavior of the entity is paused.\n */\nvar proto = Object.create(ANode.prototype, {\n defaultComponents: {\n value: {\n position: '',\n rotation: '',\n scale: '',\n visible: ''\n }\n },\n\n createdCallback: {\n value: function () {\n this.components = {};\n this.isEntity = true;\n this.isPlaying = false;\n this.object3D = new THREE.Group();\n this.object3D.el = this;\n this.object3DMap = {};\n this.parentEl = null;\n this.states = [];\n }\n },\n\n /**\n * Handle changes coming from the browser DOM inspector.\n */\n attributeChangedCallback: {\n value: function (attr, oldVal, newVal) {\n var component = this.components[attr];\n // If the empty string is passed by the component initialization\n // logic we ignore the component update.\n if (component && component.justInitialized && newVal === '') {\n delete component.justInitialized;\n return;\n }\n // When a component is removed after calling el.removeAttribute('material')\n if (!component && newVal === null) { return; }\n this.setEntityAttribute(attr, oldVal, newVal);\n }\n },\n\n /**\n * Add to parent, load, play.\n */\n attachedCallback: {\n value: function () {\n var assetsEl; // Asset management system element.\n var sceneEl = this.sceneEl;\n var self = this; // Component.\n\n this.addToParent();\n\n // Don't .load() scene on attachedCallback.\n if (this.isScene) { return; }\n\n // Gracefully not error when outside of (e.g., tests).\n if (!sceneEl) {\n this.load();\n return;\n }\n\n // Wait for asset management system to finish before loading.\n assetsEl = sceneEl.querySelector('a-assets');\n if (assetsEl && !assetsEl.hasLoaded) {\n assetsEl.addEventListener('loaded', function () { self.load(); });\n return;\n }\n this.load();\n }\n },\n\n /**\n * Tell parent to remove this element's object3D from its object3D.\n * Do not call on scene element because that will cause a call to document.body.remove().\n */\n detachedCallback: {\n value: function () {\n if (!this.parentEl || this.isScene) { return; }\n // Remove components.\n Object.keys(this.components).forEach(this.removeComponent.bind(this));\n this.parentEl.remove(this);\n }\n },\n\n /**\n * Apply mixin to component.\n */\n handleMixinUpdate: {\n value: function (attrName) {\n if (!attrName) {\n this.updateComponents();\n return;\n }\n this.updateComponent(attrName, this.getAttribute(attrName));\n }\n },\n\n mapStateMixins: {\n value: function (state, op) {\n var mixins = this.getAttribute('mixin');\n var mixinIds;\n if (!mixins) { return; }\n mixinIds = mixins.split(' ');\n mixinIds.forEach(function (id) {\n var mixinId = id + '-' + state;\n op(mixinId);\n });\n this.updateComponents();\n }\n },\n\n updateStateMixins: {\n value: function (newMixins, oldMixins) {\n var self = this;\n oldMixins = oldMixins || '';\n var newMixinsIds = newMixins.split(' ');\n var oldMixinsIds = oldMixins ? oldMixins.split(' ') : [];\n // The list of mixins that might have been removed on update\n var diff = oldMixinsIds.filter(function (i) { return newMixinsIds.indexOf(i) < 0; });\n // Remove the mixins that are gone on update\n diff.forEach(function (mixinId) {\n var forEach = Array.prototype.forEach;\n // State Mixins\n var stateMixinsEls = document.querySelectorAll('[id^=' + mixinId + '-]');\n forEach.call(stateMixinsEls, function (el) {\n self.unregisterMixin(el.id);\n });\n });\n this.states.forEach(function (state) {\n newMixinsIds.forEach(function (id) {\n var mixinId = id + '-' + state;\n self.registerMixin(mixinId);\n });\n });\n }\n },\n\n getObject3D: {\n value: function (type) {\n return this.object3DMap[type];\n }\n },\n\n setObject3D: {\n value: function (type, obj) {\n var self = this;\n var oldObj = this.object3DMap[type];\n if (oldObj) { this.object3D.remove(oldObj); }\n if (obj instanceof THREE.Object3D) {\n obj.el = self;\n this.object3D.add(obj);\n if (obj.children.length) {\n obj.traverse(function bindEl (child) {\n child.el = self;\n });\n }\n }\n this.object3DMap[type] = obj;\n }\n },\n\n removeObject3D: {\n value: function (type) {\n this.setObject3D(type, null);\n }\n },\n\n /**\n * Gets or creates an object3D of a given type.\n\n * @param {string} type - Type of the object3D.\n * @param {string} Constructor - Constructor to use if need to create the object3D.\n * @type {Object}\n */\n getOrCreateObject3D: {\n value: function (type, Constructor) {\n var object3D = this.getObject3D(type);\n if (!object3D && Constructor) {\n object3D = new Constructor();\n this.setObject3D(type, object3D);\n }\n return object3D;\n }\n },\n /**\n * Add child entity.\n *\n * @param {Element} el - Child entity.\n */\n add: {\n value: function (el) {\n if (!el.object3D) {\n throw new Error(\"Trying to add an element that doesn't have an `object3D`\");\n }\n this.object3D.add(el.object3D);\n this.emit('child-attached', { el: el });\n }\n },\n\n /**\n * Tell parentNode to add this entity to itself.\n */\n addToParent: {\n value: function () {\n var parentNode = this.parentEl = this.parentNode;\n\n // `!parentNode` check primarily for unit tests.\n if (!parentNode || !parentNode.add || this.attachedToParent) { return; }\n\n parentNode.add(this);\n this.attachedToParent = true; // To prevent multiple attachments to same parent.\n }\n },\n\n load: {\n value: function () {\n var self = this;\n\n if (this.hasLoaded) { return; }\n\n ANode.prototype.load.call(this, entityLoadCallback);\n // Entity load.\n function entityLoadCallback () {\n self.updateComponents();\n if (self.isScene || self.parentEl.isPlaying) { self.play(); }\n }\n },\n writable: window.debug\n },\n\n /**\n * Remove child entity.\n *\n * @param {Element} el - Child entity.\n */\n remove: {\n value: function (el) {\n this.object3D.remove(el.object3D);\n }\n },\n\n /**\n * @returns {array} Direct children that are entities.\n */\n getChildEntities: {\n value: function () {\n var children = this.children;\n var childEntities = [];\n\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n if (child instanceof AEntity) {\n childEntities.push(child);\n }\n }\n\n return childEntities;\n }\n },\n\n /**\n * Initialize component.\n *\n * @param {string} attrName - Attribute name asociated to the component.\n * @param {object} data - Component data\n * @param {boolean} isDependency - True if the component is a dependency.\n */\n initComponent: {\n value: function (attrName, data, isDependency) {\n var component;\n var componentInfo = attrName.split(MULTIPLE_COMPONENT_DELIMITER);\n var componentId = componentInfo[1];\n var componentName = componentInfo[0];\n var isComponentDefined = checkComponentDefined(this, attrName) || data !== undefined;\n // Check if component is registered and whether component should be initialized.\n if (!components[componentName] ||\n (!isComponentDefined && !isDependency) ||\n // If component already initialized.\n (attrName in this.components)) {\n return;\n }\n\n // Initialize dependencies first\n this.initComponentDependencies(componentName);\n\n // If component name has an id we check component type multiplic\n if (componentId && !components[componentName].multiple) {\n throw new Error('Trying to initialize multiple ' +\n 'components of type `' + componentName +\n '`. There can only be one component of this type per entity.');\n }\n component = this.components[attrName] = new components[componentName].Component(\n this, data, componentId);\n if (this.isPlaying) { component.play(); }\n\n // Components are reflected in the DOM as attributes but the state is not shown\n // hence we set the attribute to empty string.\n // The flag justInitialized is for attributeChangedCallback to not overwrite\n // the component with the empty string.\n if (!this.hasAttribute(attrName)) {\n component.justInitialized = true;\n HTMLElement.prototype.setAttribute.call(this, attrName, '');\n }\n\n debug('Component initialized: %s', attrName);\n },\n writable: window.debug\n },\n\n initComponentDependencies: {\n value: function (name) {\n var self = this;\n var component = components[name];\n var dependencies;\n if (!component) { return; }\n dependencies = components[name].dependencies;\n if (!dependencies) { return; }\n dependencies.forEach(function (component) {\n self.initComponent(component, undefined, true);\n });\n }\n },\n\n removeComponent: {\n value: function (name) {\n var component = this.components[name];\n var isDefault = name in this.defaultComponents;\n var isMixedIn = isComponentMixedIn(name, this.mixinEls);\n // Don't remove default or mixed in components\n if (isDefault || isMixedIn) { return; }\n component.pause();\n component.remove();\n delete this.components[name];\n this.emit('componentremoved', { name: name });\n }\n },\n\n /**\n * Update all components.\n * Build data using defined attributes, mixins, and defaults.\n * Update default components before the rest.\n */\n updateComponents: {\n value: function () {\n var elComponents = {};\n var self = this;\n var i;\n if (!this.hasLoaded) { return; }\n\n // Gather entity-defined components.\n var attributes = this.attributes;\n for (i = 0; i < attributes.length; ++i) {\n addComponent(attributes[i].name);\n }\n\n // Gather mixin-defined components.\n getMixedInComponents(this).forEach(addComponent);\n\n // Set default components.\n Object.keys(this.defaultComponents).forEach(updateComponent);\n\n // Set rest of components.\n Object.keys(elComponents).forEach(updateComponent);\n\n /**\n * Add component to the list.\n */\n function addComponent (key) {\n var name = key.split(MULTIPLE_COMPONENT_DELIMITER)[0];\n if (!components[name]) { return; }\n elComponents[key] = true;\n }\n\n /**\n * Update component with given name.\n */\n function updateComponent (name) {\n var attrValue = self.getAttribute(name);\n delete elComponents[name];\n self.updateComponent(name, attrValue);\n }\n }\n },\n\n /**\n * Initialize, update, or remove a single component.\n *\n * When initializing, we set the component on `this.components`.\n *\n * @param {string} attr - Component name.\n * @param {object} attrValue - The value of the DOM attribute.\n */\n updateComponent: {\n value: function (attr, attrValue) {\n var component = this.components[attr];\n var isDefault = attr in this.defaultComponents;\n if (component) {\n if (attrValue === null && !isDefault) {\n this.removeComponent(attr);\n return;\n }\n // Component already initialized. Update component.\n component.updateProperties(attrValue);\n return;\n }\n // Component not yet initialized. Initialize component.\n this.initComponent(attr, attrValue, false);\n }\n },\n\n /**\n * Updates one property of the component\n *\n * @param {string} name - Component name\n * @param {string} property - Component property name\n * @param {any} propertyValue - New property value\n */\n updateComponentProperty: {\n value: function (name, property, propertyValue) {\n var component = this.components[name];\n // Cached attribute value\n var attrValue = component && component.attrValue;\n // Copy cached value\n var componentObj = attrValue ? utils.extend({}, attrValue) : {};\n componentObj[property] = propertyValue;\n this.updateComponent(name, componentObj);\n }\n },\n\n /**\n * If `attr` is a component name, removeAttribute detaches the component from the\n * entity.\n *\n * @param {string} attr - Attribute name, which could also be a component name.\n */\n removeAttribute: {\n value: function (attr) {\n var component = this.components[attr];\n if (component) {\n this.setEntityAttribute(attr, undefined, null);\n // The component might not be removed if it's a default one\n if (this.components[attr]) { return; }\n }\n HTMLElement.prototype.removeAttribute.call(this, attr);\n }\n },\n\n /**\n * Start dynamic behavior associated with entity such as dynamic components and animations.\n * Tell all children entities to also play.\n */\n play: {\n value: function () {\n var components = this.components;\n var componentKeys = Object.keys(components);\n\n // Already playing.\n if (this.isPlaying || !this.hasLoaded) { return; }\n this.isPlaying = true;\n\n // Wake up all components.\n componentKeys.forEach(function playComponent (key) {\n components[key].play();\n });\n\n // Tell all child entities to play.\n this.getChildEntities().forEach(function play (entity) {\n entity.play();\n });\n\n this.emit('play');\n },\n writable: true\n },\n\n /**\n * Pause dynamic behavior associated with entity such as dynamic components and animations.\n * Tell all children entities to also pause.\n */\n pause: {\n value: function () {\n var components = this.components;\n var componentKeys = Object.keys(components);\n\n if (!this.isPlaying) { return; }\n this.isPlaying = false;\n\n // Sleep all components.\n componentKeys.forEach(function pauseComponent (key) {\n components[key].pause();\n });\n\n // Tell all child entities to pause.\n this.getChildEntities().forEach(function pause (obj) {\n obj.pause();\n });\n\n this.emit('pause');\n },\n writable: true\n },\n\n /**\n * Deals with updates on entity-specific attributes (i.e., components and mixins).\n *\n * @param {string} attr\n * @param {string} oldVal\n * @param {string|object} newVal\n */\n setEntityAttribute: {\n value: function (attr, oldVal, newVal) {\n if (components[attr] || this.components[attr]) {\n this.updateComponent(attr, newVal);\n return;\n }\n if (attr === 'mixin') {\n this.mixinUpdate(newVal, oldVal);\n return;\n }\n }\n },\n\n mixinUpdate: {\n value: function (newMixins, oldMixins) {\n oldMixins = oldMixins || this.getAttribute('mixin');\n this.updateStateMixins(newMixins, oldMixins);\n this.updateComponents();\n }\n },\n\n /**\n * If attribute is a component, setAttribute will apply the value to the\n * existing component data, not replace it. Examples:\n *\n * Examples:\n *\n * setAttribute('id', 'my-element');\n * setAttribute('material', { color: 'crimson' });\n * setAttribute('material', 'color', 'crimson');\n *\n * @param {string} attr - Attribute name. setAttribute will initialize or update\n * a component if the name corresponds to a registered component.\n * @param {string|object} value - If a string, setAttribute will update the attribute or.\n * component. If an object, the value will be mixed into the component.\n * @param {string} componentPropValue - If defined, `value` will act as the property\n * name and setAttribute will only set a single component property.\n */\n setAttribute: {\n value: function (attr, value, componentPropValue) {\n var isDebugMode = this.sceneEl && this.sceneEl.getAttribute('debug');\n var componentName = attr.split(MULTIPLE_COMPONENT_DELIMITER)[0];\n if (components[componentName]) {\n // Just update one of the component properties\n if (typeof value === 'string' && componentPropValue !== undefined) {\n this.updateComponentProperty(attr, value, componentPropValue);\n } else {\n this.updateComponent(attr, value);\n }\n // On debug mode we write the component state to the DOM attributes\n if (isDebugMode) { this.components[attr].flushToDOM(); }\n return;\n }\n\n ANode.prototype.setAttribute.call(this, attr, value);\n if (attr === 'mixin') { this.mixinUpdate(value); }\n },\n writable: window.debug\n },\n\n /**\n * To make the DOM attributes reflect the state of the components.\n *\n * @param {bool} recursive - Call updateDOM on the children\n **/\n flushToDOM: {\n value: function (recursive) {\n var components = this.components;\n var children = this.children;\n var child;\n var i;\n Object.keys(components).forEach(updateDOMAtrribute);\n if (!recursive) { return; }\n for (i = 0; i < children.length; ++i) {\n child = children[i];\n if (!child.flushToDOM) { continue; }\n child.flushToDOM(recursive);\n }\n function updateDOMAtrribute (name) { components[name].flushToDOM(); }\n }\n },\n\n /**\n * If `attr` is a component, returns JUST the component data defined on the entity.\n * Like a partial version of `getComputedAttribute` as returned component data\n * does not include applied mixins or defaults.\n *\n * If `attr` is not a component, fall back to HTML getAttribute.\n *\n * @param {string} attr\n * @returns {object|string} Object if component, else string.\n */\n getAttribute: {\n value: function (attr) {\n // If cached value exists, return partial component data.\n var component = this.components[attr];\n if (component) { return component.attrValue; }\n return HTMLElement.prototype.getAttribute.call(this, attr);\n },\n writable: window.debug\n },\n\n /**\n * If `attr` is a component, returns ALL component data including applied mixins and\n * defaults.\n *\n * If `attr` is not a component, fall back to HTML getAttribute.\n *\n * @param {string} attr\n * @returns {object|string} Object if component, else string.\n */\n getComputedAttribute: {\n value: function (attr) {\n // If component, return component data.\n var component = this.components[attr];\n if (component) { return component.getData(); }\n return HTMLElement.prototype.getAttribute.call(this, attr);\n }\n },\n\n addState: {\n value: function (state) {\n if (this.is(state)) { return; }\n this.states.push(state);\n this.mapStateMixins(state, this.registerMixin.bind(this));\n this.emit('stateadded', {state: state});\n }\n },\n\n removeState: {\n value: function (state) {\n var stateIndex = this.states.indexOf(state);\n if (stateIndex === -1) { return; }\n this.states.splice(stateIndex, 1);\n this.mapStateMixins(state, this.unregisterMixin.bind(this));\n this.emit('stateremoved', {state: state});\n }\n },\n\n /**\n * Checks if the element is in a given state. e.g. el.is('alive');\n * @type {string} state - Name of the state we want to check\n */\n is: {\n value: function (state) {\n return this.states.indexOf(state) !== -1;\n }\n }\n});\n\n/**\n * Check if a component is *defined* for an entity, including defaults and mixins.\n * Does not check whether the component has been *initialized* for an entity.\n *\n * @param {string} el - Entity.\n * @param {string} name - Component name.\n * @returns {boolean}\n */\nfunction checkComponentDefined (el, name) {\n // Check if default components contain the component.\n if (el.defaultComponents[name] !== undefined) { return true; }\n\n // Check if element contains the component.\n if (el.components[name] && el.components[name].attrValue) { return true; }\n\n return isComponentMixedIn(name, el.mixinEls);\n}\n\nfunction getMixedInComponents (entityEl) {\n var components = [];\n entityEl.mixinEls.forEach(function getMixedComponents (mixinEl) {\n Object.keys(mixinEl.componentCache).forEach(addComponent);\n function addComponent (key) {\n components.push(key);\n }\n });\n return components;\n}\n\n/**\n * Check if any mixins contains a component.\n *\n * @param {string} name - Component name.\n * @param {array} mixinEls - Array of s.\n */\nfunction isComponentMixedIn (name, mixinEls) {\n var i;\n var inMixin = false;\n for (i = 0; i < mixinEls.length; ++i) {\n inMixin = mixinEls[i].hasAttribute(name);\n if (inMixin) { break; }\n }\n return inMixin;\n}\n\nAEntity = registerElement('a-entity', {\n prototype: proto\n});\nmodule.exports = AEntity;\n","var ANode = require('./a-node');\nvar debug = require('../utils/debug');\nvar registerElement = require('./a-register-element').registerElement;\nvar THREE = require('../lib/three');\n\nvar xhrLoader = new THREE.XHRLoader();\nvar warn = debug('core:a-assets:warn');\n\n/**\n * Asset management system. Handles blocking on asset loading.\n */\nmodule.exports = registerElement('a-assets', {\n prototype: Object.create(ANode.prototype, {\n createdCallback: {\n value: function () {\n this.isAssets = true;\n }\n },\n\n attachedCallback: {\n value: function () {\n var self = this;\n var i;\n var loaded = [];\n var mediaEl;\n var mediaEls;\n var imgEl;\n var imgEls;\n var timeout;\n\n if (!this.parentNode.isScene) {\n throw new Error(' must be a child of a .');\n }\n\n // Wait for s.\n imgEls = this.querySelectorAll('img');\n for (i = 0; i < imgEls.length; i++) {\n imgEl = setCrossOrigin(imgEls[i]);\n loaded.push(new Promise(function (resolve, reject) {\n imgEl.onload = resolve;\n imgEl.onerror = reject;\n }));\n }\n\n // Wait for